X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/ca92fe3359ce2a751763b1bb0bfe824a89b20853..1e78b1e4d264674be20e5517c1e218608a623743:/vendor/assets/iD/iD.js diff --git a/vendor/assets/iD/iD.js b/vendor/assets/iD/iD.js index 6cc200808..088e252a2 100644 --- a/vendor/assets/iD/iD.js +++ b/vendor/assets/iD/iD.js @@ -1,5053 +1,6776 @@ (function () { + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; - function createCommonjsModule(fn, basedir, module) { - return module = { - path: basedir, - exports: {}, - require: function (path, base) { - return commonjsRequire(path, (base === undefined || base === null) ? module.path : base); - } - }, fn(module, module.exports), module.exports; - } + var check = function (it) { + return it && it.Math == Math && it; + }; - function getCjsExportFromNamespace (n) { - return n && n['default'] || n; - } + // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 + var global$1o = + // eslint-disable-next-line es/no-global-this -- safe + check(typeof globalThis == 'object' && globalThis) || + check(typeof window == 'object' && window) || + // eslint-disable-next-line no-restricted-globals -- safe + check(typeof self == 'object' && self) || + check(typeof commonjsGlobal == 'object' && commonjsGlobal) || + // eslint-disable-next-line no-new-func -- fallback + (function () { return this; })() || Function('return this')(); - function commonjsRequire () { - throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs'); - } + var objectGetOwnPropertyDescriptor = {}; - var isImplemented = function () { - var set, iterator, result; - if (typeof Set !== 'function') { return false; } - set = new Set(['raz', 'dwa', 'trzy']); - if (String(set) !== '[object Set]') { return false; } - if (set.size !== 3) { return false; } - if (typeof set.add !== 'function') { return false; } - if (typeof set.clear !== 'function') { return false; } - if (typeof set.delete !== 'function') { return false; } - if (typeof set.entries !== 'function') { return false; } - if (typeof set.forEach !== 'function') { return false; } - if (typeof set.has !== 'function') { return false; } - if (typeof set.keys !== 'function') { return false; } - if (typeof set.values !== 'function') { return false; } + var fails$V = function (exec) { + try { + return !!exec(); + } catch (error) { + return true; + } + }; - iterator = set.values(); - result = iterator.next(); - if (result.done !== false) { return false; } - if (result.value !== 'raz') { return false; } + var fails$U = fails$V; - return true; - }; + // Detect IE8's incomplete defineProperty implementation + var descriptors = !fails$U(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7; + }); - // eslint-disable-next-line no-empty-function - var noop = function () {}; + var fails$T = fails$V; - var _undefined = noop(); // Support ES3 engines + var functionBindNative = !fails$T(function () { + var test = (function () { /* empty */ }).bind(); + // eslint-disable-next-line no-prototype-builtins -- safe + return typeof test != 'function' || test.hasOwnProperty('prototype'); + }); - var isValue = function (val) { return val !== _undefined && val !== null; }; + var NATIVE_BIND$4 = functionBindNative; - var validValue = function (value) { - if (!isValue(value)) { throw new TypeError("Cannot use null or undefined"); } - return value; - }; + var call$q = Function.prototype.call; - var clear = function () { - validValue(this).length = 0; - return this; + var functionCall = NATIVE_BIND$4 ? call$q.bind(call$q) : function () { + return call$q.apply(call$q, arguments); }; - var isImplemented$1 = function () { - var numberIsNaN = Number.isNaN; - if (typeof numberIsNaN !== "function") { return false; } - return !numberIsNaN({}) && numberIsNaN(NaN) && !numberIsNaN(34); - }; + var objectPropertyIsEnumerable = {}; - var shim = function (value) { - // eslint-disable-next-line no-self-compare - return value !== value; - }; + var $propertyIsEnumerable$2 = {}.propertyIsEnumerable; + // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe + var getOwnPropertyDescriptor$5 = Object.getOwnPropertyDescriptor; - var isNan = isImplemented$1() ? Number.isNaN : shim; + // Nashorn ~ JDK8 bug + var NASHORN_BUG = getOwnPropertyDescriptor$5 && !$propertyIsEnumerable$2.call({ 1: 2 }, 1); - var isImplemented$2 = function () { - var sign = Math.sign; - if (typeof sign !== "function") { return false; } - return sign(10) === 1 && sign(-20) === -1; + // `Object.prototype.propertyIsEnumerable` method implementation + // https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable + objectPropertyIsEnumerable.f = NASHORN_BUG ? function propertyIsEnumerable(V) { + var descriptor = getOwnPropertyDescriptor$5(this, V); + return !!descriptor && descriptor.enumerable; + } : $propertyIsEnumerable$2; + + var createPropertyDescriptor$7 = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; }; - var shim$1 = function (value) { - value = Number(value); - if (isNaN(value) || value === 0) { return value; } - return value > 0 ? 1 : -1; + var NATIVE_BIND$3 = functionBindNative; + + var FunctionPrototype$3 = Function.prototype; + var bind$g = FunctionPrototype$3.bind; + var call$p = FunctionPrototype$3.call; + var uncurryThis$Y = NATIVE_BIND$3 && bind$g.bind(call$p, call$p); + + var functionUncurryThis = NATIVE_BIND$3 ? function (fn) { + return fn && uncurryThis$Y(fn); + } : function (fn) { + return fn && function () { + return call$p.apply(fn, arguments); + }; }; - var sign = isImplemented$2() ? Math.sign : shim$1; + var uncurryThis$X = functionUncurryThis; - var abs = Math.abs - , floor = Math.floor; + var toString$n = uncurryThis$X({}.toString); + var stringSlice$c = uncurryThis$X(''.slice); - var toInteger = function (value) { - if (isNaN(value)) { return 0; } - value = Number(value); - if (value === 0 || !isFinite(value)) { return value; } - return sign(value) * floor(abs(value)); + var classofRaw$1 = function (it) { + return stringSlice$c(toString$n(it), 8, -1); }; - var max = Math.max; + var global$1n = global$1o; + var uncurryThis$W = functionUncurryThis; + var fails$S = fails$V; + var classof$e = classofRaw$1; - var toPosInteger = function (value) { return max(0, toInteger(value)); }; + var Object$5 = global$1n.Object; + var split$4 = uncurryThis$W(''.split); - var indexOf = Array.prototype.indexOf - , objHasOwnProperty = Object.prototype.hasOwnProperty - , abs$1 = Math.abs - , floor$1 = Math.floor; + // fallback for non-array-like ES3 and non-enumerable old V8 strings + var indexedObject = fails$S(function () { + // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 + // eslint-disable-next-line no-prototype-builtins -- safe + return !Object$5('z').propertyIsEnumerable(0); + }) ? function (it) { + return classof$e(it) == 'String' ? split$4(it, '') : Object$5(it); + } : Object$5; - var eIndexOf = function (searchElement/*, fromIndex*/) { - var i, length, fromIndex, val; - if (!isNan(searchElement)) { return indexOf.apply(this, arguments); } + var global$1m = global$1o; - length = toPosInteger(validValue(this).length); - fromIndex = arguments[1]; - if (isNaN(fromIndex)) { fromIndex = 0; } - else if (fromIndex >= 0) { fromIndex = floor$1(fromIndex); } - else { fromIndex = toPosInteger(this.length) - floor$1(abs$1(fromIndex)); } + var TypeError$p = global$1m.TypeError; - for (i = fromIndex; i < length; ++i) { - if (objHasOwnProperty.call(this, i)) { - val = this[i]; - if (isNan(val)) { return i; } // Jslint: ignore - } - } - return -1; + // `RequireObjectCoercible` abstract operation + // https://tc39.es/ecma262/#sec-requireobjectcoercible + var requireObjectCoercible$e = function (it) { + if (it == undefined) throw TypeError$p("Can't call method on " + it); + return it; }; - var create = Object.create, getPrototypeOf = Object.getPrototypeOf, plainObject = {}; + // toObject with fallback for non-array-like ES3 strings + var IndexedObject$4 = indexedObject; + var requireObjectCoercible$d = requireObjectCoercible$e; - var isImplemented$3 = function (/* CustomCreate*/) { - var setPrototypeOf = Object.setPrototypeOf, customCreate = arguments[0] || create; - if (typeof setPrototypeOf !== "function") { return false; } - return getPrototypeOf(setPrototypeOf(customCreate(null), plainObject)) === plainObject; + var toIndexedObject$d = function (it) { + return IndexedObject$4(requireObjectCoercible$d(it)); }; - var map = { function: true, object: true }; - - var isObject = function (value) { return (isValue(value) && map[typeof value]) || false; }; - - var create$1 = Object.create, shim$2; - - if (!isImplemented$3()) { - shim$2 = shim$3; - } - - var create_1 = (function () { - var nullObject, polyProps, desc; - if (!shim$2) { return create$1; } - if (shim$2.level !== 1) { return create$1; } - - nullObject = {}; - polyProps = {}; - desc = { configurable: false, enumerable: false, writable: true, value: undefined }; - Object.getOwnPropertyNames(Object.prototype).forEach(function (name) { - if (name === "__proto__") { - polyProps[name] = { - configurable: true, - enumerable: false, - writable: true, - value: undefined - }; - return; - } - polyProps[name] = desc; - }); - Object.defineProperties(nullObject, polyProps); - - Object.defineProperty(shim$2, "nullPolyfill", { - configurable: false, - enumerable: false, - writable: false, - value: nullObject - }); - - return function (prototype, props) { - return create$1(prototype === null ? nullObject : prototype, props); - }; - })(); + // `IsCallable` abstract operation + // https://tc39.es/ecma262/#sec-iscallable + var isCallable$r = function (argument) { + return typeof argument == 'function'; + }; - var objIsPrototypeOf = Object.prototype.isPrototypeOf - , defineProperty = Object.defineProperty - , nullDesc = { configurable: true, enumerable: false, writable: true, value: undefined } - , validate; + var isCallable$q = isCallable$r; - validate = function (obj, prototype) { - validValue(obj); - if (prototype === null || isObject(prototype)) { return obj; } - throw new TypeError("Prototype must be null or an object"); + var isObject$s = function (it) { + return typeof it == 'object' ? it !== null : isCallable$q(it); }; - var shim$3 = (function (status) { - var fn, set; - if (!status) { return null; } - if (status.level === 2) { - if (status.set) { - set = status.set; - fn = function (obj, prototype) { - set.call(validate(obj, prototype), prototype); - return obj; - }; - } else { - fn = function (obj, prototype) { - validate(obj, prototype).__proto__ = prototype; - return obj; - }; - } - } else { - fn = function self(obj, prototype) { - var isNullBase; - validate(obj, prototype); - isNullBase = objIsPrototypeOf.call(self.nullPolyfill, obj); - if (isNullBase) { delete self.nullPolyfill.__proto__; } - if (prototype === null) { prototype = self.nullPolyfill; } - obj.__proto__ = prototype; - if (isNullBase) { defineProperty(self.nullPolyfill, "__proto__", nullDesc); } - return obj; - }; - } - return Object.defineProperty(fn, "level", { - configurable: false, - enumerable: false, - writable: false, - value: status.level - }); - })( - (function () { - var tmpObj1 = Object.create(null) - , tmpObj2 = {} - , set - , desc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__"); - - if (desc) { - try { - set = desc.set; // Opera crashes at this point - set.call(tmpObj1, tmpObj2); - } catch (ignore) {} - if (Object.getPrototypeOf(tmpObj1) === tmpObj2) { return { set: set, level: 2 }; } - } - - tmpObj1.__proto__ = tmpObj2; - if (Object.getPrototypeOf(tmpObj1) === tmpObj2) { return { level: 2 }; } - - tmpObj1 = {}; - tmpObj1.__proto__ = tmpObj2; - if (Object.getPrototypeOf(tmpObj1) === tmpObj2) { return { level: 1 }; } - - return false; - })() - ); - - var setPrototypeOf = isImplemented$3() ? Object.setPrototypeOf : shim$3; - - var validCallable = function (fn) { - if (typeof fn !== "function") { throw new TypeError(fn + " is not a function"); } - return fn; + var global$1l = global$1o; + var isCallable$p = isCallable$r; + + var aFunction = function (argument) { + return isCallable$p(argument) ? argument : undefined; }; - // ES3 safe - var _undefined$1 = void 0; + var getBuiltIn$b = function (namespace, method) { + return arguments.length < 2 ? aFunction(global$1l[namespace]) : global$1l[namespace] && global$1l[namespace][method]; + }; - var is = function (value) { return value !== _undefined$1 && value !== null; }; + var uncurryThis$V = functionUncurryThis; - // prettier-ignore - var possibleTypes = { "object": true, "function": true, "undefined": true /* document.all */ }; + var objectIsPrototypeOf = uncurryThis$V({}.isPrototypeOf); - var is$1 = function (value) { - if (!is(value)) { return false; } - return hasOwnProperty.call(possibleTypes, typeof value); - }; + var getBuiltIn$a = getBuiltIn$b; - var is$2 = function (value) { - if (!is$1(value)) { return false; } - try { - if (!value.constructor) { return false; } - return value.constructor.prototype === value; - } catch (error) { - return false; - } - }; + var engineUserAgent = getBuiltIn$a('navigator', 'userAgent') || ''; - var is$3 = function (value) { - if (typeof value !== "function") { return false; } + var global$1k = global$1o; + var userAgent$7 = engineUserAgent; - if (!hasOwnProperty.call(value, "length")) { return false; } + var process$4 = global$1k.process; + var Deno = global$1k.Deno; + var versions = process$4 && process$4.versions || Deno && Deno.version; + var v8 = versions && versions.v8; + var match, version$1; - try { - if (typeof value.length !== "number") { return false; } - if (typeof value.call !== "function") { return false; } - if (typeof value.apply !== "function") { return false; } - } catch (error) { - return false; - } + if (v8) { + match = v8.split('.'); + // in old Chrome, versions of V8 isn't V8 = Chrome / 10 + // but their correct versions are not interesting for us + version$1 = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]); + } - return !is$2(value); - }; + // BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0` + // so check `userAgent` even if `.v8` exists, but 0 + if (!version$1 && userAgent$7) { + match = userAgent$7.match(/Edge\/(\d+)/); + if (!match || match[1] >= 74) { + match = userAgent$7.match(/Chrome\/(\d+)/); + if (match) version$1 = +match[1]; + } + } - var classRe = /^\s*class[\s{/}]/, functionToString = Function.prototype.toString; + var engineV8Version = version$1; - var is$4 = function (value) { - if (!is$3(value)) { return false; } - if (classRe.test(functionToString.call(value))) { return false; } - return true; - }; + /* eslint-disable es/no-symbol -- required for testing */ - var isImplemented$4 = function () { - var assign = Object.assign, obj; - if (typeof assign !== "function") { return false; } - obj = { foo: "raz" }; - assign(obj, { bar: "dwa" }, { trzy: "trzy" }); - return obj.foo + obj.bar + obj.trzy === "razdwatrzy"; - }; + var V8_VERSION$3 = engineV8Version; + var fails$R = fails$V; - var isImplemented$5 = function () { - try { - Object.keys("primitive"); - return true; - } catch (e) { - return false; - } - }; + // eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing + var nativeSymbol = !!Object.getOwnPropertySymbols && !fails$R(function () { + var symbol = Symbol(); + // Chrome 38 Symbol has incorrect toString conversion + // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances + return !String(symbol) || !(Object(symbol) instanceof Symbol) || + // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances + !Symbol.sham && V8_VERSION$3 && V8_VERSION$3 < 41; + }); - var keys = Object.keys; + /* eslint-disable es/no-symbol -- required for testing */ - var shim$4 = function (object) { return keys(isValue(object) ? Object(object) : object); }; + var NATIVE_SYMBOL$3 = nativeSymbol; - var keys$1 = isImplemented$5() ? Object.keys : shim$4; + var useSymbolAsUid = NATIVE_SYMBOL$3 + && !Symbol.sham + && typeof Symbol.iterator == 'symbol'; - var max$1 = Math.max; + var global$1j = global$1o; + var getBuiltIn$9 = getBuiltIn$b; + var isCallable$o = isCallable$r; + var isPrototypeOf$9 = objectIsPrototypeOf; + var USE_SYMBOL_AS_UID$1 = useSymbolAsUid; - var shim$5 = function (dest, src/*, …srcn*/) { - var arguments$1 = arguments; + var Object$4 = global$1j.Object; - var error, i, length = max$1(arguments.length, 2), assign; - dest = Object(validValue(dest)); - assign = function (key) { - try { - dest[key] = src[key]; - } catch (e) { - if (!error) { error = e; } - } - }; - for (i = 1; i < length; ++i) { - src = arguments$1[i]; - keys$1(src).forEach(assign); - } - if (error !== undefined) { throw error; } - return dest; + var isSymbol$6 = USE_SYMBOL_AS_UID$1 ? function (it) { + return typeof it == 'symbol'; + } : function (it) { + var $Symbol = getBuiltIn$9('Symbol'); + return isCallable$o($Symbol) && isPrototypeOf$9($Symbol.prototype, Object$4(it)); }; - var assign = isImplemented$4() ? Object.assign : shim$5; + var global$1i = global$1o; - var forEach = Array.prototype.forEach, create$2 = Object.create; + var String$6 = global$1i.String; - var process$1 = function (src, obj) { - var key; - for (key in src) { obj[key] = src[key]; } + var tryToString$5 = function (argument) { + try { + return String$6(argument); + } catch (error) { + return 'Object'; + } }; - // eslint-disable-next-line no-unused-vars - var normalizeOptions = function (opts1/*, …options*/) { - var result = create$2(null); - forEach.call(arguments, function (options) { - if (!isValue(options)) { return; } - process$1(Object(options), result); - }); - return result; - }; + var global$1h = global$1o; + var isCallable$n = isCallable$r; + var tryToString$4 = tryToString$5; - var str = "razdwatrzy"; + var TypeError$o = global$1h.TypeError; - var isImplemented$6 = function () { - if (typeof str.contains !== "function") { return false; } - return str.contains("dwa") === true && str.contains("foo") === false; + // `Assert: IsCallable(argument) is true` + var aCallable$a = function (argument) { + if (isCallable$n(argument)) return argument; + throw TypeError$o(tryToString$4(argument) + ' is not a function'); }; - var indexOf$1 = String.prototype.indexOf; + var aCallable$9 = aCallable$a; - var shim$6 = function (searchString/*, position*/) { - return indexOf$1.call(this, searchString, arguments[1]) > -1; + // `GetMethod` abstract operation + // https://tc39.es/ecma262/#sec-getmethod + var getMethod$7 = function (V, P) { + var func = V[P]; + return func == null ? undefined : aCallable$9(func); }; - var contains = isImplemented$6() ? String.prototype.contains : shim$6; + var global$1g = global$1o; + var call$o = functionCall; + var isCallable$m = isCallable$r; + var isObject$r = isObject$s; + + var TypeError$n = global$1g.TypeError; - var d_1 = createCommonjsModule(function (module) { + // `OrdinaryToPrimitive` abstract operation + // https://tc39.es/ecma262/#sec-ordinarytoprimitive + var ordinaryToPrimitive$1 = function (input, pref) { + var fn, val; + if (pref === 'string' && isCallable$m(fn = input.toString) && !isObject$r(val = call$o(fn, input))) return val; + if (isCallable$m(fn = input.valueOf) && !isObject$r(val = call$o(fn, input))) return val; + if (pref !== 'string' && isCallable$m(fn = input.toString) && !isObject$r(val = call$o(fn, input))) return val; + throw TypeError$n("Can't convert object to primitive value"); + }; + var shared$5 = {exports: {}}; + var isPure = false; - var d = (module.exports = function (dscr, value/*, options*/) { - var c, e, w, options, desc; - if (arguments.length < 2 || typeof dscr !== "string") { - options = value; - value = dscr; - dscr = null; - } else { - options = arguments[2]; - } - if (is(dscr)) { - c = contains.call(dscr, "c"); - e = contains.call(dscr, "e"); - w = contains.call(dscr, "w"); - } else { - c = w = true; - e = false; - } + var global$1f = global$1o; - desc = { value: value, configurable: c, enumerable: e, writable: w }; - return !options ? desc : assign(normalizeOptions(options), desc); - }); + // eslint-disable-next-line es/no-object-defineproperty -- safe + var defineProperty$d = Object.defineProperty; - d.gs = function (dscr, get, set/*, options*/) { - var c, e, options, desc; - if (typeof dscr !== "string") { - options = set; - set = get; - get = dscr; - dscr = null; - } else { - options = arguments[3]; - } - if (!is(get)) { - get = undefined; - } else if (!is$4(get)) { - options = get; - get = set = undefined; - } else if (!is(set)) { - set = undefined; - } else if (!is$4(set)) { - options = set; - set = undefined; - } - if (is(dscr)) { - c = contains.call(dscr, "c"); - e = contains.call(dscr, "e"); - } else { - c = true; - e = false; - } - - desc = { get: get, set: set, configurable: c, enumerable: e }; - return !options ? desc : assign(normalizeOptions(options), desc); + var setGlobal$3 = function (key, value) { + try { + defineProperty$d(global$1f, key, { value: value, configurable: true, writable: true }); + } catch (error) { + global$1f[key] = value; + } return value; }; - }); - var eventEmitter = createCommonjsModule(function (module, exports) { + var global$1e = global$1o; + var setGlobal$2 = setGlobal$3; - var apply = Function.prototype.apply, call = Function.prototype.call - , create = Object.create, defineProperty = Object.defineProperty - , defineProperties = Object.defineProperties - , hasOwnProperty = Object.prototype.hasOwnProperty - , descriptor = { configurable: true, enumerable: false, writable: true } + var SHARED = '__core-js_shared__'; + var store$4 = global$1e[SHARED] || setGlobal$2(SHARED, {}); - , on, once, off, emit, methods, descriptors, base; + var sharedStore = store$4; - on = function (type, listener) { - var data; + var store$3 = sharedStore; - validCallable(listener); + (shared$5.exports = function (key, value) { + return store$3[key] || (store$3[key] = value !== undefined ? value : {}); + })('versions', []).push({ + version: '3.21.0', + mode: 'global', + copyright: '© 2014-2022 Denis Pushkarev (zloirock.ru)', + license: 'https://github.com/zloirock/core-js/blob/v3.21.0/LICENSE', + source: 'https://github.com/zloirock/core-js' + }); + + var global$1d = global$1o; + var requireObjectCoercible$c = requireObjectCoercible$e; - if (!hasOwnProperty.call(this, '__ee__')) { - data = descriptor.value = create(null); - defineProperty(this, '__ee__', descriptor); - descriptor.value = null; - } else { - data = this.__ee__; - } - if (!data[type]) { data[type] = listener; } - else if (typeof data[type] === 'object') { data[type].push(listener); } - else { data[type] = [data[type], listener]; } + var Object$3 = global$1d.Object; - return this; + // `ToObject` abstract operation + // https://tc39.es/ecma262/#sec-toobject + var toObject$i = function (argument) { + return Object$3(requireObjectCoercible$c(argument)); }; - once = function (type, listener) { - var once, self; + var uncurryThis$U = functionUncurryThis; + var toObject$h = toObject$i; - validCallable(listener); - self = this; - on.call(this, type, once = function () { - off.call(self, type, once); - apply.call(listener, this, arguments); - }); + var hasOwnProperty$3 = uncurryThis$U({}.hasOwnProperty); - once.__eeOnceListener__ = listener; - return this; + // `HasOwnProperty` abstract operation + // https://tc39.es/ecma262/#sec-hasownproperty + var hasOwnProperty_1 = Object.hasOwn || function hasOwn(it, key) { + return hasOwnProperty$3(toObject$h(it), key); }; - off = function (type, listener) { - var data, listeners, candidate, i; - - validCallable(listener); - - if (!hasOwnProperty.call(this, '__ee__')) { return this; } - data = this.__ee__; - if (!data[type]) { return this; } - listeners = data[type]; - - if (typeof listeners === 'object') { - for (i = 0; (candidate = listeners[i]); ++i) { - if ((candidate === listener) || - (candidate.__eeOnceListener__ === listener)) { - if (listeners.length === 2) { data[type] = listeners[i ? 0 : 1]; } - else { listeners.splice(i, 1); } - } - } - } else { - if ((listeners === listener) || - (listeners.__eeOnceListener__ === listener)) { - delete data[type]; - } - } - - return this; - }; + var uncurryThis$T = functionUncurryThis; - emit = function (type) { - var arguments$1 = arguments; - - var i, l, listener, listeners, args; - - if (!hasOwnProperty.call(this, '__ee__')) { return; } - listeners = this.__ee__[type]; - if (!listeners) { return; } - - if (typeof listeners === 'object') { - l = arguments.length; - args = new Array(l - 1); - for (i = 1; i < l; ++i) { args[i - 1] = arguments$1[i]; } - - listeners = listeners.slice(); - for (i = 0; (listener = listeners[i]); ++i) { - apply.call(listener, this, args); - } - } else { - switch (arguments.length) { - case 1: - call.call(listeners, this); - break; - case 2: - call.call(listeners, this, arguments[1]); - break; - case 3: - call.call(listeners, this, arguments[1], arguments[2]); - break; - default: - l = arguments.length; - args = new Array(l - 1); - for (i = 1; i < l; ++i) { - args[i - 1] = arguments$1[i]; - } - apply.call(listeners, this, args); - } - } - }; + var id$2 = 0; + var postfix = Math.random(); + var toString$m = uncurryThis$T(1.0.toString); - methods = { - on: on, - once: once, - off: off, - emit: emit + var uid$5 = function (key) { + return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString$m(++id$2 + postfix, 36); }; - descriptors = { - on: d_1(on), - once: d_1(once), - off: d_1(off), - emit: d_1(emit) - }; + var global$1c = global$1o; + var shared$4 = shared$5.exports; + var hasOwn$l = hasOwnProperty_1; + var uid$4 = uid$5; + var NATIVE_SYMBOL$2 = nativeSymbol; + var USE_SYMBOL_AS_UID = useSymbolAsUid; - base = defineProperties({}, descriptors); + var WellKnownSymbolsStore$1 = shared$4('wks'); + var Symbol$3 = global$1c.Symbol; + var symbolFor = Symbol$3 && Symbol$3['for']; + var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol$3 : Symbol$3 && Symbol$3.withoutSetter || uid$4; - module.exports = exports = function (o) { - return (o == null) ? create(base) : defineProperties(Object(o), descriptors); + var wellKnownSymbol$t = function (name) { + if (!hasOwn$l(WellKnownSymbolsStore$1, name) || !(NATIVE_SYMBOL$2 || typeof WellKnownSymbolsStore$1[name] == 'string')) { + var description = 'Symbol.' + name; + if (NATIVE_SYMBOL$2 && hasOwn$l(Symbol$3, name)) { + WellKnownSymbolsStore$1[name] = Symbol$3[name]; + } else if (USE_SYMBOL_AS_UID && symbolFor) { + WellKnownSymbolsStore$1[name] = symbolFor(description); + } else { + WellKnownSymbolsStore$1[name] = createWellKnownSymbol(description); + } + } return WellKnownSymbolsStore$1[name]; }; - exports.methods = methods; - }); - var validTypes = { object: true, symbol: true }; + var global$1b = global$1o; + var call$n = functionCall; + var isObject$q = isObject$s; + var isSymbol$5 = isSymbol$6; + var getMethod$6 = getMethod$7; + var ordinaryToPrimitive = ordinaryToPrimitive$1; + var wellKnownSymbol$s = wellKnownSymbol$t; - var isImplemented$7 = function () { - var symbol; - if (typeof Symbol !== 'function') { return false; } - symbol = Symbol('test symbol'); - try { String(symbol); } catch (e) { return false; } + var TypeError$m = global$1b.TypeError; + var TO_PRIMITIVE$1 = wellKnownSymbol$s('toPrimitive'); - // Return 'true' also for polyfills - if (!validTypes[typeof Symbol.iterator]) { return false; } - if (!validTypes[typeof Symbol.toPrimitive]) { return false; } - if (!validTypes[typeof Symbol.toStringTag]) { return false; } - - return true; + // `ToPrimitive` abstract operation + // https://tc39.es/ecma262/#sec-toprimitive + var toPrimitive$3 = function (input, pref) { + if (!isObject$q(input) || isSymbol$5(input)) return input; + var exoticToPrim = getMethod$6(input, TO_PRIMITIVE$1); + var result; + if (exoticToPrim) { + if (pref === undefined) pref = 'default'; + result = call$n(exoticToPrim, input, pref); + if (!isObject$q(result) || isSymbol$5(result)) return result; + throw TypeError$m("Can't convert object to primitive value"); + } + if (pref === undefined) pref = 'number'; + return ordinaryToPrimitive(input, pref); }; - var isSymbol = function (x) { - if (!x) { return false; } - if (typeof x === 'symbol') { return true; } - if (!x.constructor) { return false; } - if (x.constructor.name !== 'Symbol') { return false; } - return (x[x.constructor.toStringTag] === 'Symbol'); - }; + var toPrimitive$2 = toPrimitive$3; + var isSymbol$4 = isSymbol$6; - var validateSymbol = function (value) { - if (!isSymbol(value)) { throw new TypeError(value + " is not a symbol"); } - return value; + // `ToPropertyKey` abstract operation + // https://tc39.es/ecma262/#sec-topropertykey + var toPropertyKey$5 = function (argument) { + var key = toPrimitive$2(argument, 'string'); + return isSymbol$4(key) ? key : key + ''; }; - var create$3 = Object.create, defineProperties = Object.defineProperties - , defineProperty$1 = Object.defineProperty, objPrototype = Object.prototype - , NativeSymbol, SymbolPolyfill, HiddenSymbol, globalSymbols = create$3(null) - , isNativeSafe; - - if (typeof Symbol === 'function') { - NativeSymbol = Symbol; - try { - String(NativeSymbol()); - isNativeSafe = true; - } catch (ignore) {} - } - - var generateName = (function () { - var created = create$3(null); - return function (desc) { - var postfix = 0, name, ie11BugWorkaround; - while (created[desc + (postfix || '')]) { ++postfix; } - desc += (postfix || ''); - created[desc] = true; - name = '@@' + desc; - defineProperty$1(objPrototype, name, d_1.gs(null, function (value) { - // For IE11 issue see: - // https://connect.microsoft.com/IE/feedbackdetail/view/1928508/ - // ie11-broken-getters-on-dom-objects - // https://github.com/medikoo/es6-symbol/issues/12 - if (ie11BugWorkaround) { return; } - ie11BugWorkaround = true; - defineProperty$1(this, name, d_1(value)); - ie11BugWorkaround = false; - })); - return name; - }; - }()); - - // Internal constructor (not one exposed) for creating Symbol instances. - // This one is used to ensure that `someSymbol instanceof Symbol` always return false - HiddenSymbol = function Symbol(description) { - if (this instanceof HiddenSymbol) { throw new TypeError('Symbol is not a constructor'); } - return SymbolPolyfill(description); - }; + var global$1a = global$1o; + var isObject$p = isObject$s; + + var document$3 = global$1a.document; + // typeof document.createElement is 'object' in old IE + var EXISTS$1 = isObject$p(document$3) && isObject$p(document$3.createElement); - // Exposed `Symbol` constructor - // (returns instances of HiddenSymbol) - var polyfill = SymbolPolyfill = function Symbol(description) { - var symbol; - if (this instanceof Symbol) { throw new TypeError('Symbol is not a constructor'); } - if (isNativeSafe) { return NativeSymbol(description); } - symbol = create$3(HiddenSymbol.prototype); - description = (description === undefined ? '' : String(description)); - return defineProperties(symbol, { - __description__: d_1('', description), - __name__: d_1('', generateName(description)) - }); + var documentCreateElement$2 = function (it) { + return EXISTS$1 ? document$3.createElement(it) : {}; }; - defineProperties(SymbolPolyfill, { - for: d_1(function (key) { - if (globalSymbols[key]) { return globalSymbols[key]; } - return (globalSymbols[key] = SymbolPolyfill(String(key))); - }), - keyFor: d_1(function (s) { - var key; - validateSymbol(s); - for (key in globalSymbols) { if (globalSymbols[key] === s) { return key; } } - }), - - // To ensure proper interoperability with other native functions (e.g. Array.from) - // fallback to eventual native implementation of given symbol - hasInstance: d_1('', (NativeSymbol && NativeSymbol.hasInstance) || SymbolPolyfill('hasInstance')), - isConcatSpreadable: d_1('', (NativeSymbol && NativeSymbol.isConcatSpreadable) || - SymbolPolyfill('isConcatSpreadable')), - iterator: d_1('', (NativeSymbol && NativeSymbol.iterator) || SymbolPolyfill('iterator')), - match: d_1('', (NativeSymbol && NativeSymbol.match) || SymbolPolyfill('match')), - replace: d_1('', (NativeSymbol && NativeSymbol.replace) || SymbolPolyfill('replace')), - search: d_1('', (NativeSymbol && NativeSymbol.search) || SymbolPolyfill('search')), - species: d_1('', (NativeSymbol && NativeSymbol.species) || SymbolPolyfill('species')), - split: d_1('', (NativeSymbol && NativeSymbol.split) || SymbolPolyfill('split')), - toPrimitive: d_1('', (NativeSymbol && NativeSymbol.toPrimitive) || SymbolPolyfill('toPrimitive')), - toStringTag: d_1('', (NativeSymbol && NativeSymbol.toStringTag) || SymbolPolyfill('toStringTag')), - unscopables: d_1('', (NativeSymbol && NativeSymbol.unscopables) || SymbolPolyfill('unscopables')) - }); - // Internal tweaks for real symbol producer - defineProperties(HiddenSymbol.prototype, { - constructor: d_1(SymbolPolyfill), - toString: d_1('', function () { return this.__name__; }) - }); + var DESCRIPTORS$p = descriptors; + var fails$Q = fails$V; + var createElement$1 = documentCreateElement$2; - // Proper implementation of methods exposed on Symbol.prototype - // They won't be accessible on produced symbol instances as they derive from HiddenSymbol.prototype - defineProperties(SymbolPolyfill.prototype, { - toString: d_1(function () { return 'Symbol (' + validateSymbol(this).__description__ + ')'; }), - valueOf: d_1(function () { return validateSymbol(this); }) + // Thanks to IE8 for its funny defineProperty + var ie8DomDefine = !DESCRIPTORS$p && !fails$Q(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty(createElement$1('div'), 'a', { + get: function () { return 7; } + }).a != 7; }); - defineProperty$1(SymbolPolyfill.prototype, SymbolPolyfill.toPrimitive, d_1('', function () { - var symbol = validateSymbol(this); - if (typeof symbol === 'symbol') { return symbol; } - return symbol.toString(); - })); - defineProperty$1(SymbolPolyfill.prototype, SymbolPolyfill.toStringTag, d_1('c', 'Symbol')); - // Proper implementaton of toPrimitive and toStringTag for returned symbol instances - defineProperty$1(HiddenSymbol.prototype, SymbolPolyfill.toStringTag, - d_1('c', SymbolPolyfill.prototype[SymbolPolyfill.toStringTag])); + var DESCRIPTORS$o = descriptors; + var call$m = functionCall; + var propertyIsEnumerableModule$2 = objectPropertyIsEnumerable; + var createPropertyDescriptor$6 = createPropertyDescriptor$7; + var toIndexedObject$c = toIndexedObject$d; + var toPropertyKey$4 = toPropertyKey$5; + var hasOwn$k = hasOwnProperty_1; + var IE8_DOM_DEFINE$1 = ie8DomDefine; + + // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe + var $getOwnPropertyDescriptor$2 = Object.getOwnPropertyDescriptor; + + // `Object.getOwnPropertyDescriptor` method + // https://tc39.es/ecma262/#sec-object.getownpropertydescriptor + objectGetOwnPropertyDescriptor.f = DESCRIPTORS$o ? $getOwnPropertyDescriptor$2 : function getOwnPropertyDescriptor(O, P) { + O = toIndexedObject$c(O); + P = toPropertyKey$4(P); + if (IE8_DOM_DEFINE$1) try { + return $getOwnPropertyDescriptor$2(O, P); + } catch (error) { /* empty */ } + if (hasOwn$k(O, P)) return createPropertyDescriptor$6(!call$m(propertyIsEnumerableModule$2.f, O, P), O[P]); + }; + + var objectDefineProperty = {}; + + var DESCRIPTORS$n = descriptors; + var fails$P = fails$V; + + // V8 ~ Chrome 36- + // https://bugs.chromium.org/p/v8/issues/detail?id=3334 + var v8PrototypeDefineBug = DESCRIPTORS$n && fails$P(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty(function () { /* empty */ }, 'prototype', { + value: 42, + writable: false + }).prototype != 42; + }); - // Note: It's important to define `toPrimitive` as last one, as some implementations - // implement `toPrimitive` natively without implementing `toStringTag` (or other specified symbols) - // And that may invoke error in definition flow: - // See: https://github.com/medikoo/es6-symbol/issues/13#issuecomment-164146149 - defineProperty$1(HiddenSymbol.prototype, SymbolPolyfill.toPrimitive, - d_1('c', SymbolPolyfill.prototype[SymbolPolyfill.toPrimitive])); + var global$19 = global$1o; + var isObject$o = isObject$s; + + var String$5 = global$19.String; + var TypeError$l = global$19.TypeError; + + // `Assert: Type(argument) is Object` + var anObject$n = function (argument) { + if (isObject$o(argument)) return argument; + throw TypeError$l(String$5(argument) + ' is not an object'); + }; + + var global$18 = global$1o; + var DESCRIPTORS$m = descriptors; + var IE8_DOM_DEFINE = ie8DomDefine; + var V8_PROTOTYPE_DEFINE_BUG$1 = v8PrototypeDefineBug; + var anObject$m = anObject$n; + var toPropertyKey$3 = toPropertyKey$5; + + var TypeError$k = global$18.TypeError; + // eslint-disable-next-line es/no-object-defineproperty -- safe + var $defineProperty$1 = Object.defineProperty; + // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe + var $getOwnPropertyDescriptor$1 = Object.getOwnPropertyDescriptor; + var ENUMERABLE = 'enumerable'; + var CONFIGURABLE$1 = 'configurable'; + var WRITABLE = 'writable'; + + // `Object.defineProperty` method + // https://tc39.es/ecma262/#sec-object.defineproperty + objectDefineProperty.f = DESCRIPTORS$m ? V8_PROTOTYPE_DEFINE_BUG$1 ? function defineProperty(O, P, Attributes) { + anObject$m(O); + P = toPropertyKey$3(P); + anObject$m(Attributes); + if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) { + var current = $getOwnPropertyDescriptor$1(O, P); + if (current && current[WRITABLE]) { + O[P] = Attributes.value; + Attributes = { + configurable: CONFIGURABLE$1 in Attributes ? Attributes[CONFIGURABLE$1] : current[CONFIGURABLE$1], + enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE], + writable: false + }; + } + } return $defineProperty$1(O, P, Attributes); + } : $defineProperty$1 : function defineProperty(O, P, Attributes) { + anObject$m(O); + P = toPropertyKey$3(P); + anObject$m(Attributes); + if (IE8_DOM_DEFINE) try { + return $defineProperty$1(O, P, Attributes); + } catch (error) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw TypeError$k('Accessors not supported'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; + }; - var es6Symbol = isImplemented$7() ? Symbol : polyfill; + var DESCRIPTORS$l = descriptors; + var definePropertyModule$7 = objectDefineProperty; + var createPropertyDescriptor$5 = createPropertyDescriptor$7; - var objToString = Object.prototype.toString - , id = objToString.call((function () { return arguments; })()); + var createNonEnumerableProperty$b = DESCRIPTORS$l ? function (object, key, value) { + return definePropertyModule$7.f(object, key, createPropertyDescriptor$5(1, value)); + } : function (object, key, value) { + object[key] = value; + return object; + }; - var isArguments = function (value) { return objToString.call(value) === id; }; + var redefine$h = {exports: {}}; - var objToString$1 = Object.prototype.toString, id$1 = objToString$1.call(""); + var uncurryThis$S = functionUncurryThis; + var isCallable$l = isCallable$r; + var store$2 = sharedStore; - var isString = function (value) { - return ( - typeof value === "string" || - (value && - typeof value === "object" && - (value instanceof String || objToString$1.call(value) === id$1)) || - false - ); - }; + var functionToString$1 = uncurryThis$S(Function.toString); - var isImplemented$8 = function () { - if (typeof globalThis !== "object") { return false; } - if (!globalThis) { return false; } - return globalThis.Array === Array; - }; + // this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper + if (!isCallable$l(store$2.inspectSource)) { + store$2.inspectSource = function (it) { + return functionToString$1(it); + }; + } - var naiveFallback = function () { - if (typeof self === "object" && self) { return self; } - if (typeof window === "object" && window) { return window; } - throw new Error("Unable to resolve global `this`"); - }; + var inspectSource$4 = store$2.inspectSource; - var implementation = (function () { - if (this) { return this; } - - // Unexpected strict mode (may happen if e.g. bundled into ESM module) - - // Thanks @mathiasbynens -> https://mathiasbynens.be/notes/globalthis - // In all ES5+ engines global object inherits from Object.prototype - // (if you approached one that doesn't please report) - try { - Object.defineProperty(Object.prototype, "__global__", { - get: function () { return this; }, - configurable: true - }); - } catch (error) { - // Unfortunate case of Object.prototype being sealed (via preventExtensions, seal or freeze) - return naiveFallback(); - } - try { - // Safari case (window.__global__ is resolved with global context, but __global__ does not) - if (!__global__) { return naiveFallback(); } - return __global__; - } finally { - delete Object.prototype.__global__; - } - })(); + var global$17 = global$1o; + var isCallable$k = isCallable$r; + var inspectSource$3 = inspectSource$4; - var globalThis_1 = isImplemented$8() ? globalThis : implementation; + var WeakMap$1 = global$17.WeakMap; - var validTypes$1 = { object: true, symbol: true }; + var nativeWeakMap = isCallable$k(WeakMap$1) && /native code/.test(inspectSource$3(WeakMap$1)); - var isImplemented$9 = function () { - var Symbol = globalThis_1.Symbol; - var symbol; - if (typeof Symbol !== "function") { return false; } - symbol = Symbol("test symbol"); - try { String(symbol); } - catch (e) { return false; } + var shared$3 = shared$5.exports; + var uid$3 = uid$5; - // Return 'true' also for polyfills - if (!validTypes$1[typeof Symbol.iterator]) { return false; } - if (!validTypes$1[typeof Symbol.toPrimitive]) { return false; } - if (!validTypes$1[typeof Symbol.toStringTag]) { return false; } + var keys$3 = shared$3('keys'); - return true; + var sharedKey$4 = function (key) { + return keys$3[key] || (keys$3[key] = uid$3(key)); }; - var isSymbol$1 = function (value) { - if (!value) { return false; } - if (typeof value === "symbol") { return true; } - if (!value.constructor) { return false; } - if (value.constructor.name !== "Symbol") { return false; } - return value[value.constructor.toStringTag] === "Symbol"; - }; + var hiddenKeys$6 = {}; - var validateSymbol$1 = function (value) { - if (!isSymbol$1(value)) { throw new TypeError(value + " is not a symbol"); } - return value; - }; + var NATIVE_WEAK_MAP = nativeWeakMap; + var global$16 = global$1o; + var uncurryThis$R = functionUncurryThis; + var isObject$n = isObject$s; + var createNonEnumerableProperty$a = createNonEnumerableProperty$b; + var hasOwn$j = hasOwnProperty_1; + var shared$2 = sharedStore; + var sharedKey$3 = sharedKey$4; + var hiddenKeys$5 = hiddenKeys$6; - var create$4 = Object.create, defineProperty$2 = Object.defineProperty, objPrototype$1 = Object.prototype; - - var created = create$4(null); - var generateName$1 = function (desc) { - var postfix = 0, name, ie11BugWorkaround; - while (created[desc + (postfix || "")]) { ++postfix; } - desc += postfix || ""; - created[desc] = true; - name = "@@" + desc; - defineProperty$2( - objPrototype$1, - name, - d_1.gs(null, function (value) { - // For IE11 issue see: - // https://connect.microsoft.com/IE/feedbackdetail/view/1928508/ - // ie11-broken-getters-on-dom-objects - // https://github.com/medikoo/es6-symbol/issues/12 - if (ie11BugWorkaround) { return; } - ie11BugWorkaround = true; - defineProperty$2(this, name, d_1(value)); - ie11BugWorkaround = false; - }) - ); - return name; - }; + var OBJECT_ALREADY_INITIALIZED = 'Object already initialized'; + var TypeError$j = global$16.TypeError; + var WeakMap = global$16.WeakMap; + var set$4, get$5, has; - var NativeSymbol$1 = globalThis_1.Symbol; - - var standardSymbols = function (SymbolPolyfill) { - return Object.defineProperties(SymbolPolyfill, { - // To ensure proper interoperability with other native functions (e.g. Array.from) - // fallback to eventual native implementation of given symbol - hasInstance: d_1( - "", (NativeSymbol$1 && NativeSymbol$1.hasInstance) || SymbolPolyfill("hasInstance") - ), - isConcatSpreadable: d_1( - "", - (NativeSymbol$1 && NativeSymbol$1.isConcatSpreadable) || - SymbolPolyfill("isConcatSpreadable") - ), - iterator: d_1("", (NativeSymbol$1 && NativeSymbol$1.iterator) || SymbolPolyfill("iterator")), - match: d_1("", (NativeSymbol$1 && NativeSymbol$1.match) || SymbolPolyfill("match")), - replace: d_1("", (NativeSymbol$1 && NativeSymbol$1.replace) || SymbolPolyfill("replace")), - search: d_1("", (NativeSymbol$1 && NativeSymbol$1.search) || SymbolPolyfill("search")), - species: d_1("", (NativeSymbol$1 && NativeSymbol$1.species) || SymbolPolyfill("species")), - split: d_1("", (NativeSymbol$1 && NativeSymbol$1.split) || SymbolPolyfill("split")), - toPrimitive: d_1( - "", (NativeSymbol$1 && NativeSymbol$1.toPrimitive) || SymbolPolyfill("toPrimitive") - ), - toStringTag: d_1( - "", (NativeSymbol$1 && NativeSymbol$1.toStringTag) || SymbolPolyfill("toStringTag") - ), - unscopables: d_1( - "", (NativeSymbol$1 && NativeSymbol$1.unscopables) || SymbolPolyfill("unscopables") - ) - }); + var enforce = function (it) { + return has(it) ? get$5(it) : set$4(it, {}); }; - var registry = Object.create(null); - - var symbolRegistry = function (SymbolPolyfill) { - return Object.defineProperties(SymbolPolyfill, { - for: d_1(function (key) { - if (registry[key]) { return registry[key]; } - return (registry[key] = SymbolPolyfill(String(key))); - }), - keyFor: d_1(function (symbol) { - var key; - validateSymbol$1(symbol); - for (key in registry) { - if (registry[key] === symbol) { return key; } - } - return undefined; - }) - }); + var getterFor = function (TYPE) { + return function (it) { + var state; + if (!isObject$n(it) || (state = get$5(it)).type !== TYPE) { + throw TypeError$j('Incompatible receiver, ' + TYPE + ' required'); + } return state; + }; }; - var NativeSymbol$2 = globalThis_1.Symbol; - - var create$5 = Object.create - , defineProperties$1 = Object.defineProperties - , defineProperty$3 = Object.defineProperty; + if (NATIVE_WEAK_MAP || shared$2.state) { + var store$1 = shared$2.state || (shared$2.state = new WeakMap()); + var wmget = uncurryThis$R(store$1.get); + var wmhas = uncurryThis$R(store$1.has); + var wmset = uncurryThis$R(store$1.set); + set$4 = function (it, metadata) { + if (wmhas(store$1, it)) throw new TypeError$j(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + wmset(store$1, it, metadata); + return metadata; + }; + get$5 = function (it) { + return wmget(store$1, it) || {}; + }; + has = function (it) { + return wmhas(store$1, it); + }; + } else { + var STATE = sharedKey$3('state'); + hiddenKeys$5[STATE] = true; + set$4 = function (it, metadata) { + if (hasOwn$j(it, STATE)) throw new TypeError$j(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + createNonEnumerableProperty$a(it, STATE, metadata); + return metadata; + }; + get$5 = function (it) { + return hasOwn$j(it, STATE) ? it[STATE] : {}; + }; + has = function (it) { + return hasOwn$j(it, STATE); + }; + } + + var internalState = { + set: set$4, + get: get$5, + has: has, + enforce: enforce, + getterFor: getterFor + }; + + var DESCRIPTORS$k = descriptors; + var hasOwn$i = hasOwnProperty_1; + + var FunctionPrototype$2 = Function.prototype; + // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe + var getDescriptor = DESCRIPTORS$k && Object.getOwnPropertyDescriptor; + + var EXISTS = hasOwn$i(FunctionPrototype$2, 'name'); + // additional protection from minified / mangled / dropped function names + var PROPER = EXISTS && (function something() { /* empty */ }).name === 'something'; + var CONFIGURABLE = EXISTS && (!DESCRIPTORS$k || (DESCRIPTORS$k && getDescriptor(FunctionPrototype$2, 'name').configurable)); + + var functionName = { + EXISTS: EXISTS, + PROPER: PROPER, + CONFIGURABLE: CONFIGURABLE + }; + + var global$15 = global$1o; + var isCallable$j = isCallable$r; + var hasOwn$h = hasOwnProperty_1; + var createNonEnumerableProperty$9 = createNonEnumerableProperty$b; + var setGlobal$1 = setGlobal$3; + var inspectSource$2 = inspectSource$4; + var InternalStateModule$9 = internalState; + var CONFIGURABLE_FUNCTION_NAME$2 = functionName.CONFIGURABLE; + + var getInternalState$7 = InternalStateModule$9.get; + var enforceInternalState$1 = InternalStateModule$9.enforce; + var TEMPLATE = String(String).split('String'); + + (redefine$h.exports = function (O, key, value, options) { + var unsafe = options ? !!options.unsafe : false; + var simple = options ? !!options.enumerable : false; + var noTargetGet = options ? !!options.noTargetGet : false; + var name = options && options.name !== undefined ? options.name : key; + var state; + if (isCallable$j(value)) { + if (String(name).slice(0, 7) === 'Symbol(') { + name = '[' + String(name).replace(/^Symbol\(([^)]*)\)/, '$1') + ']'; + } + if (!hasOwn$h(value, 'name') || (CONFIGURABLE_FUNCTION_NAME$2 && value.name !== name)) { + createNonEnumerableProperty$9(value, 'name', name); + } + state = enforceInternalState$1(value); + if (!state.source) { + state.source = TEMPLATE.join(typeof name == 'string' ? name : ''); + } + } + if (O === global$15) { + if (simple) O[key] = value; + else setGlobal$1(key, value); + return; + } else if (!unsafe) { + delete O[key]; + } else if (!noTargetGet && O[key]) { + simple = true; + } + if (simple) O[key] = value; + else createNonEnumerableProperty$9(O, key, value); + // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative + })(Function.prototype, 'toString', function toString() { + return isCallable$j(this) && getInternalState$7(this).source || inspectSource$2(this); + }); - var SymbolPolyfill$1, HiddenSymbol$1, isNativeSafe$1; + var objectGetOwnPropertyNames = {}; - if (typeof NativeSymbol$2 === "function") { - try { - String(NativeSymbol$2()); - isNativeSafe$1 = true; - } catch (ignore) {} - } else { - NativeSymbol$2 = null; - } + var ceil$1 = Math.ceil; + var floor$8 = Math.floor; - // Internal constructor (not one exposed) for creating Symbol instances. - // This one is used to ensure that `someSymbol instanceof Symbol` always return false - HiddenSymbol$1 = function Symbol(description) { - if (this instanceof HiddenSymbol$1) { throw new TypeError("Symbol is not a constructor"); } - return SymbolPolyfill$1(description); + // `ToIntegerOrInfinity` abstract operation + // https://tc39.es/ecma262/#sec-tointegerorinfinity + var toIntegerOrInfinity$b = function (argument) { + var number = +argument; + // eslint-disable-next-line no-self-compare -- safe + return number !== number || number === 0 ? 0 : (number > 0 ? floor$8 : ceil$1)(number); }; - // Exposed `Symbol` constructor - // (returns instances of HiddenSymbol) - var polyfill$1 = SymbolPolyfill$1 = function Symbol(description) { - var symbol; - if (this instanceof Symbol) { throw new TypeError("Symbol is not a constructor"); } - if (isNativeSafe$1) { return NativeSymbol$2(description); } - symbol = create$5(HiddenSymbol$1.prototype); - description = description === undefined ? "" : String(description); - return defineProperties$1(symbol, { - __description__: d_1("", description), - __name__: d_1("", generateName$1(description)) - }); + var toIntegerOrInfinity$a = toIntegerOrInfinity$b; + + var max$5 = Math.max; + var min$9 = Math.min; + + // Helper for a popular repeating case of the spec: + // Let integer be ? ToInteger(index). + // If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). + var toAbsoluteIndex$9 = function (index, length) { + var integer = toIntegerOrInfinity$a(index); + return integer < 0 ? max$5(integer + length, 0) : min$9(integer, length); }; - standardSymbols(SymbolPolyfill$1); - symbolRegistry(SymbolPolyfill$1); + var toIntegerOrInfinity$9 = toIntegerOrInfinity$b; - // Internal tweaks for real symbol producer - defineProperties$1(HiddenSymbol$1.prototype, { - constructor: d_1(SymbolPolyfill$1), - toString: d_1("", function () { return this.__name__; }) - }); + var min$8 = Math.min; - // Proper implementation of methods exposed on Symbol.prototype - // They won't be accessible on produced symbol instances as they derive from HiddenSymbol.prototype - defineProperties$1(SymbolPolyfill$1.prototype, { - toString: d_1(function () { return "Symbol (" + validateSymbol$1(this).__description__ + ")"; }), - valueOf: d_1(function () { return validateSymbol$1(this); }) - }); - defineProperty$3( - SymbolPolyfill$1.prototype, - SymbolPolyfill$1.toPrimitive, - d_1("", function () { - var symbol = validateSymbol$1(this); - if (typeof symbol === "symbol") { return symbol; } - return symbol.toString(); - }) - ); - defineProperty$3(SymbolPolyfill$1.prototype, SymbolPolyfill$1.toStringTag, d_1("c", "Symbol")); - - // Proper implementaton of toPrimitive and toStringTag for returned symbol instances - defineProperty$3( - HiddenSymbol$1.prototype, SymbolPolyfill$1.toStringTag, - d_1("c", SymbolPolyfill$1.prototype[SymbolPolyfill$1.toStringTag]) - ); - - // Note: It's important to define `toPrimitive` as last one, as some implementations - // implement `toPrimitive` natively without implementing `toStringTag` (or other specified symbols) - // And that may invoke error in definition flow: - // See: https://github.com/medikoo/es6-symbol/issues/13#issuecomment-164146149 - defineProperty$3( - HiddenSymbol$1.prototype, SymbolPolyfill$1.toPrimitive, - d_1("c", SymbolPolyfill$1.prototype[SymbolPolyfill$1.toPrimitive]) - ); - - var es6Symbol$1 = isImplemented$9() - ? globalThis_1.Symbol - : polyfill$1; - - var iteratorSymbol = es6Symbol$1.iterator - , isArray = Array.isArray; - - var isIterable = function (value) { - if (!isValue(value)) { return false; } - if (isArray(value)) { return true; } - if (isString(value)) { return true; } - if (isArguments(value)) { return true; } - return typeof value[iteratorSymbol] === "function"; + // `ToLength` abstract operation + // https://tc39.es/ecma262/#sec-tolength + var toLength$c = function (argument) { + return argument > 0 ? min$8(toIntegerOrInfinity$9(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 }; - var validIterable = function (value) { - if (!isIterable(value)) { throw new TypeError(value + " is not iterable"); } - return value; - }; + var toLength$b = toLength$c; - var objectToString = Object.prototype.toString; - - var coerce = function (value) { - if (!is(value)) { return null; } - if (is$1(value)) { - // Reject Object.prototype.toString coercion - var valueToString = value.toString; - if (typeof valueToString !== "function") { return null; } - if (valueToString === objectToString) { return null; } - // Note: It can be object coming from other realm, still as there's no ES3 and CSP compliant - // way to resolve its realm's Object.prototype.toString it's left as not addressed edge case - } - try { - return "" + value; // Ensure implicit coercion - } catch (error) { - return null; - } + // `LengthOfArrayLike` abstract operation + // https://tc39.es/ecma262/#sec-lengthofarraylike + var lengthOfArrayLike$i = function (obj) { + return toLength$b(obj.length); }; - var safeToString = function (value) { - try { - return value.toString(); - } catch (error) { - try { return String(value); } - catch (error2) { return null; } - } - }; + var toIndexedObject$b = toIndexedObject$d; + var toAbsoluteIndex$8 = toAbsoluteIndex$9; + var lengthOfArrayLike$h = lengthOfArrayLike$i; - var reNewLine = /[\n\r\u2028\u2029]/g; - - var toShortString = function (value) { - var string = safeToString(value); - if (string === null) { return ""; } - // Trim if too long - if (string.length > 100) { string = string.slice(0, 99) + "…"; } - // Replace eventual new lines - string = string.replace(reNewLine, function (char) { - switch (char) { - case "\n": - return "\\n"; - case "\r": - return "\\r"; - case "\u2028": - return "\\u2028"; - case "\u2029": - return "\\u2029"; - /* istanbul ignore next */ - default: - throw new Error("Unexpected character"); - } - }); - return string; + // `Array.prototype.{ indexOf, includes }` methods implementation + var createMethod$6 = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = toIndexedObject$b($this); + var length = lengthOfArrayLike$h(O); + var index = toAbsoluteIndex$8(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare -- NaN check + if (IS_INCLUDES && el != el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare -- NaN check + if (value != value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) { + if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; }; - var resolveMessage = function (message, value) { - return message.replace("%v", toShortString(value)); + var arrayIncludes = { + // `Array.prototype.includes` method + // https://tc39.es/ecma262/#sec-array.prototype.includes + includes: createMethod$6(true), + // `Array.prototype.indexOf` method + // https://tc39.es/ecma262/#sec-array.prototype.indexof + indexOf: createMethod$6(false) }; - var resolveException = function (value, defaultMessage, inputOptions) { - if (!is$1(inputOptions)) { throw new TypeError(resolveMessage(defaultMessage, value)); } - if (!is(value)) { - if ("default" in inputOptions) { return inputOptions["default"]; } - if (inputOptions.isOptional) { return null; } - } - var errorMessage = coerce(inputOptions.errorMessage); - if (!is(errorMessage)) { errorMessage = defaultMessage; } - throw new TypeError(resolveMessage(errorMessage, value)); - }; + var uncurryThis$Q = functionUncurryThis; + var hasOwn$g = hasOwnProperty_1; + var toIndexedObject$a = toIndexedObject$d; + var indexOf$1 = arrayIncludes.indexOf; + var hiddenKeys$4 = hiddenKeys$6; - var ensure = function (value/*, options*/) { - if (is(value)) { return value; } - return resolveException(value, "Cannot use %v", arguments[1]); - }; + var push$a = uncurryThis$Q([].push); - var ensure$1 = function (value/*, options*/) { - if (is$4(value)) { return value; } - return resolveException(value, "%v is not a plain function", arguments[1]); + var objectKeysInternal = function (object, names) { + var O = toIndexedObject$a(object); + var i = 0; + var result = []; + var key; + for (key in O) !hasOwn$g(hiddenKeys$4, key) && hasOwn$g(O, key) && push$a(result, key); + // Don't enum bug & hidden keys + while (names.length > i) if (hasOwn$g(O, key = names[i++])) { + ~indexOf$1(result, key) || push$a(result, key); + } + return result; }; - var isImplemented$a = function () { - var from = Array.from, arr, result; - if (typeof from !== "function") { return false; } - arr = ["raz", "dwa"]; - result = from(arr); - return Boolean(result && result !== arr && result[1] === "dwa"); - }; + // IE8- don't enum bug keys + var enumBugKeys$3 = [ + 'constructor', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'toLocaleString', + 'toString', + 'valueOf' + ]; - var objToString$2 = Object.prototype.toString - , isFunctionStringTag = RegExp.prototype.test.bind(/^[object [A-Za-z0-9]*Function]$/); + var internalObjectKeys$1 = objectKeysInternal; + var enumBugKeys$2 = enumBugKeys$3; - var isFunction = function (value) { - return typeof value === "function" && isFunctionStringTag(objToString$2.call(value)); - }; + var hiddenKeys$3 = enumBugKeys$2.concat('length', 'prototype'); - var iteratorSymbol$1 = es6Symbol$1.iterator - , isArray$1 = Array.isArray - , call = Function.prototype.call - , desc = { configurable: true, enumerable: true, writable: true, value: null } - , defineProperty$4 = Object.defineProperty; - - // eslint-disable-next-line complexity, max-lines-per-function - var shim$7 = function (arrayLike/*, mapFn, thisArg*/) { - var mapFn = arguments[1] - , thisArg = arguments[2] - , Context - , i - , j - , arr - , length - , code - , iterator - , result - , getIterator - , value; - - arrayLike = Object(validValue(arrayLike)); - - if (isValue(mapFn)) { validCallable(mapFn); } - if (!this || this === Array || !isFunction(this)) { - // Result: Plain array - if (!mapFn) { - if (isArguments(arrayLike)) { - // Source: Arguments - length = arrayLike.length; - if (length !== 1) { return Array.apply(null, arrayLike); } - arr = new Array(1); - arr[0] = arrayLike[0]; - return arr; - } - if (isArray$1(arrayLike)) { - // Source: Array - arr = new Array((length = arrayLike.length)); - for (i = 0; i < length; ++i) { arr[i] = arrayLike[i]; } - return arr; - } - } - arr = []; - } else { - // Result: Non plain array - Context = this; - } - - if (!isArray$1(arrayLike)) { - if ((getIterator = arrayLike[iteratorSymbol$1]) !== undefined) { - // Source: Iterator - iterator = validCallable(getIterator).call(arrayLike); - if (Context) { arr = new Context(); } - result = iterator.next(); - i = 0; - while (!result.done) { - value = mapFn ? call.call(mapFn, thisArg, result.value, i) : result.value; - if (Context) { - desc.value = value; - defineProperty$4(arr, i, desc); - } else { - arr[i] = value; - } - result = iterator.next(); - ++i; - } - length = i; - } else if (isString(arrayLike)) { - // Source: String - length = arrayLike.length; - if (Context) { arr = new Context(); } - for (i = 0, j = 0; i < length; ++i) { - value = arrayLike[i]; - if (i + 1 < length) { - code = value.charCodeAt(0); - // eslint-disable-next-line max-depth - if (code >= 0xd800 && code <= 0xdbff) { value += arrayLike[++i]; } - } - value = mapFn ? call.call(mapFn, thisArg, value, j) : value; - if (Context) { - desc.value = value; - defineProperty$4(arr, j, desc); - } else { - arr[j] = value; - } - ++j; - } - length = j; - } - } - if (length === undefined) { - // Source: array or array-like - length = toPosInteger(arrayLike.length); - if (Context) { arr = new Context(length); } - for (i = 0; i < length; ++i) { - value = mapFn ? call.call(mapFn, thisArg, arrayLike[i], i) : arrayLike[i]; - if (Context) { - desc.value = value; - defineProperty$4(arr, i, desc); - } else { - arr[i] = value; - } - } - } - if (Context) { - desc.value = null; - arr.length = length; - } - return arr; + // `Object.getOwnPropertyNames` method + // https://tc39.es/ecma262/#sec-object.getownpropertynames + // eslint-disable-next-line es/no-object-getownpropertynames -- safe + objectGetOwnPropertyNames.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return internalObjectKeys$1(O, hiddenKeys$3); }; - var from_1 = isImplemented$a() ? Array.from : shim$7; - - var copy = function (obj/*, propertyNames, options*/) { - var copy = Object(validValue(obj)), propertyNames = arguments[1], options = Object(arguments[2]); - if (copy !== obj && !propertyNames) { return copy; } - var result = {}; - if (propertyNames) { - from_1(propertyNames, function (propertyName) { - if (options.ensure || propertyName in obj) { result[propertyName] = obj[propertyName]; } - }); - } else { - assign(result, obj); - } - return result; - }; + var objectGetOwnPropertySymbols = {}; - var bind = Function.prototype.bind - , call$1 = Function.prototype.call - , keys$2 = Object.keys - , objPropertyIsEnumerable = Object.prototype.propertyIsEnumerable; - - var _iterate = function (method, defVal) { - return function (obj, cb/*, thisArg, compareFn*/) { - var list, thisArg = arguments[2], compareFn = arguments[3]; - obj = Object(validValue(obj)); - validCallable(cb); - - list = keys$2(obj); - if (compareFn) { - list.sort(typeof compareFn === "function" ? bind.call(compareFn, obj) : undefined); - } - if (typeof method !== "function") { method = list[method]; } - return call$1.call(method, list, function (key, index) { - if (!objPropertyIsEnumerable.call(obj, key)) { return defVal; } - return call$1.call(cb, thisArg, obj[key], key, obj, index); - }); - }; - }; + // eslint-disable-next-line es/no-object-getownpropertysymbols -- safe + objectGetOwnPropertySymbols.f = Object.getOwnPropertySymbols; - var forEach$1 = _iterate("forEach"); + var getBuiltIn$8 = getBuiltIn$b; + var uncurryThis$P = functionUncurryThis; + var getOwnPropertyNamesModule$2 = objectGetOwnPropertyNames; + var getOwnPropertySymbolsModule$2 = objectGetOwnPropertySymbols; + var anObject$l = anObject$n; - var call$2 = Function.prototype.call; + var concat$3 = uncurryThis$P([].concat); - var map$1 = function (obj, cb/*, thisArg*/) { - var result = {}, thisArg = arguments[2]; - validCallable(cb); - forEach$1(obj, function (value, key, targetObj, index) { - result[key] = call$2.call(cb, thisArg, value, key, targetObj, index); - }); - return result; + // all object keys, includes non-enumerable and symbols + var ownKeys$1 = getBuiltIn$8('Reflect', 'ownKeys') || function ownKeys(it) { + var keys = getOwnPropertyNamesModule$2.f(anObject$l(it)); + var getOwnPropertySymbols = getOwnPropertySymbolsModule$2.f; + return getOwnPropertySymbols ? concat$3(keys, getOwnPropertySymbols(it)) : keys; }; - var bind$1 = Function.prototype.bind - , defineProperty$5 = Object.defineProperty - , hasOwnProperty$1 = Object.prototype.hasOwnProperty - , define; - - define = function (name, desc, options) { - var value = ensure(desc) && ensure$1(desc.value), dgs; - dgs = copy(desc); - delete dgs.writable; - delete dgs.value; - dgs.get = function () { - if (!options.overwriteDefinition && hasOwnProperty$1.call(this, name)) { return value; } - desc.value = bind$1.call(value, options.resolveContext ? options.resolveContext(this) : this); - defineProperty$5(this, name, desc); - return this[name]; - }; - return dgs; - }; + var hasOwn$f = hasOwnProperty_1; + var ownKeys = ownKeys$1; + var getOwnPropertyDescriptorModule$3 = objectGetOwnPropertyDescriptor; + var definePropertyModule$6 = objectDefineProperty; - var autoBind = function (props/*, options*/) { - var options = normalizeOptions(arguments[1]); - if (is(options.resolveContext)) { ensure$1(options.resolveContext); } - return map$1(props, function (desc, name) { return define(name, desc, options); }); + var copyConstructorProperties$2 = function (target, source, exceptions) { + var keys = ownKeys(source); + var defineProperty = definePropertyModule$6.f; + var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule$3.f; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (!hasOwn$f(target, key) && !(exceptions && hasOwn$f(exceptions, key))) { + defineProperty(target, key, getOwnPropertyDescriptor(source, key)); + } + } }; - var defineProperty$6 = Object.defineProperty, defineProperties$2 = Object.defineProperties, Iterator; - - var es6Iterator = Iterator = function (list, context) { - if (!(this instanceof Iterator)) { throw new TypeError("Constructor requires 'new'"); } - defineProperties$2(this, { - __list__: d_1("w", validValue(list)), - __context__: d_1("w", context), - __nextIndex__: d_1("w", 0) - }); - if (!context) { return; } - validCallable(context.on); - context.on("_add", this._onAdd); - context.on("_delete", this._onDelete); - context.on("_clear", this._onClear); + var fails$O = fails$V; + var isCallable$i = isCallable$r; + + var replacement = /#|\.prototype\./; + + var isForced$5 = function (feature, detection) { + var value = data[normalize$1(feature)]; + return value == POLYFILL ? true + : value == NATIVE ? false + : isCallable$i(detection) ? fails$O(detection) + : !!detection; }; - // Internal %IteratorPrototype% doesn't expose its constructor - delete Iterator.prototype.constructor; - - defineProperties$2( - Iterator.prototype, - assign( - { - _next: d_1(function () { - var i; - if (!this.__list__) { return undefined; } - if (this.__redo__) { - i = this.__redo__.shift(); - if (i !== undefined) { return i; } - } - if (this.__nextIndex__ < this.__list__.length) { return this.__nextIndex__++; } - this._unBind(); - return undefined; - }), - next: d_1(function () { - return this._createResult(this._next()); - }), - _createResult: d_1(function (i) { - if (i === undefined) { return { done: true, value: undefined }; } - return { done: false, value: this._resolve(i) }; - }), - _resolve: d_1(function (i) { - return this.__list__[i]; - }), - _unBind: d_1(function () { - this.__list__ = null; - delete this.__redo__; - if (!this.__context__) { return; } - this.__context__.off("_add", this._onAdd); - this.__context__.off("_delete", this._onDelete); - this.__context__.off("_clear", this._onClear); - this.__context__ = null; - }), - toString: d_1(function () { - return "[object " + (this[es6Symbol$1.toStringTag] || "Object") + "]"; - }) - }, - autoBind({ - _onAdd: d_1(function (index) { - if (index >= this.__nextIndex__) { return; } - ++this.__nextIndex__; - if (!this.__redo__) { - defineProperty$6(this, "__redo__", d_1("c", [index])); - return; - } - this.__redo__.forEach(function (redo, i) { - if (redo >= index) { this.__redo__[i] = ++redo; } - }, this); - this.__redo__.push(index); - }), - _onDelete: d_1(function (index) { - var i; - if (index >= this.__nextIndex__) { return; } - --this.__nextIndex__; - if (!this.__redo__) { return; } - i = this.__redo__.indexOf(index); - if (i !== -1) { this.__redo__.splice(i, 1); } - this.__redo__.forEach(function (redo, j) { - if (redo > index) { this.__redo__[j] = --redo; } - }, this); - }), - _onClear: d_1(function () { - if (this.__redo__) { clear.call(this.__redo__); } - this.__nextIndex__ = 0; - }) - }) - ) - ); - - defineProperty$6( - Iterator.prototype, - es6Symbol$1.iterator, - d_1(function () { - return this; - }) - ); - - var array = createCommonjsModule(function (module) { - - - - var defineProperty = Object.defineProperty, ArrayIterator; - - ArrayIterator = module.exports = function (arr, kind) { - if (!(this instanceof ArrayIterator)) { throw new TypeError("Constructor requires 'new'"); } - es6Iterator.call(this, arr); - if (!kind) { kind = "value"; } - else if (contains.call(kind, "key+value")) { kind = "key+value"; } - else if (contains.call(kind, "key")) { kind = "key"; } - else { kind = "value"; } - defineProperty(this, "__kind__", d_1("", kind)); + var normalize$1 = isForced$5.normalize = function (string) { + return String(string).replace(replacement, '.').toLowerCase(); }; - if (setPrototypeOf) { setPrototypeOf(ArrayIterator, es6Iterator); } - // Internal %ArrayIteratorPrototype% doesn't expose its constructor - delete ArrayIterator.prototype.constructor; + var data = isForced$5.data = {}; + var NATIVE = isForced$5.NATIVE = 'N'; + var POLYFILL = isForced$5.POLYFILL = 'P'; - ArrayIterator.prototype = Object.create(es6Iterator.prototype, { - _resolve: d_1(function (i) { - if (this.__kind__ === "value") { return this.__list__[i]; } - if (this.__kind__ === "key+value") { return [i, this.__list__[i]]; } - return i; - }) - }); - defineProperty(ArrayIterator.prototype, es6Symbol$1.toStringTag, d_1("c", "Array Iterator")); - }); + var isForced_1 = isForced$5; - var string = createCommonjsModule(function (module) { + var global$14 = global$1o; + var getOwnPropertyDescriptor$4 = objectGetOwnPropertyDescriptor.f; + var createNonEnumerableProperty$8 = createNonEnumerableProperty$b; + var redefine$g = redefine$h.exports; + var setGlobal = setGlobal$3; + var copyConstructorProperties$1 = copyConstructorProperties$2; + var isForced$4 = isForced_1; + /* + options.target - name of the target object + options.global - target is the global object + options.stat - export as static methods of target + options.proto - export as prototype methods of target + options.real - real prototype method for the `pure` version + options.forced - export even if the native feature is available + options.bind - bind methods to the target, required for the `pure` version + options.wrap - wrap constructors to preventing global pollution, required for the `pure` version + options.unsafe - use the simple assignment of property instead of delete + defineProperty + options.sham - add a flag to not completely full polyfills + options.enumerable - export as enumerable property + options.noTargetGet - prevent calling a getter on target + options.name - the .name of the function if it does not match the key + */ + var _export = function (options, source) { + var TARGET = options.target; + var GLOBAL = options.global; + var STATIC = options.stat; + var FORCED, target, key, targetProperty, sourceProperty, descriptor; + if (GLOBAL) { + target = global$14; + } else if (STATIC) { + target = global$14[TARGET] || setGlobal(TARGET, {}); + } else { + target = (global$14[TARGET] || {}).prototype; + } + if (target) for (key in source) { + sourceProperty = source[key]; + if (options.noTargetGet) { + descriptor = getOwnPropertyDescriptor$4(target, key); + targetProperty = descriptor && descriptor.value; + } else targetProperty = target[key]; + FORCED = isForced$4(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); + // contained in target + if (!FORCED && targetProperty !== undefined) { + if (typeof sourceProperty == typeof targetProperty) continue; + copyConstructorProperties$1(sourceProperty, targetProperty); + } + // add a flag to not completely full polyfills + if (options.sham || (targetProperty && targetProperty.sham)) { + createNonEnumerableProperty$8(sourceProperty, 'sham', true); + } + // extend global + redefine$g(target, key, sourceProperty, options); + } + }; + var $$1e = _export; + var global$13 = global$1o; + var uncurryThis$O = functionUncurryThis; - var defineProperty = Object.defineProperty, StringIterator; + var Date$1 = global$13.Date; + var getTime$2 = uncurryThis$O(Date$1.prototype.getTime); - StringIterator = module.exports = function (str) { - if (!(this instanceof StringIterator)) { throw new TypeError("Constructor requires 'new'"); } - str = String(str); - es6Iterator.call(this, str); - defineProperty(this, "__length__", d_1("", str.length)); - }; - if (setPrototypeOf) { setPrototypeOf(StringIterator, es6Iterator); } - - // Internal %ArrayIteratorPrototype% doesn't expose its constructor - delete StringIterator.prototype.constructor; - - StringIterator.prototype = Object.create(es6Iterator.prototype, { - _next: d_1(function () { - if (!this.__list__) { return undefined; } - if (this.__nextIndex__ < this.__length__) { return this.__nextIndex__++; } - this._unBind(); - return undefined; - }), - _resolve: d_1(function (i) { - var char = this.__list__[i], code; - if (this.__nextIndex__ === this.__length__) { return char; } - code = char.charCodeAt(0); - if (code >= 0xd800 && code <= 0xdbff) { return char + this.__list__[this.__nextIndex__++]; } - return char; - }) - }); - defineProperty(StringIterator.prototype, es6Symbol$1.toStringTag, d_1("c", "String Iterator")); + // `Date.now` method + // https://tc39.es/ecma262/#sec-date.now + $$1e({ target: 'Date', stat: true }, { + now: function now() { + return getTime$2(new Date$1()); + } }); - var iteratorSymbol$2 = es6Symbol$1.iterator; + var uncurryThis$N = functionUncurryThis; + var redefine$f = redefine$h.exports; + + var DatePrototype$1 = Date.prototype; + var INVALID_DATE = 'Invalid Date'; + var TO_STRING$1 = 'toString'; + var un$DateToString = uncurryThis$N(DatePrototype$1[TO_STRING$1]); + var getTime$1 = uncurryThis$N(DatePrototype$1.getTime); + + // `Date.prototype.toString` method + // https://tc39.es/ecma262/#sec-date.prototype.tostring + if (String(new Date(NaN)) != INVALID_DATE) { + redefine$f(DatePrototype$1, TO_STRING$1, function toString() { + var value = getTime$1(this); + // eslint-disable-next-line no-self-compare -- NaN check + return value === value ? un$DateToString(this) : INVALID_DATE; + }); + } - var get = function (obj) { - if (typeof validIterable(obj)[iteratorSymbol$2] === "function") { return obj[iteratorSymbol$2](); } - if (isArguments(obj)) { return new array(obj); } - if (isString(obj)) { return new string(obj); } - return new array(obj); - }; + function _typeof(obj) { + "@babel/helpers - typeof"; - var isArray$2 = Array.isArray, call$3 = Function.prototype.call, some = Array.prototype.some; - - var forOf = function (iterable, cb /*, thisArg*/) { - var mode, thisArg = arguments[2], result, doBreak, broken, i, length, char, code; - if (isArray$2(iterable) || isArguments(iterable)) { mode = "array"; } - else if (isString(iterable)) { mode = "string"; } - else { iterable = get(iterable); } - - validCallable(cb); - doBreak = function () { - broken = true; - }; - if (mode === "array") { - some.call(iterable, function (value) { - call$3.call(cb, thisArg, value, doBreak); - return broken; - }); - return; - } - if (mode === "string") { - length = iterable.length; - for (i = 0; i < length; ++i) { - char = iterable[i]; - if (i + 1 < length) { - code = char.charCodeAt(0); - if (code >= 0xd800 && code <= 0xdbff) { char += iterable[++i]; } - } - call$3.call(cb, thisArg, char, doBreak); - if (broken) { break; } - } - return; - } - result = iterable.next(); - - while (!result.done) { - call$3.call(cb, thisArg, result.value, doBreak); - if (broken) { return; } - result = iterable.next(); - } - }; + return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { + return typeof obj; + } : function (obj) { + return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }, _typeof(obj); + } + + function _classCallCheck$1(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } - var iterator = createCommonjsModule(function (module) { + function _defineProperties$1(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } - var toStringTagSymbol = es6Symbol.toStringTag + function _createClass$1(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$1(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$1(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); + return Constructor; + } - , defineProperty = Object.defineProperty - , SetIterator; + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } - SetIterator = module.exports = function (set, kind) { - if (!(this instanceof SetIterator)) { return new SetIterator(set, kind); } - es6Iterator.call(this, set.__setData__, set); - if (!kind) { kind = 'value'; } - else if (contains.call(kind, 'key+value')) { kind = 'key+value'; } - else { kind = 'value'; } - defineProperty(this, '__kind__', d_1('', kind)); - }; - if (setPrototypeOf) { setPrototypeOf(SetIterator, es6Iterator); } - - SetIterator.prototype = Object.create(es6Iterator.prototype, { - constructor: d_1(SetIterator), - _resolve: d_1(function (i) { - if (this.__kind__ === 'value') { return this.__list__[i]; } - return [this.__list__[i], this.__list__[i]]; - }), - toString: d_1(function () { return '[object Set Iterator]'; }) - }); - defineProperty(SetIterator.prototype, toStringTagSymbol, d_1('c', 'Set Iterator')); - }); + return obj; + } - // Exports true if environment provides native `Set` implementation, - - var isNativeImplemented = (function () { - if (typeof Set === 'undefined') { return false; } - return (Object.prototype.toString.call(Set.prototype) === '[object Set]'); - }()); - - var iterator$1 = validIterable - - , call$4 = Function.prototype.call - , defineProperty$7 = Object.defineProperty, getPrototypeOf$1 = Object.getPrototypeOf - , SetPoly, getValues, NativeSet; - - if (isNativeImplemented) { NativeSet = Set; } - - var polyfill$2 = SetPoly = function Set(/*iterable*/) { - var iterable = arguments[0], self; - if (!(this instanceof SetPoly)) { throw new TypeError('Constructor requires \'new\''); } - if (isNativeImplemented && setPrototypeOf) { self = setPrototypeOf(new NativeSet(), getPrototypeOf$1(this)); } - else { self = this; } - if (iterable != null) { iterator$1(iterable); } - defineProperty$7(self, '__setData__', d_1('c', [])); - if (!iterable) { return self; } - forOf(iterable, function (value) { - if (eIndexOf.call(this, value) !== -1) { return; } - this.push(value); - }, self.__setData__); - return self; - }; + function _slicedToArray(arr, i) { + return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); + } - if (isNativeImplemented) { - if (setPrototypeOf) { setPrototypeOf(SetPoly, NativeSet); } - SetPoly.prototype = Object.create(NativeSet.prototype, { constructor: d_1(SetPoly) }); - } - - eventEmitter(Object.defineProperties(SetPoly.prototype, { - add: d_1(function (value) { - if (this.has(value)) { return this; } - this.emit('_add', this.__setData__.push(value) - 1, value); - return this; - }), - clear: d_1(function () { - if (!this.__setData__.length) { return; } - clear.call(this.__setData__); - this.emit('_clear'); - }), - delete: d_1(function (value) { - var index = eIndexOf.call(this.__setData__, value); - if (index === -1) { return false; } - this.__setData__.splice(index, 1); - this.emit('_delete', index, value); - return true; - }), - entries: d_1(function () { return new iterator(this, 'key+value'); }), - forEach: d_1(function (cb/*, thisArg*/) { - var thisArg = arguments[1], iterator, result, value; - validCallable(cb); - iterator = this.values(); - result = iterator._next(); - while (result !== undefined) { - value = iterator._resolve(result); - call$4.call(cb, thisArg, value, value, this); - result = iterator._next(); - } - }), - has: d_1(function (value) { - return (eIndexOf.call(this.__setData__, value) !== -1); - }), - keys: d_1(getValues = function () { return this.values(); }), - size: d_1.gs(function () { return this.__setData__.length; }), - values: d_1(function () { return new iterator(this); }), - toString: d_1(function () { return '[object Set]'; }) - })); - defineProperty$7(SetPoly.prototype, es6Symbol.iterator, d_1(getValues)); - defineProperty$7(SetPoly.prototype, es6Symbol.toStringTag, d_1('c', 'Set')); - - var es6Set = isImplemented() ? Set : polyfill$2; - - var isImplemented$b = function () { - var map, iterator, result; - if (typeof Map !== 'function') { return false; } - try { - // WebKit doesn't support arguments and crashes - map = new Map([['raz', 'one'], ['dwa', 'two'], ['trzy', 'three']]); - } catch (e) { - return false; - } - if (String(map) !== '[object Map]') { return false; } - if (map.size !== 3) { return false; } - if (typeof map.clear !== 'function') { return false; } - if (typeof map.delete !== 'function') { return false; } - if (typeof map.entries !== 'function') { return false; } - if (typeof map.forEach !== 'function') { return false; } - if (typeof map.get !== 'function') { return false; } - if (typeof map.has !== 'function') { return false; } - if (typeof map.keys !== 'function') { return false; } - if (typeof map.set !== 'function') { return false; } - if (typeof map.values !== 'function') { return false; } - - iterator = map.entries(); - result = iterator.next(); - if (result.done !== false) { return false; } - if (!result.value) { return false; } - if (result.value[0] !== 'raz') { return false; } - if (result.value[1] !== 'one') { return false; } - - return true; - }; + function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); + } - var forEach$2 = Array.prototype.forEach, create$6 = Object.create; + function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return _arrayLikeToArray(arr); + } - // eslint-disable-next-line no-unused-vars - var primitiveSet = function (arg/*, …args*/) { - var set = create$6(null); - forEach$2.call(arguments, function (name) { set[name] = true; }); - return set; - }; + function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; + } - var iteratorKinds = primitiveSet('key', - 'value', 'key+value'); + function _iterableToArray(iter) { + if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); + } - var iterator$2 = createCommonjsModule(function (module) { + function _iterableToArrayLimit(arr, i) { + var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; - var toStringTagSymbol = es6Symbol$1.toStringTag + if (_i == null) return; + var _arr = []; + var _n = true; + var _d = false; - , defineProperties = Object.defineProperties - , unBind = es6Iterator.prototype._unBind - , MapIterator; + var _s, _e; - MapIterator = module.exports = function (map, kind) { - if (!(this instanceof MapIterator)) { return new MapIterator(map, kind); } - es6Iterator.call(this, map.__mapKeysData__, map); - if (!kind || !iteratorKinds[kind]) { kind = 'key+value'; } - defineProperties(this, { - __kind__: d_1('', kind), - __values__: d_1('w', map.__mapValuesData__) - }); - }; - if (setPrototypeOf) { setPrototypeOf(MapIterator, es6Iterator); } - - MapIterator.prototype = Object.create(es6Iterator.prototype, { - constructor: d_1(MapIterator), - _resolve: d_1(function (i) { - if (this.__kind__ === 'value') { return this.__values__[i]; } - if (this.__kind__ === 'key') { return this.__list__[i]; } - return [this.__list__[i], this.__values__[i]]; - }), - _unBind: d_1(function () { - this.__values__ = null; - unBind.call(this); - }), - toString: d_1(function () { return '[object Map Iterator]'; }) - }); - Object.defineProperty(MapIterator.prototype, toStringTagSymbol, - d_1('c', 'Map Iterator')); - }); + try { + for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); - // Exports true if environment provides native `Map` implementation, - - var isNativeImplemented$1 = (function () { - if (typeof Map === 'undefined') { return false; } - return (Object.prototype.toString.call(new Map()) === '[object Map]'); - }()); - - var iterator$3 = validIterable - - , call$5 = Function.prototype.call - , defineProperties$3 = Object.defineProperties, getPrototypeOf$2 = Object.getPrototypeOf - , MapPoly; - - var polyfill$3 = MapPoly = function (/*iterable*/) { - var iterable = arguments[0], keys, values, self; - if (!(this instanceof MapPoly)) { throw new TypeError('Constructor requires \'new\''); } - if (isNativeImplemented$1 && setPrototypeOf && (Map !== MapPoly)) { - self = setPrototypeOf(new Map(), getPrototypeOf$2(this)); - } else { - self = this; - } - if (iterable != null) { iterator$3(iterable); } - defineProperties$3(self, { - __mapKeysData__: d_1('c', keys = []), - __mapValuesData__: d_1('c', values = []) - }); - if (!iterable) { return self; } - forOf(iterable, function (value) { - var key = validValue(value)[0]; - value = value[1]; - if (eIndexOf.call(keys, key) !== -1) { return; } - keys.push(key); - values.push(value); - }, self); - return self; - }; + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"] != null) _i["return"](); + } finally { + if (_d) throw _e; + } + } - if (isNativeImplemented$1) { - if (setPrototypeOf) { setPrototypeOf(MapPoly, Map); } - MapPoly.prototype = Object.create(Map.prototype, { - constructor: d_1(MapPoly) - }); - } - - eventEmitter(defineProperties$3(MapPoly.prototype, { - clear: d_1(function () { - if (!this.__mapKeysData__.length) { return; } - clear.call(this.__mapKeysData__); - clear.call(this.__mapValuesData__); - this.emit('_clear'); - }), - delete: d_1(function (key) { - var index = eIndexOf.call(this.__mapKeysData__, key); - if (index === -1) { return false; } - this.__mapKeysData__.splice(index, 1); - this.__mapValuesData__.splice(index, 1); - this.emit('_delete', index, key); - return true; - }), - entries: d_1(function () { return new iterator$2(this, 'key+value'); }), - forEach: d_1(function (cb/*, thisArg*/) { - var thisArg = arguments[1], iterator, result; - validCallable(cb); - iterator = this.entries(); - result = iterator._next(); - while (result !== undefined) { - call$5.call(cb, thisArg, this.__mapValuesData__[result], - this.__mapKeysData__[result], this); - result = iterator._next(); - } - }), - get: d_1(function (key) { - var index = eIndexOf.call(this.__mapKeysData__, key); - if (index === -1) { return; } - return this.__mapValuesData__[index]; - }), - has: d_1(function (key) { - return (eIndexOf.call(this.__mapKeysData__, key) !== -1); - }), - keys: d_1(function () { return new iterator$2(this, 'key'); }), - set: d_1(function (key, value) { - var index = eIndexOf.call(this.__mapKeysData__, key), emit; - if (index === -1) { - index = this.__mapKeysData__.push(key) - 1; - emit = true; - } - this.__mapValuesData__[index] = value; - if (emit) { this.emit('_add', index, key); } - return this; - }), - size: d_1.gs(function () { return this.__mapKeysData__.length; }), - values: d_1(function () { return new iterator$2(this, 'value'); }), - toString: d_1(function () { return '[object Map]'; }) - })); - Object.defineProperty(MapPoly.prototype, es6Symbol$1.iterator, d_1(function () { - return this.entries(); - })); - Object.defineProperty(MapPoly.prototype, es6Symbol$1.toStringTag, d_1('c', 'Map')); - - var es6Map = isImplemented$b() ? Map : polyfill$3; - - var toStr = Object.prototype.toString; - - var isArguments$1 = function isArguments(value) { - var str = toStr.call(value); - var isArgs = str === '[object Arguments]'; - if (!isArgs) { - isArgs = str !== '[object Array]' && - value !== null && - typeof value === 'object' && - typeof value.length === 'number' && - value.length >= 0 && - toStr.call(value.callee) === '[object Function]'; - } - return isArgs; - }; + return _arr; + } - var keysShim; - if (!Object.keys) { - // modified from https://github.com/es-shims/es5-shim - var has = Object.prototype.hasOwnProperty; - var toStr$1 = Object.prototype.toString; - var isArgs = isArguments$1; // eslint-disable-line global-require - var isEnumerable = Object.prototype.propertyIsEnumerable; - var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString'); - var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype'); - var dontEnums = [ - 'toString', - 'toLocaleString', - 'valueOf', - 'hasOwnProperty', - 'isPrototypeOf', - 'propertyIsEnumerable', - 'constructor' - ]; - var equalsConstructorPrototype = function (o) { - var ctor = o.constructor; - return ctor && ctor.prototype === o; - }; - var excludedKeys = { - $applicationCache: true, - $console: true, - $external: true, - $frame: true, - $frameElement: true, - $frames: true, - $innerHeight: true, - $innerWidth: true, - $onmozfullscreenchange: true, - $onmozfullscreenerror: true, - $outerHeight: true, - $outerWidth: true, - $pageXOffset: true, - $pageYOffset: true, - $parent: true, - $scrollLeft: true, - $scrollTop: true, - $scrollX: true, - $scrollY: true, - $self: true, - $webkitIndexedDB: true, - $webkitStorageInfo: true, - $window: true - }; - var hasAutomationEqualityBug = (function () { - /* global window */ - if (typeof window === 'undefined') { return false; } - for (var k in window) { - try { - if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') { - try { - equalsConstructorPrototype(window[k]); - } catch (e) { - return true; - } - } - } catch (e$1) { - return true; - } - } - return false; - }()); - var equalsConstructorPrototypeIfNotBuggy = function (o) { - /* global window */ - if (typeof window === 'undefined' || !hasAutomationEqualityBug) { - return equalsConstructorPrototype(o); - } - try { - return equalsConstructorPrototype(o); - } catch (e) { - return false; - } - }; - - keysShim = function keys(object) { - var isObject = object !== null && typeof object === 'object'; - var isFunction = toStr$1.call(object) === '[object Function]'; - var isArguments = isArgs(object); - var isString = isObject && toStr$1.call(object) === '[object String]'; - var theKeys = []; - - if (!isObject && !isFunction && !isArguments) { - throw new TypeError('Object.keys called on a non-object'); - } - - var skipProto = hasProtoEnumBug && isFunction; - if (isString && object.length > 0 && !has.call(object, 0)) { - for (var i = 0; i < object.length; ++i) { - theKeys.push(String(i)); - } - } - - if (isArguments && object.length > 0) { - for (var j = 0; j < object.length; ++j) { - theKeys.push(String(j)); - } - } else { - for (var name in object) { - if (!(skipProto && name === 'prototype') && has.call(object, name)) { - theKeys.push(String(name)); - } - } - } - - if (hasDontEnumBug) { - var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object); - - for (var k = 0; k < dontEnums.length; ++k) { - if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) { - theKeys.push(dontEnums[k]); - } - } - } - return theKeys; - }; - } - var implementation$1 = keysShim; - - var slice = Array.prototype.slice; - - - var origKeys = Object.keys; - var keysShim$1 = origKeys ? function keys(o) { return origKeys(o); } : implementation$1; - - var originalKeys = Object.keys; - - keysShim$1.shim = function shimObjectKeys() { - if (Object.keys) { - var keysWorksWithArguments = (function () { - // Safari 5.0 bug - var args = Object.keys(arguments); - return args && args.length === arguments.length; - }(1, 2)); - if (!keysWorksWithArguments) { - Object.keys = function keys(object) { // eslint-disable-line func-name-matching - if (isArguments$1(object)) { - return originalKeys(slice.call(object)); - } - return originalKeys(object); - }; - } - } else { - Object.keys = keysShim$1; - } - return Object.keys || keysShim$1; - }; + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); + } - var objectKeys = keysShim$1; + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; - var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol'; + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - var toStr$2 = Object.prototype.toString; - var concat = Array.prototype.concat; - var origDefineProperty = Object.defineProperty; + return arr2; + } - var isFunction$1 = function (fn) { - return typeof fn === 'function' && toStr$2.call(fn) === '[object Function]'; - }; + function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } - var arePropertyDescriptorsSupported = function () { - var obj = {}; - try { - origDefineProperty(obj, 'x', { enumerable: false, value: obj }); - // eslint-disable-next-line no-unused-vars, no-restricted-syntax - for (var _ in obj) { // jscs:ignore disallowUnusedVariables - return false; - } - return obj.x === obj; - } catch (e) { /* this is IE 8. */ - return false; - } - }; - var supportsDescriptors = origDefineProperty && arePropertyDescriptorsSupported(); - - var defineProperty$8 = function (object, name, value, predicate) { - if (name in object && (!isFunction$1(predicate) || !predicate())) { - return; - } - if (supportsDescriptors) { - origDefineProperty(object, name, { - configurable: true, - enumerable: false, - value: value, - writable: true - }); - } else { - object[name] = value; - } - }; + function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } - var defineProperties$4 = function (object, map) { - var predicates = arguments.length > 2 ? arguments[2] : {}; - var props = objectKeys(map); - if (hasSymbols) { - props = concat.call(props, Object.getOwnPropertySymbols(map)); - } - for (var i = 0; i < props.length; i += 1) { - defineProperty$8(object, props[i], map[props[i]], predicates[props[i]]); - } - }; + function _createForOfIteratorHelper(o, allowArrayLike) { + var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; - defineProperties$4.supportsDescriptors = !!supportsDescriptors; + if (!it) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + + var F = function () {}; - var defineProperties_1 = defineProperties$4; + return { + s: F, + n: function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }, + e: function (e) { + throw e; + }, + f: F + }; + } - /* eslint complexity: [2, 18], max-statements: [2, 33] */ - var shams = function hasSymbols() { - if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; } - if (typeof Symbol.iterator === 'symbol') { return true; } + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } - var obj = {}; - var sym = Symbol('test'); - var symObj = Object(sym); - if (typeof sym === 'string') { return false; } + var normalCompletion = true, + didErr = false, + err; + return { + s: function () { + it = it.call(o); + }, + n: function () { + var step = it.next(); + normalCompletion = step.done; + return step; + }, + e: function (e) { + didErr = true; + err = e; + }, + f: function () { + try { + if (!normalCompletion && it.return != null) it.return(); + } finally { + if (didErr) throw err; + } + } + }; + } - if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; } - if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; } + var $$1d = _export; + var global$12 = global$1o; - // temp disabled per https://github.com/ljharb/object.assign/issues/17 - // if (sym instanceof Symbol) { return false; } - // temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4 - // if (!(symObj instanceof Symbol)) { return false; } + // `globalThis` object + // https://tc39.es/ecma262/#sec-globalthis + $$1d({ global: true }, { + globalThis: global$12 + }); - // if (typeof Symbol.prototype.toString !== 'function') { return false; } - // if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; } + var global$11 = global$1o; - var symVal = 42; - obj[sym] = symVal; - for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax - if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; } + var path$1 = global$11; - if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; } + var wellKnownSymbolWrapped = {}; - var syms = Object.getOwnPropertySymbols(obj); - if (syms.length !== 1 || syms[0] !== sym) { return false; } + var wellKnownSymbol$r = wellKnownSymbol$t; - if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; } + wellKnownSymbolWrapped.f = wellKnownSymbol$r; - if (typeof Object.getOwnPropertyDescriptor === 'function') { - var descriptor = Object.getOwnPropertyDescriptor(obj, sym); - if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; } - } + var path = path$1; + var hasOwn$e = hasOwnProperty_1; + var wrappedWellKnownSymbolModule$1 = wellKnownSymbolWrapped; + var defineProperty$c = objectDefineProperty.f; - return true; + var defineWellKnownSymbol$4 = function (NAME) { + var Symbol = path.Symbol || (path.Symbol = {}); + if (!hasOwn$e(Symbol, NAME)) defineProperty$c(Symbol, NAME, { + value: wrappedWellKnownSymbolModule$1.f(NAME) + }); }; - var origSymbol = commonjsGlobal.Symbol; + var defineWellKnownSymbol$3 = defineWellKnownSymbol$4; + // `Symbol.iterator` well-known symbol + // https://tc39.es/ecma262/#sec-symbol.iterator + defineWellKnownSymbol$3('iterator'); - var hasSymbols$1 = function hasNativeSymbols() { - if (typeof origSymbol !== 'function') { return false; } - if (typeof Symbol !== 'function') { return false; } - if (typeof origSymbol('foo') !== 'symbol') { return false; } - if (typeof Symbol('bar') !== 'symbol') { return false; } + var objectDefineProperties = {}; - return shams(); + var internalObjectKeys = objectKeysInternal; + var enumBugKeys$1 = enumBugKeys$3; + + // `Object.keys` method + // https://tc39.es/ecma262/#sec-object.keys + // eslint-disable-next-line es/no-object-keys -- safe + var objectKeys$4 = Object.keys || function keys(O) { + return internalObjectKeys(O, enumBugKeys$1); }; - /* eslint no-invalid-this: 1 */ + var DESCRIPTORS$j = descriptors; + var V8_PROTOTYPE_DEFINE_BUG = v8PrototypeDefineBug; + var definePropertyModule$5 = objectDefineProperty; + var anObject$k = anObject$n; + var toIndexedObject$9 = toIndexedObject$d; + var objectKeys$3 = objectKeys$4; - var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible '; - var slice$1 = Array.prototype.slice; - var toStr$3 = Object.prototype.toString; - var funcType = '[object Function]'; + // `Object.defineProperties` method + // https://tc39.es/ecma262/#sec-object.defineproperties + // eslint-disable-next-line es/no-object-defineproperties -- safe + objectDefineProperties.f = DESCRIPTORS$j && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) { + anObject$k(O); + var props = toIndexedObject$9(Properties); + var keys = objectKeys$3(Properties); + var length = keys.length; + var index = 0; + var key; + while (length > index) definePropertyModule$5.f(O, key = keys[index++], props[key]); + return O; + }; + + var getBuiltIn$7 = getBuiltIn$b; + + var html$2 = getBuiltIn$7('document', 'documentElement'); + + /* global ActiveXObject -- old IE, WSH */ + + var anObject$j = anObject$n; + var definePropertiesModule$1 = objectDefineProperties; + var enumBugKeys = enumBugKeys$3; + var hiddenKeys$2 = hiddenKeys$6; + var html$1 = html$2; + var documentCreateElement$1 = documentCreateElement$2; + var sharedKey$2 = sharedKey$4; + + var GT = '>'; + var LT = '<'; + var PROTOTYPE$2 = 'prototype'; + var SCRIPT = 'script'; + var IE_PROTO$1 = sharedKey$2('IE_PROTO'); + + var EmptyConstructor = function () { /* empty */ }; + + var scriptTag = function (content) { + return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; + }; + + // Create object with fake `null` prototype: use ActiveX Object with cleared prototype + var NullProtoObjectViaActiveX = function (activeXDocument) { + activeXDocument.write(scriptTag('')); + activeXDocument.close(); + var temp = activeXDocument.parentWindow.Object; + activeXDocument = null; // avoid memory leak + return temp; + }; + + // Create object with fake `null` prototype: use iframe Object with cleared prototype + var NullProtoObjectViaIFrame = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = documentCreateElement$1('iframe'); + var JS = 'java' + SCRIPT + ':'; + var iframeDocument; + iframe.style.display = 'none'; + html$1.appendChild(iframe); + // https://github.com/zloirock/core-js/issues/475 + iframe.src = String(JS); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(scriptTag('document.F=Object')); + iframeDocument.close(); + return iframeDocument.F; + }; + + // Check for document.domain and active x support + // No need to use active x approach when document.domain is not set + // see https://github.com/es-shims/es5-shim/issues/150 + // variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 + // avoid IE GC bug + var activeXDocument; + var NullProtoObject = function () { + try { + activeXDocument = new ActiveXObject('htmlfile'); + } catch (error) { /* ignore */ } + NullProtoObject = typeof document != 'undefined' + ? document.domain && activeXDocument + ? NullProtoObjectViaActiveX(activeXDocument) // old IE + : NullProtoObjectViaIFrame() + : NullProtoObjectViaActiveX(activeXDocument); // WSH + var length = enumBugKeys.length; + while (length--) delete NullProtoObject[PROTOTYPE$2][enumBugKeys[length]]; + return NullProtoObject(); + }; + + hiddenKeys$2[IE_PROTO$1] = true; + + // `Object.create` method + // https://tc39.es/ecma262/#sec-object.create + var objectCreate = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + EmptyConstructor[PROTOTYPE$2] = anObject$j(O); + result = new EmptyConstructor(); + EmptyConstructor[PROTOTYPE$2] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO$1] = O; + } else result = NullProtoObject(); + return Properties === undefined ? result : definePropertiesModule$1.f(result, Properties); + }; + + var wellKnownSymbol$q = wellKnownSymbol$t; + var create$a = objectCreate; + var definePropertyModule$4 = objectDefineProperty; + + var UNSCOPABLES = wellKnownSymbol$q('unscopables'); + var ArrayPrototype$1 = Array.prototype; + + // Array.prototype[@@unscopables] + // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables + if (ArrayPrototype$1[UNSCOPABLES] == undefined) { + definePropertyModule$4.f(ArrayPrototype$1, UNSCOPABLES, { + configurable: true, + value: create$a(null) + }); + } - var implementation$2 = function bind(that) { - var target = this; - if (typeof target !== 'function' || toStr$3.call(target) !== funcType) { - throw new TypeError(ERROR_MESSAGE + target); - } - var args = slice$1.call(arguments, 1); + // add a key to Array.prototype[@@unscopables] + var addToUnscopables$6 = function (key) { + ArrayPrototype$1[UNSCOPABLES][key] = true; + }; - var bound; - var binder = function () { - if (this instanceof bound) { - var result = target.apply( - this, - args.concat(slice$1.call(arguments)) - ); - if (Object(result) === result) { - return result; - } - return this; - } else { - return target.apply( - that, - args.concat(slice$1.call(arguments)) - ); - } - }; + var iterators = {}; - var boundLength = Math.max(0, target.length - args.length); - var boundArgs = []; - for (var i = 0; i < boundLength; i++) { - boundArgs.push('$' + i); - } + var fails$N = fails$V; - bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder); + var correctPrototypeGetter = !fails$N(function () { + function F() { /* empty */ } + F.prototype.constructor = null; + // eslint-disable-next-line es/no-object-getprototypeof -- required for testing + return Object.getPrototypeOf(new F()) !== F.prototype; + }); - if (target.prototype) { - var Empty = function Empty() {}; - Empty.prototype = target.prototype; - bound.prototype = new Empty(); - Empty.prototype = null; - } + var global$10 = global$1o; + var hasOwn$d = hasOwnProperty_1; + var isCallable$h = isCallable$r; + var toObject$g = toObject$i; + var sharedKey$1 = sharedKey$4; + var CORRECT_PROTOTYPE_GETTER$1 = correctPrototypeGetter; + + var IE_PROTO = sharedKey$1('IE_PROTO'); + var Object$2 = global$10.Object; + var ObjectPrototype$4 = Object$2.prototype; + + // `Object.getPrototypeOf` method + // https://tc39.es/ecma262/#sec-object.getprototypeof + var objectGetPrototypeOf = CORRECT_PROTOTYPE_GETTER$1 ? Object$2.getPrototypeOf : function (O) { + var object = toObject$g(O); + if (hasOwn$d(object, IE_PROTO)) return object[IE_PROTO]; + var constructor = object.constructor; + if (isCallable$h(constructor) && object instanceof constructor) { + return constructor.prototype; + } return object instanceof Object$2 ? ObjectPrototype$4 : null; + }; + + var fails$M = fails$V; + var isCallable$g = isCallable$r; + var getPrototypeOf$4 = objectGetPrototypeOf; + var redefine$e = redefine$h.exports; + var wellKnownSymbol$p = wellKnownSymbol$t; + + var ITERATOR$a = wellKnownSymbol$p('iterator'); + var BUGGY_SAFARI_ITERATORS$1 = false; + + // `%IteratorPrototype%` object + // https://tc39.es/ecma262/#sec-%iteratorprototype%-object + var IteratorPrototype$2, PrototypeOfArrayIteratorPrototype, arrayIterator; + + /* eslint-disable es/no-array-prototype-keys -- safe */ + if ([].keys) { + arrayIterator = [].keys(); + // Safari 8 has buggy iterators w/o `next` + if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS$1 = true; + else { + PrototypeOfArrayIteratorPrototype = getPrototypeOf$4(getPrototypeOf$4(arrayIterator)); + if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype$2 = PrototypeOfArrayIteratorPrototype; + } + } - return bound; - }; + var NEW_ITERATOR_PROTOTYPE = IteratorPrototype$2 == undefined || fails$M(function () { + var test = {}; + // FF44- legacy iterators case + return IteratorPrototype$2[ITERATOR$a].call(test) !== test; + }); - var functionBind = Function.prototype.bind || implementation$2; + if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype$2 = {}; - /* globals - Atomics, - SharedArrayBuffer, - */ + // `%IteratorPrototype%[@@iterator]()` method + // https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator + if (!isCallable$g(IteratorPrototype$2[ITERATOR$a])) { + redefine$e(IteratorPrototype$2, ITERATOR$a, function () { + return this; + }); + } - var undefined$1; - - var $TypeError = TypeError; - - var $gOPD = Object.getOwnPropertyDescriptor; - if ($gOPD) { - try { - $gOPD({}, ''); - } catch (e) { - $gOPD = null; // this is IE 8, which has a broken gOPD - } - } - - var throwTypeError = function () { throw new $TypeError(); }; - var ThrowTypeError = $gOPD - ? (function () { - try { - // eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties - arguments.callee; // IE 8 does not throw here - return throwTypeError; - } catch (calleeThrows) { - try { - // IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '') - return $gOPD(arguments, 'callee').get; - } catch (gOPDthrows) { - return throwTypeError; - } - } - }()) - : throwTypeError; - - var hasSymbols$2 = hasSymbols$1(); - - var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto - var generatorFunction = undefined$1; - var asyncFunction = undefined$1; - var asyncGenFunction = undefined$1; - - var TypedArray = typeof Uint8Array === 'undefined' ? undefined$1 : getProto(Uint8Array); - - var INTRINSICS = { - '%Array%': Array, - '%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined$1 : ArrayBuffer, - '%ArrayBufferPrototype%': typeof ArrayBuffer === 'undefined' ? undefined$1 : ArrayBuffer.prototype, - '%ArrayIteratorPrototype%': hasSymbols$2 ? getProto([][Symbol.iterator]()) : undefined$1, - '%ArrayPrototype%': Array.prototype, - '%ArrayProto_entries%': Array.prototype.entries, - '%ArrayProto_forEach%': Array.prototype.forEach, - '%ArrayProto_keys%': Array.prototype.keys, - '%ArrayProto_values%': Array.prototype.values, - '%AsyncFromSyncIteratorPrototype%': undefined$1, - '%AsyncFunction%': asyncFunction, - '%AsyncFunctionPrototype%': undefined$1, - '%AsyncGenerator%': undefined$1, - '%AsyncGeneratorFunction%': asyncGenFunction, - '%AsyncGeneratorPrototype%': undefined$1, - '%AsyncIteratorPrototype%': undefined$1, - '%Atomics%': typeof Atomics === 'undefined' ? undefined$1 : Atomics, - '%Boolean%': Boolean, - '%BooleanPrototype%': Boolean.prototype, - '%DataView%': typeof DataView === 'undefined' ? undefined$1 : DataView, - '%DataViewPrototype%': typeof DataView === 'undefined' ? undefined$1 : DataView.prototype, - '%Date%': Date, - '%DatePrototype%': Date.prototype, - '%decodeURI%': decodeURI, - '%decodeURIComponent%': decodeURIComponent, - '%encodeURI%': encodeURI, - '%encodeURIComponent%': encodeURIComponent, - '%Error%': Error, - '%ErrorPrototype%': Error.prototype, - '%eval%': eval, // eslint-disable-line no-eval - '%EvalError%': EvalError, - '%EvalErrorPrototype%': EvalError.prototype, - '%Float32Array%': typeof Float32Array === 'undefined' ? undefined$1 : Float32Array, - '%Float32ArrayPrototype%': typeof Float32Array === 'undefined' ? undefined$1 : Float32Array.prototype, - '%Float64Array%': typeof Float64Array === 'undefined' ? undefined$1 : Float64Array, - '%Float64ArrayPrototype%': typeof Float64Array === 'undefined' ? undefined$1 : Float64Array.prototype, - '%Function%': Function, - '%FunctionPrototype%': Function.prototype, - '%Generator%': undefined$1, - '%GeneratorFunction%': generatorFunction, - '%GeneratorPrototype%': undefined$1, - '%Int8Array%': typeof Int8Array === 'undefined' ? undefined$1 : Int8Array, - '%Int8ArrayPrototype%': typeof Int8Array === 'undefined' ? undefined$1 : Int8Array.prototype, - '%Int16Array%': typeof Int16Array === 'undefined' ? undefined$1 : Int16Array, - '%Int16ArrayPrototype%': typeof Int16Array === 'undefined' ? undefined$1 : Int8Array.prototype, - '%Int32Array%': typeof Int32Array === 'undefined' ? undefined$1 : Int32Array, - '%Int32ArrayPrototype%': typeof Int32Array === 'undefined' ? undefined$1 : Int32Array.prototype, - '%isFinite%': isFinite, - '%isNaN%': isNaN, - '%IteratorPrototype%': hasSymbols$2 ? getProto(getProto([][Symbol.iterator]())) : undefined$1, - '%JSON%': typeof JSON === 'object' ? JSON : undefined$1, - '%JSONParse%': typeof JSON === 'object' ? JSON.parse : undefined$1, - '%Map%': typeof Map === 'undefined' ? undefined$1 : Map, - '%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols$2 ? undefined$1 : getProto(new Map()[Symbol.iterator]()), - '%MapPrototype%': typeof Map === 'undefined' ? undefined$1 : Map.prototype, - '%Math%': Math, - '%Number%': Number, - '%NumberPrototype%': Number.prototype, - '%Object%': Object, - '%ObjectPrototype%': Object.prototype, - '%ObjProto_toString%': Object.prototype.toString, - '%ObjProto_valueOf%': Object.prototype.valueOf, - '%parseFloat%': parseFloat, - '%parseInt%': parseInt, - '%Promise%': typeof Promise === 'undefined' ? undefined$1 : Promise, - '%PromisePrototype%': typeof Promise === 'undefined' ? undefined$1 : Promise.prototype, - '%PromiseProto_then%': typeof Promise === 'undefined' ? undefined$1 : Promise.prototype.then, - '%Promise_all%': typeof Promise === 'undefined' ? undefined$1 : Promise.all, - '%Promise_reject%': typeof Promise === 'undefined' ? undefined$1 : Promise.reject, - '%Promise_resolve%': typeof Promise === 'undefined' ? undefined$1 : Promise.resolve, - '%Proxy%': typeof Proxy === 'undefined' ? undefined$1 : Proxy, - '%RangeError%': RangeError, - '%RangeErrorPrototype%': RangeError.prototype, - '%ReferenceError%': ReferenceError, - '%ReferenceErrorPrototype%': ReferenceError.prototype, - '%Reflect%': typeof Reflect === 'undefined' ? undefined$1 : Reflect, - '%RegExp%': RegExp, - '%RegExpPrototype%': RegExp.prototype, - '%Set%': typeof Set === 'undefined' ? undefined$1 : Set, - '%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols$2 ? undefined$1 : getProto(new Set()[Symbol.iterator]()), - '%SetPrototype%': typeof Set === 'undefined' ? undefined$1 : Set.prototype, - '%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined$1 : SharedArrayBuffer, - '%SharedArrayBufferPrototype%': typeof SharedArrayBuffer === 'undefined' ? undefined$1 : SharedArrayBuffer.prototype, - '%String%': String, - '%StringIteratorPrototype%': hasSymbols$2 ? getProto(''[Symbol.iterator]()) : undefined$1, - '%StringPrototype%': String.prototype, - '%Symbol%': hasSymbols$2 ? Symbol : undefined$1, - '%SymbolPrototype%': hasSymbols$2 ? Symbol.prototype : undefined$1, - '%SyntaxError%': SyntaxError, - '%SyntaxErrorPrototype%': SyntaxError.prototype, - '%ThrowTypeError%': ThrowTypeError, - '%TypedArray%': TypedArray, - '%TypedArrayPrototype%': TypedArray ? TypedArray.prototype : undefined$1, - '%TypeError%': $TypeError, - '%TypeErrorPrototype%': $TypeError.prototype, - '%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined$1 : Uint8Array, - '%Uint8ArrayPrototype%': typeof Uint8Array === 'undefined' ? undefined$1 : Uint8Array.prototype, - '%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined$1 : Uint8ClampedArray, - '%Uint8ClampedArrayPrototype%': typeof Uint8ClampedArray === 'undefined' ? undefined$1 : Uint8ClampedArray.prototype, - '%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined$1 : Uint16Array, - '%Uint16ArrayPrototype%': typeof Uint16Array === 'undefined' ? undefined$1 : Uint16Array.prototype, - '%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined$1 : Uint32Array, - '%Uint32ArrayPrototype%': typeof Uint32Array === 'undefined' ? undefined$1 : Uint32Array.prototype, - '%URIError%': URIError, - '%URIErrorPrototype%': URIError.prototype, - '%WeakMap%': typeof WeakMap === 'undefined' ? undefined$1 : WeakMap, - '%WeakMapPrototype%': typeof WeakMap === 'undefined' ? undefined$1 : WeakMap.prototype, - '%WeakSet%': typeof WeakSet === 'undefined' ? undefined$1 : WeakSet, - '%WeakSetPrototype%': typeof WeakSet === 'undefined' ? undefined$1 : WeakSet.prototype + var iteratorsCore = { + IteratorPrototype: IteratorPrototype$2, + BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS$1 }; + var defineProperty$b = objectDefineProperty.f; + var hasOwn$c = hasOwnProperty_1; + var wellKnownSymbol$o = wellKnownSymbol$t; - var $replace = functionBind.call(Function.call, String.prototype.replace); + var TO_STRING_TAG$4 = wellKnownSymbol$o('toStringTag'); - /* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */ - var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g; - var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */ - var stringToPath = function stringToPath(string) { - var result = []; - $replace(string, rePropName, function (match, number, quote, subString) { - result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : (number || match); - }); - return result; + var setToStringTag$a = function (target, TAG, STATIC) { + if (target && !STATIC) target = target.prototype; + if (target && !hasOwn$c(target, TO_STRING_TAG$4)) { + defineProperty$b(target, TO_STRING_TAG$4, { configurable: true, value: TAG }); + } }; - /* end adaptation */ - var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) { - if (!(name in INTRINSICS)) { - throw new SyntaxError('intrinsic ' + name + ' does not exist!'); - } + var IteratorPrototype$1 = iteratorsCore.IteratorPrototype; + var create$9 = objectCreate; + var createPropertyDescriptor$4 = createPropertyDescriptor$7; + var setToStringTag$9 = setToStringTag$a; + var Iterators$4 = iterators; - // istanbul ignore if // hopefully this is impossible to test :-) - if (typeof INTRINSICS[name] === 'undefined' && !allowMissing) { - throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!'); - } - - return INTRINSICS[name]; - }; + var returnThis$1 = function () { return this; }; - var GetIntrinsic = function GetIntrinsic(name, allowMissing) { - if (typeof name !== 'string' || name.length === 0) { - throw new TypeError('intrinsic name must be a non-empty string'); - } - if (arguments.length > 1 && typeof allowMissing !== 'boolean') { - throw new TypeError('"allowMissing" argument must be a boolean'); - } - - var parts = stringToPath(name); - - var value = getBaseIntrinsic('%' + (parts.length > 0 ? parts[0] : '') + '%', allowMissing); - for (var i = 1; i < parts.length; i += 1) { - if (value != null) { - if ($gOPD && (i + 1) >= parts.length) { - var desc = $gOPD(value, parts[i]); - if (!allowMissing && !(parts[i] in value)) { - throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.'); - } - value = desc ? (desc.get || desc.value) : value[parts[i]]; - } else { - value = value[parts[i]]; - } - } - } - return value; + var createIteratorConstructor$2 = function (IteratorConstructor, NAME, next, ENUMERABLE_NEXT) { + var TO_STRING_TAG = NAME + ' Iterator'; + IteratorConstructor.prototype = create$9(IteratorPrototype$1, { next: createPropertyDescriptor$4(+!ENUMERABLE_NEXT, next) }); + setToStringTag$9(IteratorConstructor, TO_STRING_TAG, false); + Iterators$4[TO_STRING_TAG] = returnThis$1; + return IteratorConstructor; }; - var $TypeError$1 = GetIntrinsic('%TypeError%'); + var global$$ = global$1o; + var isCallable$f = isCallable$r; - // http://www.ecma-international.org/ecma-262/5.1/#sec-9.10 + var String$4 = global$$.String; + var TypeError$i = global$$.TypeError; - var CheckObjectCoercible = function CheckObjectCoercible(value, optMessage) { - if (value == null) { - throw new $TypeError$1(optMessage || ('Cannot call method on ' + value)); - } - return value; + var aPossiblePrototype$1 = function (argument) { + if (typeof argument == 'object' || isCallable$f(argument)) return argument; + throw TypeError$i("Can't set " + String$4(argument) + ' as a prototype'); }; - var RequireObjectCoercible = CheckObjectCoercible; + /* eslint-disable no-proto -- safe */ - var $Object = GetIntrinsic('%Object%'); + var uncurryThis$M = functionUncurryThis; + var anObject$i = anObject$n; + var aPossiblePrototype = aPossiblePrototype$1; + // `Object.setPrototypeOf` method + // https://tc39.es/ecma262/#sec-object.setprototypeof + // Works with __proto__ only. Old v8 can't work with null proto objects. + // eslint-disable-next-line es/no-object-setprototypeof -- safe + var objectSetPrototypeOf = Object.setPrototypeOf || ('__proto__' in {} ? function () { + var CORRECT_SETTER = false; + var test = {}; + var setter; + try { + // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe + setter = uncurryThis$M(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set); + setter(test, []); + CORRECT_SETTER = test instanceof Array; + } catch (error) { /* empty */ } + return function setPrototypeOf(O, proto) { + anObject$i(O); + aPossiblePrototype(proto); + if (CORRECT_SETTER) setter(O, proto); + else O.__proto__ = proto; + return O; + }; + }() : undefined); + + var $$1c = _export; + var call$l = functionCall; + var FunctionName$1 = functionName; + var isCallable$e = isCallable$r; + var createIteratorConstructor$1 = createIteratorConstructor$2; + var getPrototypeOf$3 = objectGetPrototypeOf; + var setPrototypeOf$6 = objectSetPrototypeOf; + var setToStringTag$8 = setToStringTag$a; + var createNonEnumerableProperty$7 = createNonEnumerableProperty$b; + var redefine$d = redefine$h.exports; + var wellKnownSymbol$n = wellKnownSymbol$t; + var Iterators$3 = iterators; + var IteratorsCore = iteratorsCore; + + var PROPER_FUNCTION_NAME$3 = FunctionName$1.PROPER; + var CONFIGURABLE_FUNCTION_NAME$1 = FunctionName$1.CONFIGURABLE; + var IteratorPrototype = IteratorsCore.IteratorPrototype; + var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS; + var ITERATOR$9 = wellKnownSymbol$n('iterator'); + var KEYS = 'keys'; + var VALUES = 'values'; + var ENTRIES = 'entries'; + + var returnThis = function () { return this; }; + + var defineIterator$3 = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) { + createIteratorConstructor$1(IteratorConstructor, NAME, next); + + var getIterationMethod = function (KIND) { + if (KIND === DEFAULT && defaultIterator) return defaultIterator; + if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND]; + switch (KIND) { + case KEYS: return function keys() { return new IteratorConstructor(this, KIND); }; + case VALUES: return function values() { return new IteratorConstructor(this, KIND); }; + case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); }; + } return function () { return new IteratorConstructor(this); }; + }; + + var TO_STRING_TAG = NAME + ' Iterator'; + var INCORRECT_VALUES_NAME = false; + var IterablePrototype = Iterable.prototype; + var nativeIterator = IterablePrototype[ITERATOR$9] + || IterablePrototype['@@iterator'] + || DEFAULT && IterablePrototype[DEFAULT]; + var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT); + var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator; + var CurrentIteratorPrototype, methods, KEY; + + // fix native + if (anyNativeIterator) { + CurrentIteratorPrototype = getPrototypeOf$3(anyNativeIterator.call(new Iterable())); + if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) { + if (getPrototypeOf$3(CurrentIteratorPrototype) !== IteratorPrototype) { + if (setPrototypeOf$6) { + setPrototypeOf$6(CurrentIteratorPrototype, IteratorPrototype); + } else if (!isCallable$e(CurrentIteratorPrototype[ITERATOR$9])) { + redefine$d(CurrentIteratorPrototype, ITERATOR$9, returnThis); + } + } + // Set @@toStringTag to native iterators + setToStringTag$8(CurrentIteratorPrototype, TO_STRING_TAG, true); + } + } + // fix Array.prototype.{ values, @@iterator }.name in V8 / FF + if (PROPER_FUNCTION_NAME$3 && DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) { + if (CONFIGURABLE_FUNCTION_NAME$1) { + createNonEnumerableProperty$7(IterablePrototype, 'name', VALUES); + } else { + INCORRECT_VALUES_NAME = true; + defaultIterator = function values() { return call$l(nativeIterator, this); }; + } + } - // https://www.ecma-international.org/ecma-262/6.0/#sec-toobject + // export additional methods + if (DEFAULT) { + methods = { + values: getIterationMethod(VALUES), + keys: IS_SET ? defaultIterator : getIterationMethod(KEYS), + entries: getIterationMethod(ENTRIES) + }; + if (FORCED) for (KEY in methods) { + if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) { + redefine$d(IterablePrototype, KEY, methods[KEY]); + } + } else $$1c({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods); + } + + // define iterator + if (IterablePrototype[ITERATOR$9] !== defaultIterator) { + redefine$d(IterablePrototype, ITERATOR$9, defaultIterator, { name: DEFAULT }); + } + Iterators$3[NAME] = defaultIterator; + + return methods; + }; + + var toIndexedObject$8 = toIndexedObject$d; + var addToUnscopables$5 = addToUnscopables$6; + var Iterators$2 = iterators; + var InternalStateModule$8 = internalState; + var defineProperty$a = objectDefineProperty.f; + var defineIterator$2 = defineIterator$3; + var DESCRIPTORS$i = descriptors; + + var ARRAY_ITERATOR = 'Array Iterator'; + var setInternalState$8 = InternalStateModule$8.set; + var getInternalState$6 = InternalStateModule$8.getterFor(ARRAY_ITERATOR); + + // `Array.prototype.entries` method + // https://tc39.es/ecma262/#sec-array.prototype.entries + // `Array.prototype.keys` method + // https://tc39.es/ecma262/#sec-array.prototype.keys + // `Array.prototype.values` method + // https://tc39.es/ecma262/#sec-array.prototype.values + // `Array.prototype[@@iterator]` method + // https://tc39.es/ecma262/#sec-array.prototype-@@iterator + // `CreateArrayIterator` internal method + // https://tc39.es/ecma262/#sec-createarrayiterator + var es_array_iterator = defineIterator$2(Array, 'Array', function (iterated, kind) { + setInternalState$8(this, { + type: ARRAY_ITERATOR, + target: toIndexedObject$8(iterated), // target + index: 0, // next index + kind: kind // kind + }); + // `%ArrayIteratorPrototype%.next` method + // https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next + }, function () { + var state = getInternalState$6(this); + var target = state.target; + var kind = state.kind; + var index = state.index++; + if (!target || index >= target.length) { + state.target = undefined; + return { value: undefined, done: true }; + } + if (kind == 'keys') return { value: index, done: false }; + if (kind == 'values') return { value: target[index], done: false }; + return { value: [index, target[index]], done: false }; + }, 'values'); + + // argumentsList[@@iterator] is %ArrayProto_values% + // https://tc39.es/ecma262/#sec-createunmappedargumentsobject + // https://tc39.es/ecma262/#sec-createmappedargumentsobject + var values = Iterators$2.Arguments = Iterators$2.Array; + + // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables + addToUnscopables$5('keys'); + addToUnscopables$5('values'); + addToUnscopables$5('entries'); + + // V8 ~ Chrome 45- bug + if (DESCRIPTORS$i && values.name !== 'values') try { + defineProperty$a(values, 'name', { value: 'values' }); + } catch (error) { /* empty */ } + + var wellKnownSymbol$m = wellKnownSymbol$t; + + var TO_STRING_TAG$3 = wellKnownSymbol$m('toStringTag'); + var test$2 = {}; + + test$2[TO_STRING_TAG$3] = 'z'; + + var toStringTagSupport = String(test$2) === '[object z]'; + + var global$_ = global$1o; + var TO_STRING_TAG_SUPPORT$2 = toStringTagSupport; + var isCallable$d = isCallable$r; + var classofRaw = classofRaw$1; + var wellKnownSymbol$l = wellKnownSymbol$t; + + var TO_STRING_TAG$2 = wellKnownSymbol$l('toStringTag'); + var Object$1 = global$_.Object; + + // ES3 wrong here + var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments'; + + // fallback for IE11 Script Access Denied error + var tryGet = function (it, key) { + try { + return it[key]; + } catch (error) { /* empty */ } + }; + + // getting tag from ES6+ `Object.prototype.toString` + var classof$d = TO_STRING_TAG_SUPPORT$2 ? classofRaw : function (it) { + var O, tag, result; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (tag = tryGet(O = Object$1(it), TO_STRING_TAG$2)) == 'string' ? tag + // builtinTag case + : CORRECT_ARGUMENTS ? classofRaw(O) + // ES3 arguments fallback + : (result = classofRaw(O)) == 'Object' && isCallable$d(O.callee) ? 'Arguments' : result; + }; + + var TO_STRING_TAG_SUPPORT$1 = toStringTagSupport; + var classof$c = classof$d; + + // `Object.prototype.toString` method implementation + // https://tc39.es/ecma262/#sec-object.prototype.tostring + var objectToString$1 = TO_STRING_TAG_SUPPORT$1 ? {}.toString : function toString() { + return '[object ' + classof$c(this) + ']'; + }; + + var TO_STRING_TAG_SUPPORT = toStringTagSupport; + var redefine$c = redefine$h.exports; + var toString$l = objectToString$1; + + // `Object.prototype.toString` method + // https://tc39.es/ecma262/#sec-object.prototype.tostring + if (!TO_STRING_TAG_SUPPORT) { + redefine$c(Object.prototype, 'toString', toString$l, { unsafe: true }); + } + + var global$Z = global$1o; + var classof$b = classof$d; + + var String$3 = global$Z.String; + + var toString$k = function (argument) { + if (classof$b(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string'); + return String$3(argument); + }; + + var uncurryThis$L = functionUncurryThis; + var toIntegerOrInfinity$8 = toIntegerOrInfinity$b; + var toString$j = toString$k; + var requireObjectCoercible$b = requireObjectCoercible$e; + + var charAt$8 = uncurryThis$L(''.charAt); + var charCodeAt$2 = uncurryThis$L(''.charCodeAt); + var stringSlice$b = uncurryThis$L(''.slice); + + var createMethod$5 = function (CONVERT_TO_STRING) { + return function ($this, pos) { + var S = toString$j(requireObjectCoercible$b($this)); + var position = toIntegerOrInfinity$8(pos); + var size = S.length; + var first, second; + if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined; + first = charCodeAt$2(S, position); + return first < 0xD800 || first > 0xDBFF || position + 1 === size + || (second = charCodeAt$2(S, position + 1)) < 0xDC00 || second > 0xDFFF + ? CONVERT_TO_STRING + ? charAt$8(S, position) + : first + : CONVERT_TO_STRING + ? stringSlice$b(S, position, position + 2) + : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000; + }; + }; + + var stringMultibyte = { + // `String.prototype.codePointAt` method + // https://tc39.es/ecma262/#sec-string.prototype.codepointat + codeAt: createMethod$5(false), + // `String.prototype.at` method + // https://github.com/mathiasbynens/String.prototype.at + charAt: createMethod$5(true) + }; + + var charAt$7 = stringMultibyte.charAt; + var toString$i = toString$k; + var InternalStateModule$7 = internalState; + var defineIterator$1 = defineIterator$3; + + var STRING_ITERATOR = 'String Iterator'; + var setInternalState$7 = InternalStateModule$7.set; + var getInternalState$5 = InternalStateModule$7.getterFor(STRING_ITERATOR); + + // `String.prototype[@@iterator]` method + // https://tc39.es/ecma262/#sec-string.prototype-@@iterator + defineIterator$1(String, 'String', function (iterated) { + setInternalState$7(this, { + type: STRING_ITERATOR, + string: toString$i(iterated), + index: 0 + }); + // `%StringIteratorPrototype%.next` method + // https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next + }, function next() { + var state = getInternalState$5(this); + var string = state.string; + var index = state.index; + var point; + if (index >= string.length) return { value: undefined, done: true }; + point = charAt$7(string, index); + state.index += point.length; + return { value: point, done: false }; + }); - var ToObject = function ToObject(value) { - RequireObjectCoercible(value); - return $Object(value); + // iterable DOM collections + // flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods + var domIterables = { + CSSRuleList: 0, + CSSStyleDeclaration: 0, + CSSValueList: 0, + ClientRectList: 0, + DOMRectList: 0, + DOMStringList: 0, + DOMTokenList: 1, + DataTransferItemList: 0, + FileList: 0, + HTMLAllCollection: 0, + HTMLCollection: 0, + HTMLFormElement: 0, + HTMLSelectElement: 0, + MediaList: 0, + MimeTypeArray: 0, + NamedNodeMap: 0, + NodeList: 1, + PaintRequestList: 0, + Plugin: 0, + PluginArray: 0, + SVGLengthList: 0, + SVGNumberList: 0, + SVGPathSegList: 0, + SVGPointList: 0, + SVGStringList: 0, + SVGTransformList: 0, + SourceBufferList: 0, + StyleSheetList: 0, + TextTrackCueList: 0, + TextTrackList: 0, + TouchList: 0 + }; + + // in old WebKit versions, `element.classList` is not an instance of global `DOMTokenList` + var documentCreateElement = documentCreateElement$2; + + var classList$1 = documentCreateElement('span').classList; + var DOMTokenListPrototype$2 = classList$1 && classList$1.constructor && classList$1.constructor.prototype; + + var domTokenListPrototype = DOMTokenListPrototype$2 === Object.prototype ? undefined : DOMTokenListPrototype$2; + + var global$Y = global$1o; + var DOMIterables$1 = domIterables; + var DOMTokenListPrototype$1 = domTokenListPrototype; + var ArrayIteratorMethods = es_array_iterator; + var createNonEnumerableProperty$6 = createNonEnumerableProperty$b; + var wellKnownSymbol$k = wellKnownSymbol$t; + + var ITERATOR$8 = wellKnownSymbol$k('iterator'); + var TO_STRING_TAG$1 = wellKnownSymbol$k('toStringTag'); + var ArrayValues = ArrayIteratorMethods.values; + + var handlePrototype$1 = function (CollectionPrototype, COLLECTION_NAME) { + if (CollectionPrototype) { + // some Chrome versions have non-configurable methods on DOMTokenList + if (CollectionPrototype[ITERATOR$8] !== ArrayValues) try { + createNonEnumerableProperty$6(CollectionPrototype, ITERATOR$8, ArrayValues); + } catch (error) { + CollectionPrototype[ITERATOR$8] = ArrayValues; + } + if (!CollectionPrototype[TO_STRING_TAG$1]) { + createNonEnumerableProperty$6(CollectionPrototype, TO_STRING_TAG$1, COLLECTION_NAME); + } + if (DOMIterables$1[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) { + // some Chrome versions have non-configurable methods on DOMTokenList + if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try { + createNonEnumerableProperty$6(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]); + } catch (error) { + CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME]; + } + } + } }; - var $Math = GetIntrinsic('%Math%'); - var $Number = GetIntrinsic('%Number%'); + for (var COLLECTION_NAME$1 in DOMIterables$1) { + handlePrototype$1(global$Y[COLLECTION_NAME$1] && global$Y[COLLECTION_NAME$1].prototype, COLLECTION_NAME$1); + } + + handlePrototype$1(DOMTokenListPrototype$1, 'DOMTokenList'); - var maxSafeInteger = $Number.MAX_SAFE_INTEGER || $Math.pow(2, 53) - 1; + var NATIVE_BIND$2 = functionBindNative; - // http://www.ecma-international.org/ecma-262/5.1/#sec-9.3 + var FunctionPrototype$1 = Function.prototype; + var apply$9 = FunctionPrototype$1.apply; + var call$k = FunctionPrototype$1.call; - var ToNumber = function ToNumber(value) { - return +value; // eslint-disable-line no-implicit-coercion - }; + // eslint-disable-next-line es/no-reflect -- safe + var functionApply = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND$2 ? call$k.bind(apply$9) : function () { + return call$k.apply(apply$9, arguments); + }); + + var classof$a = classofRaw$1; - var _isNaN = Number.isNaN || function isNaN(a) { - return a !== a; + // `IsArray` abstract operation + // https://tc39.es/ecma262/#sec-isarray + // eslint-disable-next-line es/no-array-isarray -- safe + var isArray$8 = Array.isArray || function isArray(argument) { + return classof$a(argument) == 'Array'; }; - var $isNaN = Number.isNaN || function (a) { return a !== a; }; + var objectGetOwnPropertyNamesExternal = {}; - var _isFinite = Number.isFinite || function (x) { return typeof x === 'number' && !$isNaN(x) && x !== Infinity && x !== -Infinity; }; + var toPropertyKey$2 = toPropertyKey$5; + var definePropertyModule$3 = objectDefineProperty; + var createPropertyDescriptor$3 = createPropertyDescriptor$7; - var sign$1 = function sign(number) { - return number >= 0 ? 1 : -1; + var createProperty$5 = function (object, key, value) { + var propertyKey = toPropertyKey$2(key); + if (propertyKey in object) definePropertyModule$3.f(object, propertyKey, createPropertyDescriptor$3(0, value)); + else object[propertyKey] = value; }; - var $Math$1 = GetIntrinsic('%Math%'); - + var global$X = global$1o; + var toAbsoluteIndex$7 = toAbsoluteIndex$9; + var lengthOfArrayLike$g = lengthOfArrayLike$i; + var createProperty$4 = createProperty$5; + var Array$7 = global$X.Array; + var max$4 = Math.max; + var arraySliceSimple = function (O, start, end) { + var length = lengthOfArrayLike$g(O); + var k = toAbsoluteIndex$7(start, length); + var fin = toAbsoluteIndex$7(end === undefined ? length : end, length); + var result = Array$7(max$4(fin - k, 0)); + for (var n = 0; k < fin; k++, n++) createProperty$4(result, n, O[k]); + result.length = n; + return result; + }; + /* eslint-disable es/no-object-getownpropertynames -- safe */ + var classof$9 = classofRaw$1; + var toIndexedObject$7 = toIndexedObject$d; + var $getOwnPropertyNames$1 = objectGetOwnPropertyNames.f; + var arraySlice$c = arraySliceSimple; - var $floor = $Math$1.floor; - var $abs = $Math$1.abs; + var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames + ? Object.getOwnPropertyNames(window) : []; - // http://www.ecma-international.org/ecma-262/5.1/#sec-9.4 + var getWindowNames = function (it) { + try { + return $getOwnPropertyNames$1(it); + } catch (error) { + return arraySlice$c(windowNames); + } + }; - var ToInteger = function ToInteger(value) { - var number = ToNumber(value); - if (_isNaN(number)) { return 0; } - if (number === 0 || !_isFinite(number)) { return number; } - return sign$1(number) * $floor($abs(number)); + // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window + objectGetOwnPropertyNamesExternal.f = function getOwnPropertyNames(it) { + return windowNames && classof$9(it) == 'Window' + ? getWindowNames(it) + : $getOwnPropertyNames$1(toIndexedObject$7(it)); }; - var $apply = GetIntrinsic('%Function.prototype.apply%'); - var $call = GetIntrinsic('%Function.prototype.call%'); - var $reflectApply = GetIntrinsic('%Reflect.apply%', true) || functionBind.call($call, $apply); + var uncurryThis$K = functionUncurryThis; - var callBind = function callBind() { - return $reflectApply(functionBind, $call, arguments); - }; + var arraySlice$b = uncurryThis$K([].slice); - var apply = function applyBind() { - return $reflectApply(functionBind, $apply, arguments); - }; - callBind.apply = apply; + var uncurryThis$J = functionUncurryThis; + var aCallable$8 = aCallable$a; + var NATIVE_BIND$1 = functionBindNative; - var $indexOf = callBind(GetIntrinsic('String.prototype.indexOf')); + var bind$f = uncurryThis$J(uncurryThis$J.bind); - var callBound = function callBoundIntrinsic(name, allowMissing) { - var intrinsic = GetIntrinsic(name, !!allowMissing); - if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.')) { - return callBind(intrinsic); - } - return intrinsic; + // optional / simple context binding + var functionBindContext = function (fn, that) { + aCallable$8(fn); + return that === undefined ? fn : NATIVE_BIND$1 ? bind$f(fn, that) : function (/* ...args */) { + return fn.apply(that, arguments); + }; }; - var $test = GetIntrinsic('RegExp.prototype.test'); - + var uncurryThis$I = functionUncurryThis; + var fails$L = fails$V; + var isCallable$c = isCallable$r; + var classof$8 = classof$d; + var getBuiltIn$6 = getBuiltIn$b; + var inspectSource$1 = inspectSource$4; + var noop$2 = function () { /* empty */ }; + var empty$1 = []; + var construct$1 = getBuiltIn$6('Reflect', 'construct'); + var constructorRegExp = /^\s*(?:class|function)\b/; + var exec$6 = uncurryThis$I(constructorRegExp.exec); + var INCORRECT_TO_STRING = !constructorRegExp.exec(noop$2); - var regexTester = function regexTester(regex) { - return callBind($test, regex); + var isConstructorModern = function isConstructor(argument) { + if (!isCallable$c(argument)) return false; + try { + construct$1(noop$2, empty$1, argument); + return true; + } catch (error) { + return false; + } }; - var isPrimitive = function isPrimitive(value) { - return value === null || (typeof value !== 'function' && typeof value !== 'object'); + var isConstructorLegacy = function isConstructor(argument) { + if (!isCallable$c(argument)) return false; + switch (classof$8(argument)) { + case 'AsyncFunction': + case 'GeneratorFunction': + case 'AsyncGeneratorFunction': return false; + } + try { + // we can't check .prototype since constructors produced by .bind haven't it + // `Function#toString` throws on some built-it function in some legacy engines + // (for example, `DOMQuad` and similar in FF41-) + return INCORRECT_TO_STRING || !!exec$6(constructorRegExp, inspectSource$1(argument)); + } catch (error) { + return true; + } }; - var isPrimitive$1 = function isPrimitive(value) { - return value === null || (typeof value !== 'function' && typeof value !== 'object'); + isConstructorLegacy.sham = true; + + // `IsConstructor` abstract operation + // https://tc39.es/ecma262/#sec-isconstructor + var isConstructor$4 = !construct$1 || fails$L(function () { + var called; + return isConstructorModern(isConstructorModern.call) + || !isConstructorModern(Object) + || !isConstructorModern(function () { called = true; }) + || called; + }) ? isConstructorLegacy : isConstructorModern; + + var global$W = global$1o; + var isArray$7 = isArray$8; + var isConstructor$3 = isConstructor$4; + var isObject$m = isObject$s; + var wellKnownSymbol$j = wellKnownSymbol$t; + + var SPECIES$6 = wellKnownSymbol$j('species'); + var Array$6 = global$W.Array; + + // a part of `ArraySpeciesCreate` abstract operation + // https://tc39.es/ecma262/#sec-arrayspeciescreate + var arraySpeciesConstructor$1 = function (originalArray) { + var C; + if (isArray$7(originalArray)) { + C = originalArray.constructor; + // cross-realm fallback + if (isConstructor$3(C) && (C === Array$6 || isArray$7(C.prototype))) C = undefined; + else if (isObject$m(C)) { + C = C[SPECIES$6]; + if (C === null) C = undefined; + } + } return C === undefined ? Array$6 : C; + }; + + var arraySpeciesConstructor = arraySpeciesConstructor$1; + + // `ArraySpeciesCreate` abstract operation + // https://tc39.es/ecma262/#sec-arrayspeciescreate + var arraySpeciesCreate$4 = function (originalArray, length) { + return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length); + }; + + var bind$e = functionBindContext; + var uncurryThis$H = functionUncurryThis; + var IndexedObject$3 = indexedObject; + var toObject$f = toObject$i; + var lengthOfArrayLike$f = lengthOfArrayLike$i; + var arraySpeciesCreate$3 = arraySpeciesCreate$4; + + var push$9 = uncurryThis$H([].push); + + // `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation + var createMethod$4 = function (TYPE) { + var IS_MAP = TYPE == 1; + var IS_FILTER = TYPE == 2; + var IS_SOME = TYPE == 3; + var IS_EVERY = TYPE == 4; + var IS_FIND_INDEX = TYPE == 6; + var IS_FILTER_REJECT = TYPE == 7; + var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; + return function ($this, callbackfn, that, specificCreate) { + var O = toObject$f($this); + var self = IndexedObject$3(O); + var boundFunction = bind$e(callbackfn, that); + var length = lengthOfArrayLike$f(self); + var index = 0; + var create = specificCreate || arraySpeciesCreate$3; + var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined; + var value, result; + for (;length > index; index++) if (NO_HOLES || index in self) { + value = self[index]; + result = boundFunction(value, index, O); + if (TYPE) { + if (IS_MAP) target[index] = result; // map + else if (result) switch (TYPE) { + case 3: return true; // some + case 5: return value; // find + case 6: return index; // findIndex + case 2: push$9(target, value); // filter + } else switch (TYPE) { + case 4: return false; // every + case 7: push$9(target, value); // filterReject + } + } + } + return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target; + }; + }; + + var arrayIteration = { + // `Array.prototype.forEach` method + // https://tc39.es/ecma262/#sec-array.prototype.foreach + forEach: createMethod$4(0), + // `Array.prototype.map` method + // https://tc39.es/ecma262/#sec-array.prototype.map + map: createMethod$4(1), + // `Array.prototype.filter` method + // https://tc39.es/ecma262/#sec-array.prototype.filter + filter: createMethod$4(2), + // `Array.prototype.some` method + // https://tc39.es/ecma262/#sec-array.prototype.some + some: createMethod$4(3), + // `Array.prototype.every` method + // https://tc39.es/ecma262/#sec-array.prototype.every + every: createMethod$4(4), + // `Array.prototype.find` method + // https://tc39.es/ecma262/#sec-array.prototype.find + find: createMethod$4(5), + // `Array.prototype.findIndex` method + // https://tc39.es/ecma262/#sec-array.prototype.findIndex + findIndex: createMethod$4(6), + // `Array.prototype.filterReject` method + // https://github.com/tc39/proposal-array-filtering + filterReject: createMethod$4(7) + }; + + var $$1b = _export; + var global$V = global$1o; + var getBuiltIn$5 = getBuiltIn$b; + var apply$8 = functionApply; + var call$j = functionCall; + var uncurryThis$G = functionUncurryThis; + var DESCRIPTORS$h = descriptors; + var NATIVE_SYMBOL$1 = nativeSymbol; + var fails$K = fails$V; + var hasOwn$b = hasOwnProperty_1; + var isArray$6 = isArray$8; + var isCallable$b = isCallable$r; + var isObject$l = isObject$s; + var isPrototypeOf$8 = objectIsPrototypeOf; + var isSymbol$3 = isSymbol$6; + var anObject$h = anObject$n; + var toObject$e = toObject$i; + var toIndexedObject$6 = toIndexedObject$d; + var toPropertyKey$1 = toPropertyKey$5; + var $toString$3 = toString$k; + var createPropertyDescriptor$2 = createPropertyDescriptor$7; + var nativeObjectCreate = objectCreate; + var objectKeys$2 = objectKeys$4; + var getOwnPropertyNamesModule$1 = objectGetOwnPropertyNames; + var getOwnPropertyNamesExternal = objectGetOwnPropertyNamesExternal; + var getOwnPropertySymbolsModule$1 = objectGetOwnPropertySymbols; + var getOwnPropertyDescriptorModule$2 = objectGetOwnPropertyDescriptor; + var definePropertyModule$2 = objectDefineProperty; + var definePropertiesModule = objectDefineProperties; + var propertyIsEnumerableModule$1 = objectPropertyIsEnumerable; + var arraySlice$a = arraySlice$b; + var redefine$b = redefine$h.exports; + var shared$1 = shared$5.exports; + var sharedKey = sharedKey$4; + var hiddenKeys$1 = hiddenKeys$6; + var uid$2 = uid$5; + var wellKnownSymbol$i = wellKnownSymbol$t; + var wrappedWellKnownSymbolModule = wellKnownSymbolWrapped; + var defineWellKnownSymbol$2 = defineWellKnownSymbol$4; + var setToStringTag$7 = setToStringTag$a; + var InternalStateModule$6 = internalState; + var $forEach$2 = arrayIteration.forEach; + + var HIDDEN = sharedKey('hidden'); + var SYMBOL = 'Symbol'; + var PROTOTYPE$1 = 'prototype'; + var TO_PRIMITIVE = wellKnownSymbol$i('toPrimitive'); + + var setInternalState$6 = InternalStateModule$6.set; + var getInternalState$4 = InternalStateModule$6.getterFor(SYMBOL); + + var ObjectPrototype$3 = Object[PROTOTYPE$1]; + var $Symbol = global$V.Symbol; + var SymbolPrototype$1 = $Symbol && $Symbol[PROTOTYPE$1]; + var TypeError$h = global$V.TypeError; + var QObject = global$V.QObject; + var $stringify = getBuiltIn$5('JSON', 'stringify'); + var nativeGetOwnPropertyDescriptor$2 = getOwnPropertyDescriptorModule$2.f; + var nativeDefineProperty$1 = definePropertyModule$2.f; + var nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f; + var nativePropertyIsEnumerable = propertyIsEnumerableModule$1.f; + var push$8 = uncurryThis$G([].push); + + var AllSymbols = shared$1('symbols'); + var ObjectPrototypeSymbols = shared$1('op-symbols'); + var StringToSymbolRegistry = shared$1('string-to-symbol-registry'); + var SymbolToStringRegistry = shared$1('symbol-to-string-registry'); + var WellKnownSymbolsStore = shared$1('wks'); + + // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 + var USE_SETTER = !QObject || !QObject[PROTOTYPE$1] || !QObject[PROTOTYPE$1].findChild; + + // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 + var setSymbolDescriptor = DESCRIPTORS$h && fails$K(function () { + return nativeObjectCreate(nativeDefineProperty$1({}, 'a', { + get: function () { return nativeDefineProperty$1(this, 'a', { value: 7 }).a; } + })).a != 7; + }) ? function (O, P, Attributes) { + var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor$2(ObjectPrototype$3, P); + if (ObjectPrototypeDescriptor) delete ObjectPrototype$3[P]; + nativeDefineProperty$1(O, P, Attributes); + if (ObjectPrototypeDescriptor && O !== ObjectPrototype$3) { + nativeDefineProperty$1(ObjectPrototype$3, P, ObjectPrototypeDescriptor); + } + } : nativeDefineProperty$1; + + var wrap$2 = function (tag, description) { + var symbol = AllSymbols[tag] = nativeObjectCreate(SymbolPrototype$1); + setInternalState$6(symbol, { + type: SYMBOL, + tag: tag, + description: description + }); + if (!DESCRIPTORS$h) symbol.description = description; + return symbol; + }; + + var $defineProperty = function defineProperty(O, P, Attributes) { + if (O === ObjectPrototype$3) $defineProperty(ObjectPrototypeSymbols, P, Attributes); + anObject$h(O); + var key = toPropertyKey$1(P); + anObject$h(Attributes); + if (hasOwn$b(AllSymbols, key)) { + if (!Attributes.enumerable) { + if (!hasOwn$b(O, HIDDEN)) nativeDefineProperty$1(O, HIDDEN, createPropertyDescriptor$2(1, {})); + O[HIDDEN][key] = true; + } else { + if (hasOwn$b(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false; + Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor$2(0, false) }); + } return setSymbolDescriptor(O, key, Attributes); + } return nativeDefineProperty$1(O, key, Attributes); + }; + + var $defineProperties = function defineProperties(O, Properties) { + anObject$h(O); + var properties = toIndexedObject$6(Properties); + var keys = objectKeys$2(properties).concat($getOwnPropertySymbols(properties)); + $forEach$2(keys, function (key) { + if (!DESCRIPTORS$h || call$j($propertyIsEnumerable$1, properties, key)) $defineProperty(O, key, properties[key]); + }); + return O; }; - var fnToStr = Function.prototype.toString; - var reflectApply = typeof Reflect === 'object' && Reflect !== null && Reflect.apply; - var badArrayLike; - var isCallableMarker; - if (typeof reflectApply === 'function' && typeof Object.defineProperty === 'function') { - try { - badArrayLike = Object.defineProperty({}, 'length', { - get: function () { - throw isCallableMarker; - } - }); - isCallableMarker = {}; - } catch (_) { - reflectApply = null; - } - } else { - reflectApply = null; - } - - var constructorRegex = /^\s*class\b/; - var isES6ClassFn = function isES6ClassFunction(value) { - try { - var fnStr = fnToStr.call(value); - return constructorRegex.test(fnStr); - } catch (e) { - return false; // not a function - } + var $create = function create(O, Properties) { + return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties); }; - var tryFunctionObject = function tryFunctionToStr(value) { - try { - if (isES6ClassFn(value)) { return false; } - fnToStr.call(value); - return true; - } catch (e) { - return false; - } + var $propertyIsEnumerable$1 = function propertyIsEnumerable(V) { + var P = toPropertyKey$1(V); + var enumerable = call$j(nativePropertyIsEnumerable, this, P); + if (this === ObjectPrototype$3 && hasOwn$b(AllSymbols, P) && !hasOwn$b(ObjectPrototypeSymbols, P)) return false; + return enumerable || !hasOwn$b(this, P) || !hasOwn$b(AllSymbols, P) || hasOwn$b(this, HIDDEN) && this[HIDDEN][P] + ? enumerable : true; }; - var toStr$4 = Object.prototype.toString; - var fnClass = '[object Function]'; - var genClass = '[object GeneratorFunction]'; - var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol'; - - var isCallable = reflectApply - ? function isCallable(value) { - if (!value) { return false; } - if (typeof value !== 'function' && typeof value !== 'object') { return false; } - if (typeof value === 'function' && !value.prototype) { return true; } - try { - reflectApply(value, null, badArrayLike); - } catch (e) { - if (e !== isCallableMarker) { return false; } - } - return !isES6ClassFn(value); - } - : function isCallable(value) { - if (!value) { return false; } - if (typeof value !== 'function' && typeof value !== 'object') { return false; } - if (typeof value === 'function' && !value.prototype) { return true; } - if (hasToStringTag) { return tryFunctionObject(value); } - if (isES6ClassFn(value)) { return false; } - var strClass = toStr$4.call(value); - return strClass === fnClass || strClass === genClass; - }; - - var getDay = Date.prototype.getDay; - var tryDateObject = function tryDateGetDayCall(value) { - try { - getDay.call(value); - return true; - } catch (e) { - return false; - } + + var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) { + var it = toIndexedObject$6(O); + var key = toPropertyKey$1(P); + if (it === ObjectPrototype$3 && hasOwn$b(AllSymbols, key) && !hasOwn$b(ObjectPrototypeSymbols, key)) return; + var descriptor = nativeGetOwnPropertyDescriptor$2(it, key); + if (descriptor && hasOwn$b(AllSymbols, key) && !(hasOwn$b(it, HIDDEN) && it[HIDDEN][key])) { + descriptor.enumerable = true; + } + return descriptor; }; - var toStr$5 = Object.prototype.toString; - var dateClass = '[object Date]'; - var hasToStringTag$1 = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol'; + var $getOwnPropertyNames = function getOwnPropertyNames(O) { + var names = nativeGetOwnPropertyNames(toIndexedObject$6(O)); + var result = []; + $forEach$2(names, function (key) { + if (!hasOwn$b(AllSymbols, key) && !hasOwn$b(hiddenKeys$1, key)) push$8(result, key); + }); + return result; + }; - var isDateObject = function isDateObject(value) { - if (typeof value !== 'object' || value === null) { - return false; - } - return hasToStringTag$1 ? tryDateObject(value) : toStr$5.call(value) === dateClass; + var $getOwnPropertySymbols = function getOwnPropertySymbols(O) { + var IS_OBJECT_PROTOTYPE = O === ObjectPrototype$3; + var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject$6(O)); + var result = []; + $forEach$2(names, function (key) { + if (hasOwn$b(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || hasOwn$b(ObjectPrototype$3, key))) { + push$8(result, AllSymbols[key]); + } + }); + return result; }; - var isSymbol$2 = createCommonjsModule(function (module) { - - var toStr = Object.prototype.toString; - var hasSymbols = hasSymbols$1(); - - if (hasSymbols) { - var symToStr = Symbol.prototype.toString; - var symStringRegex = /^Symbol\(.*\)$/; - var isSymbolObject = function isRealSymbolObject(value) { - if (typeof value.valueOf() !== 'symbol') { - return false; - } - return symStringRegex.test(symToStr.call(value)); - }; - - module.exports = function isSymbol(value) { - if (typeof value === 'symbol') { - return true; - } - if (toStr.call(value) !== '[object Symbol]') { - return false; - } - try { - return isSymbolObject(value); - } catch (e) { - return false; - } - }; - } else { + // `Symbol` constructor + // https://tc39.es/ecma262/#sec-symbol-constructor + if (!NATIVE_SYMBOL$1) { + $Symbol = function Symbol() { + if (isPrototypeOf$8(SymbolPrototype$1, this)) throw TypeError$h('Symbol is not a constructor'); + var description = !arguments.length || arguments[0] === undefined ? undefined : $toString$3(arguments[0]); + var tag = uid$2(description); + var setter = function (value) { + if (this === ObjectPrototype$3) call$j(setter, ObjectPrototypeSymbols, value); + if (hasOwn$b(this, HIDDEN) && hasOwn$b(this[HIDDEN], tag)) this[HIDDEN][tag] = false; + setSymbolDescriptor(this, tag, createPropertyDescriptor$2(1, value)); + }; + if (DESCRIPTORS$h && USE_SETTER) setSymbolDescriptor(ObjectPrototype$3, tag, { configurable: true, set: setter }); + return wrap$2(tag, description); + }; - module.exports = function isSymbol(value) { - // this environment does not support Symbols. - return false ; - }; - } - }); + SymbolPrototype$1 = $Symbol[PROTOTYPE$1]; - var hasSymbols$3 = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol'; + redefine$b(SymbolPrototype$1, 'toString', function toString() { + return getInternalState$4(this).tag; + }); + redefine$b($Symbol, 'withoutSetter', function (description) { + return wrap$2(uid$2(description), description); + }); + propertyIsEnumerableModule$1.f = $propertyIsEnumerable$1; + definePropertyModule$2.f = $defineProperty; + definePropertiesModule.f = $defineProperties; + getOwnPropertyDescriptorModule$2.f = $getOwnPropertyDescriptor; + getOwnPropertyNamesModule$1.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames; + getOwnPropertySymbolsModule$1.f = $getOwnPropertySymbols; + wrappedWellKnownSymbolModule.f = function (name) { + return wrap$2(wellKnownSymbol$i(name), name); + }; + if (DESCRIPTORS$h) { + // https://github.com/tc39/proposal-Symbol-description + nativeDefineProperty$1(SymbolPrototype$1, 'description', { + configurable: true, + get: function description() { + return getInternalState$4(this).description; + } + }); + { + redefine$b(ObjectPrototype$3, 'propertyIsEnumerable', $propertyIsEnumerable$1, { unsafe: true }); + } + } + } + $$1b({ global: true, wrap: true, forced: !NATIVE_SYMBOL$1, sham: !NATIVE_SYMBOL$1 }, { + Symbol: $Symbol + }); - var ordinaryToPrimitive = function OrdinaryToPrimitive(O, hint) { - if (typeof O === 'undefined' || O === null) { - throw new TypeError('Cannot call method on ' + O); - } - if (typeof hint !== 'string' || (hint !== 'number' && hint !== 'string')) { - throw new TypeError('hint must be "string" or "number"'); - } - var methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString']; - var method, result, i; - for (i = 0; i < methodNames.length; ++i) { - method = O[methodNames[i]]; - if (isCallable(method)) { - result = method.call(O); - if (isPrimitive$1(result)) { - return result; - } - } - } - throw new TypeError('No default value'); - }; + $forEach$2(objectKeys$2(WellKnownSymbolsStore), function (name) { + defineWellKnownSymbol$2(name); + }); - var GetMethod = function GetMethod(O, P) { - var func = O[P]; - if (func !== null && typeof func !== 'undefined') { - if (!isCallable(func)) { - throw new TypeError(func + ' returned for property ' + P + ' of object ' + O + ' is not a function'); - } - return func; - } - return void 0; - }; + $$1b({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL$1 }, { + // `Symbol.for` method + // https://tc39.es/ecma262/#sec-symbol.for + 'for': function (key) { + var string = $toString$3(key); + if (hasOwn$b(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string]; + var symbol = $Symbol(string); + StringToSymbolRegistry[string] = symbol; + SymbolToStringRegistry[symbol] = string; + return symbol; + }, + // `Symbol.keyFor` method + // https://tc39.es/ecma262/#sec-symbol.keyfor + keyFor: function keyFor(sym) { + if (!isSymbol$3(sym)) throw TypeError$h(sym + ' is not a symbol'); + if (hasOwn$b(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym]; + }, + useSetter: function () { USE_SETTER = true; }, + useSimple: function () { USE_SETTER = false; } + }); - // http://www.ecma-international.org/ecma-262/6.0/#sec-toprimitive - var es2015 = function ToPrimitive(input) { - if (isPrimitive$1(input)) { - return input; - } - var hint = 'default'; - if (arguments.length > 1) { - if (arguments[1] === String) { - hint = 'string'; - } else if (arguments[1] === Number) { - hint = 'number'; - } - } - - var exoticToPrim; - if (hasSymbols$3) { - if (Symbol.toPrimitive) { - exoticToPrim = GetMethod(input, Symbol.toPrimitive); - } else if (isSymbol$2(input)) { - exoticToPrim = Symbol.prototype.valueOf; - } - } - if (typeof exoticToPrim !== 'undefined') { - var result = exoticToPrim.call(input, hint); - if (isPrimitive$1(result)) { - return result; - } - throw new TypeError('unable to convert exotic object to primitive'); - } - if (hint === 'default' && (isDateObject(input) || isSymbol$2(input))) { - hint = 'string'; - } - return ordinaryToPrimitive(input, hint === 'default' ? 'number' : hint); - }; + $$1b({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL$1, sham: !DESCRIPTORS$h }, { + // `Object.create` method + // https://tc39.es/ecma262/#sec-object.create + create: $create, + // `Object.defineProperty` method + // https://tc39.es/ecma262/#sec-object.defineproperty + defineProperty: $defineProperty, + // `Object.defineProperties` method + // https://tc39.es/ecma262/#sec-object.defineproperties + defineProperties: $defineProperties, + // `Object.getOwnPropertyDescriptor` method + // https://tc39.es/ecma262/#sec-object.getownpropertydescriptors + getOwnPropertyDescriptor: $getOwnPropertyDescriptor + }); - // https://www.ecma-international.org/ecma-262/6.0/#sec-toprimitive + $$1b({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL$1 }, { + // `Object.getOwnPropertyNames` method + // https://tc39.es/ecma262/#sec-object.getownpropertynames + getOwnPropertyNames: $getOwnPropertyNames, + // `Object.getOwnPropertySymbols` method + // https://tc39.es/ecma262/#sec-object.getownpropertysymbols + getOwnPropertySymbols: $getOwnPropertySymbols + }); - var ToPrimitive = function ToPrimitive(input) { - if (arguments.length > 1) { - return es2015(input, arguments[1]); - } - return es2015(input); - }; + // Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives + // https://bugs.chromium.org/p/v8/issues/detail?id=3443 + $$1b({ target: 'Object', stat: true, forced: fails$K(function () { getOwnPropertySymbolsModule$1.f(1); }) }, { + getOwnPropertySymbols: function getOwnPropertySymbols(it) { + return getOwnPropertySymbolsModule$1.f(toObject$e(it)); + } + }); - var $TypeError$2 = GetIntrinsic('%TypeError%'); - var $Number$1 = GetIntrinsic('%Number%'); - var $RegExp = GetIntrinsic('%RegExp%'); - var $parseInteger = GetIntrinsic('%parseInt%'); + // `JSON.stringify` method behavior with symbols + // https://tc39.es/ecma262/#sec-json.stringify + if ($stringify) { + var FORCED_JSON_STRINGIFY = !NATIVE_SYMBOL$1 || fails$K(function () { + var symbol = $Symbol(); + // MS Edge converts symbol values to JSON as {} + return $stringify([symbol]) != '[null]' + // WebKit converts symbol values to JSON as null + || $stringify({ a: symbol }) != '{}' + // V8 throws on boxed symbols + || $stringify(Object(symbol)) != '{}'; + }); + $$1b({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, { + // eslint-disable-next-line no-unused-vars -- required for `.length` + stringify: function stringify(it, replacer, space) { + var args = arraySlice$a(arguments); + var $replacer = replacer; + if (!isObject$l(replacer) && it === undefined || isSymbol$3(it)) return; // IE8 returns string on undefined + if (!isArray$6(replacer)) replacer = function (key, value) { + if (isCallable$b($replacer)) value = call$j($replacer, this, key, value); + if (!isSymbol$3(value)) return value; + }; + args[1] = replacer; + return apply$8($stringify, null, args); + } + }); + } + // `Symbol.prototype[@@toPrimitive]` method + // https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive + if (!SymbolPrototype$1[TO_PRIMITIVE]) { + var valueOf = SymbolPrototype$1.valueOf; + // eslint-disable-next-line no-unused-vars -- required for .length + redefine$b(SymbolPrototype$1, TO_PRIMITIVE, function (hint) { + // TODO: improve hint logic + return call$j(valueOf, this); + }); + } + // `Symbol.prototype[@@toStringTag]` property + // https://tc39.es/ecma262/#sec-symbol.prototype-@@tostringtag + setToStringTag$7($Symbol, SYMBOL); + + hiddenKeys$1[HIDDEN] = true; + + var $$1a = _export; + var DESCRIPTORS$g = descriptors; + var global$U = global$1o; + var uncurryThis$F = functionUncurryThis; + var hasOwn$a = hasOwnProperty_1; + var isCallable$a = isCallable$r; + var isPrototypeOf$7 = objectIsPrototypeOf; + var toString$h = toString$k; + var defineProperty$9 = objectDefineProperty.f; + var copyConstructorProperties = copyConstructorProperties$2; + + var NativeSymbol = global$U.Symbol; + var SymbolPrototype = NativeSymbol && NativeSymbol.prototype; + + if (DESCRIPTORS$g && isCallable$a(NativeSymbol) && (!('description' in SymbolPrototype) || + // Safari 12 bug + NativeSymbol().description !== undefined + )) { + var EmptyStringDescriptionStore = {}; + // wrap Symbol constructor for correct work with undefined description + var SymbolWrapper = function Symbol() { + var description = arguments.length < 1 || arguments[0] === undefined ? undefined : toString$h(arguments[0]); + var result = isPrototypeOf$7(SymbolPrototype, this) + ? new NativeSymbol(description) + // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)' + : description === undefined ? NativeSymbol() : NativeSymbol(description); + if (description === '') EmptyStringDescriptionStore[result] = true; + return result; + }; + copyConstructorProperties(SymbolWrapper, NativeSymbol); + SymbolWrapper.prototype = SymbolPrototype; + SymbolPrototype.constructor = SymbolWrapper; + var NATIVE_SYMBOL = String(NativeSymbol('test')) == 'Symbol(test)'; + var symbolToString$1 = uncurryThis$F(SymbolPrototype.toString); + var symbolValueOf = uncurryThis$F(SymbolPrototype.valueOf); + var regexp = /^Symbol\((.*)\)[^)]+$/; + var replace$8 = uncurryThis$F(''.replace); + var stringSlice$a = uncurryThis$F(''.slice); - var $strSlice = callBound('String.prototype.slice'); - var isBinary = regexTester(/^0b[01]+$/i); - var isOctal = regexTester(/^0o[0-7]+$/i); - var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i); - var nonWS = ['\u0085', '\u200b', '\ufffe'].join(''); - var nonWSregex = new $RegExp('[' + nonWS + ']', 'g'); - var hasNonWS = regexTester(nonWSregex); + defineProperty$9(SymbolPrototype, 'description', { + configurable: true, + get: function description() { + var symbol = symbolValueOf(this); + var string = symbolToString$1(symbol); + if (hasOwn$a(EmptyStringDescriptionStore, symbol)) return ''; + var desc = NATIVE_SYMBOL ? stringSlice$a(string, 7, -1) : replace$8(string, regexp, '$1'); + return desc === '' ? undefined : desc; + } + }); - // whitespace from: https://es5.github.io/#x15.5.4.20 - // implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324 - var ws = [ - '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003', - '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028', - '\u2029\uFEFF' - ].join(''); - var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g'); - var $replace$1 = callBound('String.prototype.replace'); - var $trim = function (value) { - return $replace$1(value, trimRegex, ''); - }; + $$1a({ global: true, forced: true }, { + Symbol: SymbolWrapper + }); + } + // eslint-disable-next-line es/no-typed-arrays -- safe + var arrayBufferNative = typeof ArrayBuffer != 'undefined' && typeof DataView != 'undefined'; + var redefine$a = redefine$h.exports; - // https://www.ecma-international.org/ecma-262/6.0/#sec-tonumber - - var ToNumber$1 = function ToNumber(argument) { - var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number$1); - if (typeof value === 'symbol') { - throw new $TypeError$2('Cannot convert a Symbol value to a number'); - } - if (typeof value === 'string') { - if (isBinary(value)) { - return ToNumber($parseInteger($strSlice(value, 2), 2)); - } else if (isOctal(value)) { - return ToNumber($parseInteger($strSlice(value, 2), 8)); - } else if (hasNonWS(value) || isInvalidHexLiteral(value)) { - return NaN; - } else { - var trimmed = $trim(value); - if (trimmed !== value) { - return ToNumber(trimmed); - } - } - } - return $Number$1(value); + var redefineAll$4 = function (target, src, options) { + for (var key in src) redefine$a(target, key, src[key], options); + return target; }; - // https://www.ecma-international.org/ecma-262/6.0/#sec-tointeger + var global$T = global$1o; + var isPrototypeOf$6 = objectIsPrototypeOf; - var ToInteger$1 = function ToInteger$1(value) { - var number = ToNumber$1(value); - return ToInteger(number); - }; + var TypeError$g = global$T.TypeError; - var ToLength = function ToLength(argument) { - var len = ToInteger$1(argument); - if (len <= 0) { return 0; } // includes converting -0 to +0 - if (len > maxSafeInteger) { return maxSafeInteger; } - return len; + var anInstance$7 = function (it, Prototype) { + if (isPrototypeOf$6(Prototype, it)) return it; + throw TypeError$g('Incorrect invocation'); }; - // http://www.ecma-international.org/ecma-262/5.1/#sec-9.11 - - var IsCallable = isCallable; - - var implementation$3 = function find(predicate) { - var list = ToObject(this); - var length = ToLength(list.length); - if (!IsCallable(predicate)) { - throw new TypeError('Array#find: predicate must be a function'); - } - if (length === 0) { - return void 0; - } - var thisArg; - if (arguments.length > 0) { - thisArg = arguments[1]; - } - - for (var i = 0, value; i < length; i++) { - value = list[i]; - // inlined for performance: if (Call(predicate, thisArg, [value, i, list])) { - if (predicate.apply(thisArg, [value, i, list])) { - return value; - } - } - return void 0; - }; + var global$S = global$1o; + var toIntegerOrInfinity$7 = toIntegerOrInfinity$b; + var toLength$a = toLength$c; - var polyfill$4 = function getPolyfill() { - // Detect if an implementation exists - // Detect early implementations which skipped holes in sparse arrays - // eslint-disable-next-line no-sparse-arrays - var implemented = Array.prototype.find && [, 1].find(function () { - return true; - }) !== 1; + var RangeError$b = global$S.RangeError; - // eslint-disable-next-line global-require - return implemented ? Array.prototype.find : implementation$3; + // `ToIndex` abstract operation + // https://tc39.es/ecma262/#sec-toindex + var toIndex$2 = function (it) { + if (it === undefined) return 0; + var number = toIntegerOrInfinity$7(it); + var length = toLength$a(number); + if (number !== length) throw RangeError$b('Wrong length or index'); + return length; }; - var shim$8 = function shimArrayPrototypeFind() { - var polyfill = polyfill$4(); + // IEEE754 conversions based on https://github.com/feross/ieee754 + var global$R = global$1o; - defineProperties_1(Array.prototype, { find: polyfill }, { - find: function () { - return Array.prototype.find !== polyfill; - } - }); + var Array$5 = global$R.Array; + var abs$4 = Math.abs; + var pow$2 = Math.pow; + var floor$7 = Math.floor; + var log$2 = Math.log; + var LN2 = Math.LN2; - return polyfill; + var pack = function (number, mantissaLength, bytes) { + var buffer = Array$5(bytes); + var exponentLength = bytes * 8 - mantissaLength - 1; + var eMax = (1 << exponentLength) - 1; + var eBias = eMax >> 1; + var rt = mantissaLength === 23 ? pow$2(2, -24) - pow$2(2, -77) : 0; + var sign = number < 0 || number === 0 && 1 / number < 0 ? 1 : 0; + var index = 0; + var exponent, mantissa, c; + number = abs$4(number); + // eslint-disable-next-line no-self-compare -- NaN check + if (number != number || number === Infinity) { + // eslint-disable-next-line no-self-compare -- NaN check + mantissa = number != number ? 1 : 0; + exponent = eMax; + } else { + exponent = floor$7(log$2(number) / LN2); + c = pow$2(2, -exponent); + if (number * c < 1) { + exponent--; + c *= 2; + } + if (exponent + eBias >= 1) { + number += rt / c; + } else { + number += rt * pow$2(2, 1 - eBias); + } + if (number * c >= 2) { + exponent++; + c /= 2; + } + if (exponent + eBias >= eMax) { + mantissa = 0; + exponent = eMax; + } else if (exponent + eBias >= 1) { + mantissa = (number * c - 1) * pow$2(2, mantissaLength); + exponent = exponent + eBias; + } else { + mantissa = number * pow$2(2, eBias - 1) * pow$2(2, mantissaLength); + exponent = 0; + } + } + while (mantissaLength >= 8) { + buffer[index++] = mantissa & 255; + mantissa /= 256; + mantissaLength -= 8; + } + exponent = exponent << mantissaLength | mantissa; + exponentLength += mantissaLength; + while (exponentLength > 0) { + buffer[index++] = exponent & 255; + exponent /= 256; + exponentLength -= 8; + } + buffer[--index] |= sign * 128; + return buffer; }; - var slice$2 = Array.prototype.slice; + var unpack = function (buffer, mantissaLength) { + var bytes = buffer.length; + var exponentLength = bytes * 8 - mantissaLength - 1; + var eMax = (1 << exponentLength) - 1; + var eBias = eMax >> 1; + var nBits = exponentLength - 7; + var index = bytes - 1; + var sign = buffer[index--]; + var exponent = sign & 127; + var mantissa; + sign >>= 7; + while (nBits > 0) { + exponent = exponent * 256 + buffer[index--]; + nBits -= 8; + } + mantissa = exponent & (1 << -nBits) - 1; + exponent >>= -nBits; + nBits += mantissaLength; + while (nBits > 0) { + mantissa = mantissa * 256 + buffer[index--]; + nBits -= 8; + } + if (exponent === 0) { + exponent = 1 - eBias; + } else if (exponent === eMax) { + return mantissa ? NaN : sign ? -Infinity : Infinity; + } else { + mantissa = mantissa + pow$2(2, mantissaLength); + exponent = exponent - eBias; + } return (sign ? -1 : 1) * mantissa * pow$2(2, exponent - mantissaLength); + }; + + var ieee754$2 = { + pack: pack, + unpack: unpack + }; + + var toObject$d = toObject$i; + var toAbsoluteIndex$6 = toAbsoluteIndex$9; + var lengthOfArrayLike$e = lengthOfArrayLike$i; + + // `Array.prototype.fill` method implementation + // https://tc39.es/ecma262/#sec-array.prototype.fill + var arrayFill$1 = function fill(value /* , start = 0, end = @length */) { + var O = toObject$d(this); + var length = lengthOfArrayLike$e(O); + var argumentsLength = arguments.length; + var index = toAbsoluteIndex$6(argumentsLength > 1 ? arguments[1] : undefined, length); + var end = argumentsLength > 2 ? arguments[2] : undefined; + var endPos = end === undefined ? length : toAbsoluteIndex$6(end, length); + while (endPos > index) O[index++] = value; + return O; + }; + + var global$Q = global$1o; + var uncurryThis$E = functionUncurryThis; + var DESCRIPTORS$f = descriptors; + var NATIVE_ARRAY_BUFFER$2 = arrayBufferNative; + var FunctionName = functionName; + var createNonEnumerableProperty$5 = createNonEnumerableProperty$b; + var redefineAll$3 = redefineAll$4; + var fails$J = fails$V; + var anInstance$6 = anInstance$7; + var toIntegerOrInfinity$6 = toIntegerOrInfinity$b; + var toLength$9 = toLength$c; + var toIndex$1 = toIndex$2; + var IEEE754 = ieee754$2; + var getPrototypeOf$2 = objectGetPrototypeOf; + var setPrototypeOf$5 = objectSetPrototypeOf; + var getOwnPropertyNames$4 = objectGetOwnPropertyNames.f; + var defineProperty$8 = objectDefineProperty.f; + var arrayFill = arrayFill$1; + var arraySlice$9 = arraySliceSimple; + var setToStringTag$6 = setToStringTag$a; + var InternalStateModule$5 = internalState; + + var PROPER_FUNCTION_NAME$2 = FunctionName.PROPER; + var CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE; + var getInternalState$3 = InternalStateModule$5.get; + var setInternalState$5 = InternalStateModule$5.set; + var ARRAY_BUFFER$1 = 'ArrayBuffer'; + var DATA_VIEW = 'DataView'; + var PROTOTYPE = 'prototype'; + var WRONG_LENGTH$1 = 'Wrong length'; + var WRONG_INDEX = 'Wrong index'; + var NativeArrayBuffer$1 = global$Q[ARRAY_BUFFER$1]; + var $ArrayBuffer = NativeArrayBuffer$1; + var ArrayBufferPrototype$1 = $ArrayBuffer && $ArrayBuffer[PROTOTYPE]; + var $DataView = global$Q[DATA_VIEW]; + var DataViewPrototype$1 = $DataView && $DataView[PROTOTYPE]; + var ObjectPrototype$2 = Object.prototype; + var Array$4 = global$Q.Array; + var RangeError$a = global$Q.RangeError; + var fill$1 = uncurryThis$E(arrayFill); + var reverse = uncurryThis$E([].reverse); + + var packIEEE754 = IEEE754.pack; + var unpackIEEE754 = IEEE754.unpack; + + var packInt8 = function (number) { + return [number & 0xFF]; + }; + + var packInt16 = function (number) { + return [number & 0xFF, number >> 8 & 0xFF]; + }; + + var packInt32 = function (number) { + return [number & 0xFF, number >> 8 & 0xFF, number >> 16 & 0xFF, number >> 24 & 0xFF]; + }; + + var unpackInt32 = function (buffer) { + return buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0]; + }; + + var packFloat32 = function (number) { + return packIEEE754(number, 23, 4); + }; + + var packFloat64 = function (number) { + return packIEEE754(number, 52, 8); + }; + + var addGetter$1 = function (Constructor, key) { + defineProperty$8(Constructor[PROTOTYPE], key, { get: function () { return getInternalState$3(this)[key]; } }); + }; + + var get$4 = function (view, count, index, isLittleEndian) { + var intIndex = toIndex$1(index); + var store = getInternalState$3(view); + if (intIndex + count > store.byteLength) throw RangeError$a(WRONG_INDEX); + var bytes = getInternalState$3(store.buffer).bytes; + var start = intIndex + store.byteOffset; + var pack = arraySlice$9(bytes, start, start + count); + return isLittleEndian ? pack : reverse(pack); + }; + + var set$3 = function (view, count, index, conversion, value, isLittleEndian) { + var intIndex = toIndex$1(index); + var store = getInternalState$3(view); + if (intIndex + count > store.byteLength) throw RangeError$a(WRONG_INDEX); + var bytes = getInternalState$3(store.buffer).bytes; + var start = intIndex + store.byteOffset; + var pack = conversion(+value); + for (var i = 0; i < count; i++) bytes[start + i] = pack[isLittleEndian ? i : count - i - 1]; + }; + + if (!NATIVE_ARRAY_BUFFER$2) { + $ArrayBuffer = function ArrayBuffer(length) { + anInstance$6(this, ArrayBufferPrototype$1); + var byteLength = toIndex$1(length); + setInternalState$5(this, { + bytes: fill$1(Array$4(byteLength), 0), + byteLength: byteLength + }); + if (!DESCRIPTORS$f) this.byteLength = byteLength; + }; + + ArrayBufferPrototype$1 = $ArrayBuffer[PROTOTYPE]; + + $DataView = function DataView(buffer, byteOffset, byteLength) { + anInstance$6(this, DataViewPrototype$1); + anInstance$6(buffer, ArrayBufferPrototype$1); + var bufferLength = getInternalState$3(buffer).byteLength; + var offset = toIntegerOrInfinity$6(byteOffset); + if (offset < 0 || offset > bufferLength) throw RangeError$a('Wrong offset'); + byteLength = byteLength === undefined ? bufferLength - offset : toLength$9(byteLength); + if (offset + byteLength > bufferLength) throw RangeError$a(WRONG_LENGTH$1); + setInternalState$5(this, { + buffer: buffer, + byteLength: byteLength, + byteOffset: offset + }); + if (!DESCRIPTORS$f) { + this.buffer = buffer; + this.byteLength = byteLength; + this.byteOffset = offset; + } + }; + + DataViewPrototype$1 = $DataView[PROTOTYPE]; - var polyfill$5 = polyfill$4(); + if (DESCRIPTORS$f) { + addGetter$1($ArrayBuffer, 'byteLength'); + addGetter$1($DataView, 'buffer'); + addGetter$1($DataView, 'byteLength'); + addGetter$1($DataView, 'byteOffset'); + } - var boundFindShim = function find(array, predicate) { // eslint-disable-line no-unused-vars - RequireObjectCoercible(array); - var args = slice$2.call(arguments, 1); - return polyfill$5.apply(array, args); - }; + redefineAll$3(DataViewPrototype$1, { + getInt8: function getInt8(byteOffset) { + return get$4(this, 1, byteOffset)[0] << 24 >> 24; + }, + getUint8: function getUint8(byteOffset) { + return get$4(this, 1, byteOffset)[0]; + }, + getInt16: function getInt16(byteOffset /* , littleEndian */) { + var bytes = get$4(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined); + return (bytes[1] << 8 | bytes[0]) << 16 >> 16; + }, + getUint16: function getUint16(byteOffset /* , littleEndian */) { + var bytes = get$4(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined); + return bytes[1] << 8 | bytes[0]; + }, + getInt32: function getInt32(byteOffset /* , littleEndian */) { + return unpackInt32(get$4(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined)); + }, + getUint32: function getUint32(byteOffset /* , littleEndian */) { + return unpackInt32(get$4(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined)) >>> 0; + }, + getFloat32: function getFloat32(byteOffset /* , littleEndian */) { + return unpackIEEE754(get$4(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 23); + }, + getFloat64: function getFloat64(byteOffset /* , littleEndian */) { + return unpackIEEE754(get$4(this, 8, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 52); + }, + setInt8: function setInt8(byteOffset, value) { + set$3(this, 1, byteOffset, packInt8, value); + }, + setUint8: function setUint8(byteOffset, value) { + set$3(this, 1, byteOffset, packInt8, value); + }, + setInt16: function setInt16(byteOffset, value /* , littleEndian */) { + set$3(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined); + }, + setUint16: function setUint16(byteOffset, value /* , littleEndian */) { + set$3(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined); + }, + setInt32: function setInt32(byteOffset, value /* , littleEndian */) { + set$3(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined); + }, + setUint32: function setUint32(byteOffset, value /* , littleEndian */) { + set$3(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined); + }, + setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) { + set$3(this, 4, byteOffset, packFloat32, value, arguments.length > 2 ? arguments[2] : undefined); + }, + setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) { + set$3(this, 8, byteOffset, packFloat64, value, arguments.length > 2 ? arguments[2] : undefined); + } + }); + } else { + var INCORRECT_ARRAY_BUFFER_NAME = PROPER_FUNCTION_NAME$2 && NativeArrayBuffer$1.name !== ARRAY_BUFFER$1; + /* eslint-disable no-new -- required for testing */ + if (!fails$J(function () { + NativeArrayBuffer$1(1); + }) || !fails$J(function () { + new NativeArrayBuffer$1(-1); + }) || fails$J(function () { + new NativeArrayBuffer$1(); + new NativeArrayBuffer$1(1.5); + new NativeArrayBuffer$1(NaN); + return INCORRECT_ARRAY_BUFFER_NAME && !CONFIGURABLE_FUNCTION_NAME; + })) { + /* eslint-enable no-new -- required for testing */ + $ArrayBuffer = function ArrayBuffer(length) { + anInstance$6(this, ArrayBufferPrototype$1); + return new NativeArrayBuffer$1(toIndex$1(length)); + }; + + $ArrayBuffer[PROTOTYPE] = ArrayBufferPrototype$1; + + for (var keys$2 = getOwnPropertyNames$4(NativeArrayBuffer$1), j$2 = 0, key$1; keys$2.length > j$2;) { + if (!((key$1 = keys$2[j$2++]) in $ArrayBuffer)) { + createNonEnumerableProperty$5($ArrayBuffer, key$1, NativeArrayBuffer$1[key$1]); + } + } - defineProperties_1(boundFindShim, { - getPolyfill: polyfill$4, - implementation: implementation$3, - shim: shim$8 - }); + ArrayBufferPrototype$1.constructor = $ArrayBuffer; + } else if (INCORRECT_ARRAY_BUFFER_NAME && CONFIGURABLE_FUNCTION_NAME) { + createNonEnumerableProperty$5(NativeArrayBuffer$1, 'name', ARRAY_BUFFER$1); + } - var array_prototype_find = boundFindShim; - - var implementation$4 = function findIndex(predicate) { - var list = ToObject(this); - var length = ToLength(list.length); - if (!IsCallable(predicate)) { - throw new TypeError('Array#findIndex: predicate must be a function'); - } - - if (length === 0) { - return -1; - } - - var thisArg; - if (arguments.length > 0) { - thisArg = arguments[1]; - } - - for (var i = 0, value; i < length; i++) { - value = list[i]; - // inlined for performance: if (Call(predicate, thisArg, [value, i, list])) return i; - if (predicate.apply(thisArg, [value, i, list])) { - return i; - } - } - - return -1; - }; + // WebKit bug - the same parent prototype for typed arrays and data view + if (setPrototypeOf$5 && getPrototypeOf$2(DataViewPrototype$1) !== ObjectPrototype$2) { + setPrototypeOf$5(DataViewPrototype$1, ObjectPrototype$2); + } + + // iOS Safari 7.x bug + var testView = new $DataView(new $ArrayBuffer(2)); + var $setInt8 = uncurryThis$E(DataViewPrototype$1.setInt8); + testView.setInt8(0, 2147483648); + testView.setInt8(1, 2147483649); + if (testView.getInt8(0) || !testView.getInt8(1)) redefineAll$3(DataViewPrototype$1, { + setInt8: function setInt8(byteOffset, value) { + $setInt8(this, byteOffset, value << 24 >> 24); + }, + setUint8: function setUint8(byteOffset, value) { + $setInt8(this, byteOffset, value << 24 >> 24); + } + }, { unsafe: true }); + } - var polyfill$6 = function getPolyfill() { - // Detect if an implementation exists - // Detect early implementations which skipped holes in sparse arrays - // eslint-disable-next-line no-sparse-arrays - var implemented = Array.prototype.findIndex && ([, 1].findIndex(function (item, idx) { - return idx === 0; - }) === 0); + setToStringTag$6($ArrayBuffer, ARRAY_BUFFER$1); + setToStringTag$6($DataView, DATA_VIEW); - return implemented ? Array.prototype.findIndex : implementation$4; + var arrayBuffer = { + ArrayBuffer: $ArrayBuffer, + DataView: $DataView }; - var shim$9 = function shimFindIndex() { - var polyfill = polyfill$6(); + var global$P = global$1o; + var isConstructor$2 = isConstructor$4; + var tryToString$3 = tryToString$5; - defineProperties_1(Array.prototype, { findIndex: polyfill }, { - findIndex: function () { - return Array.prototype.findIndex !== polyfill; - } - }); + var TypeError$f = global$P.TypeError; - return polyfill; + // `Assert: IsConstructor(argument) is true` + var aConstructor$3 = function (argument) { + if (isConstructor$2(argument)) return argument; + throw TypeError$f(tryToString$3(argument) + ' is not a constructor'); }; - var slice$3 = Array.prototype.slice; + var anObject$g = anObject$n; + var aConstructor$2 = aConstructor$3; + var wellKnownSymbol$h = wellKnownSymbol$t; - var polyfill$7 = polyfill$6(); + var SPECIES$5 = wellKnownSymbol$h('species'); - var boundShim = function findIndex(array, predicate) { // eslint-disable-line no-unused-vars - RequireObjectCoercible(array); - var args = slice$3.call(arguments, 1); - return polyfill$7.apply(array, args); + // `SpeciesConstructor` abstract operation + // https://tc39.es/ecma262/#sec-speciesconstructor + var speciesConstructor$5 = function (O, defaultConstructor) { + var C = anObject$g(O).constructor; + var S; + return C === undefined || (S = anObject$g(C)[SPECIES$5]) == undefined ? defaultConstructor : aConstructor$2(S); }; - defineProperties_1(boundShim, { - getPolyfill: polyfill$6, - implementation: implementation$4, - shim: shim$9 - }); + var $$19 = _export; + var uncurryThis$D = functionUncurryThis; + var fails$I = fails$V; + var ArrayBufferModule$2 = arrayBuffer; + var anObject$f = anObject$n; + var toAbsoluteIndex$5 = toAbsoluteIndex$9; + var toLength$8 = toLength$c; + var speciesConstructor$4 = speciesConstructor$5; - var array_prototype_findindex = boundShim; + var ArrayBuffer$4 = ArrayBufferModule$2.ArrayBuffer; + var DataView$2 = ArrayBufferModule$2.DataView; + var DataViewPrototype = DataView$2.prototype; + var un$ArrayBufferSlice = uncurryThis$D(ArrayBuffer$4.prototype.slice); + var getUint8 = uncurryThis$D(DataViewPrototype.getUint8); + var setUint8 = uncurryThis$D(DataViewPrototype.setUint8); - var $apply$1 = GetIntrinsic('%Reflect.apply%', true) || callBound('%Function.prototype.apply%'); + var INCORRECT_SLICE = fails$I(function () { + return !new ArrayBuffer$4(2).slice(1, undefined).byteLength; + }); - // https://www.ecma-international.org/ecma-262/6.0/#sec-call + // `ArrayBuffer.prototype.slice` method + // https://tc39.es/ecma262/#sec-arraybuffer.prototype.slice + $$19({ target: 'ArrayBuffer', proto: true, unsafe: true, forced: INCORRECT_SLICE }, { + slice: function slice(start, end) { + if (un$ArrayBufferSlice && end === undefined) { + return un$ArrayBufferSlice(anObject$f(this), start); // FF fix + } + var length = anObject$f(this).byteLength; + var first = toAbsoluteIndex$5(start, length); + var fin = toAbsoluteIndex$5(end === undefined ? length : end, length); + var result = new (speciesConstructor$4(this, ArrayBuffer$4))(toLength$8(fin - first)); + var viewSource = new DataView$2(this); + var viewTarget = new DataView$2(result); + var index = 0; + while (first < fin) { + setUint8(viewTarget, index++, getUint8(viewSource, first++)); + } return result; + } + }); - var Call = function Call(F, V) { - var args = arguments.length > 2 ? arguments[2] : []; - return $apply$1(F, V, args); - }; + var $$18 = _export; + var ArrayBufferModule$1 = arrayBuffer; + var NATIVE_ARRAY_BUFFER$1 = arrayBufferNative; - var $defineProperty = GetIntrinsic('%Object.defineProperty%', true); - - if ($defineProperty) { - try { - $defineProperty({}, 'a', { value: 1 }); - } catch (e) { - // IE 8 has a broken defineProperty - $defineProperty = null; - } - } - - - - var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable'); - - // eslint-disable-next-line max-params - var DefineOwnProperty = function DefineOwnProperty(IsDataDescriptor, SameValue, FromPropertyDescriptor, O, P, desc) { - if (!$defineProperty) { - if (!IsDataDescriptor(desc)) { - // ES3 does not support getters/setters - return false; - } - if (!desc['[[Configurable]]'] || !desc['[[Writable]]']) { - return false; - } - - // fallback for ES3 - if (P in O && $isEnumerable(O, P) !== !!desc['[[Enumerable]]']) { - // a non-enumerable existing property - return false; - } - - // property does not exist at all, or exists but is enumerable - var V = desc['[[Value]]']; - // eslint-disable-next-line no-param-reassign - O[P] = V; // will use [[Define]] - return SameValue(O[P], V); - } - $defineProperty(O, P, FromPropertyDescriptor(desc)); - return true; - }; + // `DataView` constructor + // https://tc39.es/ecma262/#sec-dataview-constructor + $$18({ global: true, forced: !NATIVE_ARRAY_BUFFER$1 }, { + DataView: ArrayBufferModule$1.DataView + }); - var src = functionBind.call(Function.call, Object.prototype.hasOwnProperty); - - var $TypeError$3 = GetIntrinsic('%TypeError%'); - var $SyntaxError = GetIntrinsic('%SyntaxError%'); - - - - var predicates = { - // https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type - 'Property Descriptor': function isPropertyDescriptor(Type, Desc) { - if (Type(Desc) !== 'Object') { - return false; - } - var allowed = { - '[[Configurable]]': true, - '[[Enumerable]]': true, - '[[Get]]': true, - '[[Set]]': true, - '[[Value]]': true, - '[[Writable]]': true - }; - - for (var key in Desc) { // eslint-disable-line - if (src(Desc, key) && !allowed[key]) { - return false; - } - } - - var isData = src(Desc, '[[Value]]'); - var IsAccessor = src(Desc, '[[Get]]') || src(Desc, '[[Set]]'); - if (isData && IsAccessor) { - throw new $TypeError$3('Property Descriptors may not be both accessor and data descriptors'); - } - return true; - } + var NATIVE_ARRAY_BUFFER = arrayBufferNative; + var DESCRIPTORS$e = descriptors; + var global$O = global$1o; + var isCallable$9 = isCallable$r; + var isObject$k = isObject$s; + var hasOwn$9 = hasOwnProperty_1; + var classof$7 = classof$d; + var tryToString$2 = tryToString$5; + var createNonEnumerableProperty$4 = createNonEnumerableProperty$b; + var redefine$9 = redefine$h.exports; + var defineProperty$7 = objectDefineProperty.f; + var isPrototypeOf$5 = objectIsPrototypeOf; + var getPrototypeOf$1 = objectGetPrototypeOf; + var setPrototypeOf$4 = objectSetPrototypeOf; + var wellKnownSymbol$g = wellKnownSymbol$t; + var uid$1 = uid$5; + + var Int8Array$4 = global$O.Int8Array; + var Int8ArrayPrototype$1 = Int8Array$4 && Int8Array$4.prototype; + var Uint8ClampedArray$1 = global$O.Uint8ClampedArray; + var Uint8ClampedArrayPrototype = Uint8ClampedArray$1 && Uint8ClampedArray$1.prototype; + var TypedArray$1 = Int8Array$4 && getPrototypeOf$1(Int8Array$4); + var TypedArrayPrototype$2 = Int8ArrayPrototype$1 && getPrototypeOf$1(Int8ArrayPrototype$1); + var ObjectPrototype$1 = Object.prototype; + var TypeError$e = global$O.TypeError; + + var TO_STRING_TAG = wellKnownSymbol$g('toStringTag'); + var TYPED_ARRAY_TAG$1 = uid$1('TYPED_ARRAY_TAG'); + var TYPED_ARRAY_CONSTRUCTOR$2 = uid$1('TYPED_ARRAY_CONSTRUCTOR'); + // Fixing native typed arrays in Opera Presto crashes the browser, see #595 + var NATIVE_ARRAY_BUFFER_VIEWS$3 = NATIVE_ARRAY_BUFFER && !!setPrototypeOf$4 && classof$7(global$O.opera) !== 'Opera'; + var TYPED_ARRAY_TAG_REQUIRED = false; + var NAME$1, Constructor, Prototype; + + var TypedArrayConstructorsList = { + Int8Array: 1, + Uint8Array: 1, + Uint8ClampedArray: 1, + Int16Array: 2, + Uint16Array: 2, + Int32Array: 4, + Uint32Array: 4, + Float32Array: 4, + Float64Array: 8 + }; + + var BigIntArrayConstructorsList = { + BigInt64Array: 8, + BigUint64Array: 8 + }; + + var isView = function isView(it) { + if (!isObject$k(it)) return false; + var klass = classof$7(it); + return klass === 'DataView' + || hasOwn$9(TypedArrayConstructorsList, klass) + || hasOwn$9(BigIntArrayConstructorsList, klass); + }; + + var isTypedArray$1 = function (it) { + if (!isObject$k(it)) return false; + var klass = classof$7(it); + return hasOwn$9(TypedArrayConstructorsList, klass) + || hasOwn$9(BigIntArrayConstructorsList, klass); + }; + + var aTypedArray$m = function (it) { + if (isTypedArray$1(it)) return it; + throw TypeError$e('Target is not a typed array'); + }; + + var aTypedArrayConstructor$3 = function (C) { + if (isCallable$9(C) && (!setPrototypeOf$4 || isPrototypeOf$5(TypedArray$1, C))) return C; + throw TypeError$e(tryToString$2(C) + ' is not a typed array constructor'); + }; + + var exportTypedArrayMethod$n = function (KEY, property, forced, options) { + if (!DESCRIPTORS$e) return; + if (forced) for (var ARRAY in TypedArrayConstructorsList) { + var TypedArrayConstructor = global$O[ARRAY]; + if (TypedArrayConstructor && hasOwn$9(TypedArrayConstructor.prototype, KEY)) try { + delete TypedArrayConstructor.prototype[KEY]; + } catch (error) { + // old WebKit bug - some methods are non-configurable + try { + TypedArrayConstructor.prototype[KEY] = property; + } catch (error2) { /* empty */ } + } + } + if (!TypedArrayPrototype$2[KEY] || forced) { + redefine$9(TypedArrayPrototype$2, KEY, forced ? property + : NATIVE_ARRAY_BUFFER_VIEWS$3 && Int8ArrayPrototype$1[KEY] || property, options); + } }; - var assertRecord = function assertRecord(Type, recordType, argumentName, value) { - var predicate = predicates[recordType]; - if (typeof predicate !== 'function') { - throw new $SyntaxError('unknown record type: ' + recordType); - } - if (!predicate(Type, value)) { - throw new $TypeError$3(argumentName + ' must be a ' + recordType); - } + var exportTypedArrayStaticMethod$1 = function (KEY, property, forced) { + var ARRAY, TypedArrayConstructor; + if (!DESCRIPTORS$e) return; + if (setPrototypeOf$4) { + if (forced) for (ARRAY in TypedArrayConstructorsList) { + TypedArrayConstructor = global$O[ARRAY]; + if (TypedArrayConstructor && hasOwn$9(TypedArrayConstructor, KEY)) try { + delete TypedArrayConstructor[KEY]; + } catch (error) { /* empty */ } + } + if (!TypedArray$1[KEY] || forced) { + // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable + try { + return redefine$9(TypedArray$1, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS$3 && TypedArray$1[KEY] || property); + } catch (error) { /* empty */ } + } else return; + } + for (ARRAY in TypedArrayConstructorsList) { + TypedArrayConstructor = global$O[ARRAY]; + if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) { + redefine$9(TypedArrayConstructor, KEY, property); + } + } }; - // https://www.ecma-international.org/ecma-262/5.1/#sec-8 - - var Type = function Type(x) { - if (x === null) { - return 'Null'; - } - if (typeof x === 'undefined') { - return 'Undefined'; - } - if (typeof x === 'function' || typeof x === 'object') { - return 'Object'; - } - if (typeof x === 'number') { - return 'Number'; - } - if (typeof x === 'boolean') { - return 'Boolean'; - } - if (typeof x === 'string') { - return 'String'; - } - }; + for (NAME$1 in TypedArrayConstructorsList) { + Constructor = global$O[NAME$1]; + Prototype = Constructor && Constructor.prototype; + if (Prototype) createNonEnumerableProperty$4(Prototype, TYPED_ARRAY_CONSTRUCTOR$2, Constructor); + else NATIVE_ARRAY_BUFFER_VIEWS$3 = false; + } - // https://ecma-international.org/ecma-262/6.0/#sec-ecmascript-data-types-and-values + for (NAME$1 in BigIntArrayConstructorsList) { + Constructor = global$O[NAME$1]; + Prototype = Constructor && Constructor.prototype; + if (Prototype) createNonEnumerableProperty$4(Prototype, TYPED_ARRAY_CONSTRUCTOR$2, Constructor); + } - var Type$1 = function Type$1(x) { - if (typeof x === 'symbol') { - return 'Symbol'; - } - return Type(x); - }; + // WebKit bug - typed arrays constructors prototype is Object.prototype + if (!NATIVE_ARRAY_BUFFER_VIEWS$3 || !isCallable$9(TypedArray$1) || TypedArray$1 === Function.prototype) { + // eslint-disable-next-line no-shadow -- safe + TypedArray$1 = function TypedArray() { + throw TypeError$e('Incorrect invocation'); + }; + if (NATIVE_ARRAY_BUFFER_VIEWS$3) for (NAME$1 in TypedArrayConstructorsList) { + if (global$O[NAME$1]) setPrototypeOf$4(global$O[NAME$1], TypedArray$1); + } + } - // https://www.ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor - - var FromPropertyDescriptor = function FromPropertyDescriptor(Desc) { - if (typeof Desc === 'undefined') { - return Desc; - } - - assertRecord(Type$1, 'Property Descriptor', 'Desc', Desc); - - var obj = {}; - if ('[[Value]]' in Desc) { - obj.value = Desc['[[Value]]']; - } - if ('[[Writable]]' in Desc) { - obj.writable = Desc['[[Writable]]']; - } - if ('[[Get]]' in Desc) { - obj.get = Desc['[[Get]]']; - } - if ('[[Set]]' in Desc) { - obj.set = Desc['[[Set]]']; - } - if ('[[Enumerable]]' in Desc) { - obj.enumerable = Desc['[[Enumerable]]']; - } - if ('[[Configurable]]' in Desc) { - obj.configurable = Desc['[[Configurable]]']; - } - return obj; - }; + if (!NATIVE_ARRAY_BUFFER_VIEWS$3 || !TypedArrayPrototype$2 || TypedArrayPrototype$2 === ObjectPrototype$1) { + TypedArrayPrototype$2 = TypedArray$1.prototype; + if (NATIVE_ARRAY_BUFFER_VIEWS$3) for (NAME$1 in TypedArrayConstructorsList) { + if (global$O[NAME$1]) setPrototypeOf$4(global$O[NAME$1].prototype, TypedArrayPrototype$2); + } + } + + // WebKit bug - one more object in Uint8ClampedArray prototype chain + if (NATIVE_ARRAY_BUFFER_VIEWS$3 && getPrototypeOf$1(Uint8ClampedArrayPrototype) !== TypedArrayPrototype$2) { + setPrototypeOf$4(Uint8ClampedArrayPrototype, TypedArrayPrototype$2); + } - var $gOPD$1 = GetIntrinsic('%Object.getOwnPropertyDescriptor%'); - if ($gOPD$1) { - try { - $gOPD$1([], 'length'); - } catch (e) { - // IE 8 has a broken gOPD - $gOPD$1 = null; - } + if (DESCRIPTORS$e && !hasOwn$9(TypedArrayPrototype$2, TO_STRING_TAG)) { + TYPED_ARRAY_TAG_REQUIRED = true; + defineProperty$7(TypedArrayPrototype$2, TO_STRING_TAG, { get: function () { + return isObject$k(this) ? this[TYPED_ARRAY_TAG$1] : undefined; + } }); + for (NAME$1 in TypedArrayConstructorsList) if (global$O[NAME$1]) { + createNonEnumerableProperty$4(global$O[NAME$1], TYPED_ARRAY_TAG$1, NAME$1); + } } - var getOwnPropertyDescriptor = $gOPD$1; + var arrayBufferViewCore = { + NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS$3, + TYPED_ARRAY_CONSTRUCTOR: TYPED_ARRAY_CONSTRUCTOR$2, + TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQUIRED && TYPED_ARRAY_TAG$1, + aTypedArray: aTypedArray$m, + aTypedArrayConstructor: aTypedArrayConstructor$3, + exportTypedArrayMethod: exportTypedArrayMethod$n, + exportTypedArrayStaticMethod: exportTypedArrayStaticMethod$1, + isView: isView, + isTypedArray: isTypedArray$1, + TypedArray: TypedArray$1, + TypedArrayPrototype: TypedArrayPrototype$2 + }; + + var $$17 = _export; + var ArrayBufferViewCore$o = arrayBufferViewCore; - var $Array = GetIntrinsic('%Array%'); + var NATIVE_ARRAY_BUFFER_VIEWS$2 = ArrayBufferViewCore$o.NATIVE_ARRAY_BUFFER_VIEWS; - // eslint-disable-next-line global-require - var toStr$6 = !$Array.isArray && callBound('Object.prototype.toString'); + // `ArrayBuffer.isView` method + // https://tc39.es/ecma262/#sec-arraybuffer.isview + $$17({ target: 'ArrayBuffer', stat: true, forced: !NATIVE_ARRAY_BUFFER_VIEWS$2 }, { + isView: ArrayBufferViewCore$o.isView + }); - // https://www.ecma-international.org/ecma-262/6.0/#sec-isarray + var getBuiltIn$4 = getBuiltIn$b; + var definePropertyModule$1 = objectDefineProperty; + var wellKnownSymbol$f = wellKnownSymbol$t; + var DESCRIPTORS$d = descriptors; - var IsArray = $Array.isArray || function IsArray(argument) { - return toStr$6(argument) === '[object Array]'; - }; + var SPECIES$4 = wellKnownSymbol$f('species'); - // https://www.ecma-international.org/ecma-262/6.0/#sec-ispropertykey + var setSpecies$5 = function (CONSTRUCTOR_NAME) { + var Constructor = getBuiltIn$4(CONSTRUCTOR_NAME); + var defineProperty = definePropertyModule$1.f; - var IsPropertyKey = function IsPropertyKey(argument) { - return typeof argument === 'string' || typeof argument === 'symbol'; + if (DESCRIPTORS$d && Constructor && !Constructor[SPECIES$4]) { + defineProperty(Constructor, SPECIES$4, { + configurable: true, + get: function () { return this; } + }); + } }; - var hasSymbols$4 = hasSymbols$1(); - var hasToStringTag$2 = hasSymbols$4 && typeof Symbol.toStringTag === 'symbol'; - var regexExec; - var isRegexMarker; - var badStringifier; + var $$16 = _export; + var global$N = global$1o; + var arrayBufferModule = arrayBuffer; + var setSpecies$4 = setSpecies$5; - if (hasToStringTag$2) { - regexExec = Function.call.bind(RegExp.prototype.exec); - isRegexMarker = {}; + var ARRAY_BUFFER = 'ArrayBuffer'; + var ArrayBuffer$3 = arrayBufferModule[ARRAY_BUFFER]; + var NativeArrayBuffer = global$N[ARRAY_BUFFER]; - var throwRegexMarker = function () { - throw isRegexMarker; - }; - badStringifier = { - toString: throwRegexMarker, - valueOf: throwRegexMarker - }; + // `ArrayBuffer` constructor + // https://tc39.es/ecma262/#sec-arraybuffer-constructor + $$16({ global: true, forced: NativeArrayBuffer !== ArrayBuffer$3 }, { + ArrayBuffer: ArrayBuffer$3 + }); - if (typeof Symbol.toPrimitive === 'symbol') { - badStringifier[Symbol.toPrimitive] = throwRegexMarker; - } - } + setSpecies$4(ARRAY_BUFFER); - var toStr$7 = Object.prototype.toString; - var regexClass = '[object RegExp]'; + var fails$H = fails$V; - var isRegex = hasToStringTag$2 - // eslint-disable-next-line consistent-return - ? function isRegex(value) { - if (!value || typeof value !== 'object') { - return false; - } + var arrayMethodIsStrict$9 = function (METHOD_NAME, argument) { + var method = [][METHOD_NAME]; + return !!method && fails$H(function () { + // eslint-disable-next-line no-useless-call,no-throw-literal -- required for testing + method.call(null, argument || function () { throw 1; }, 1); + }); + }; - try { - regexExec(value, badStringifier); - } catch (e) { - return e === isRegexMarker; - } - } - : function isRegex(value) { - // In older browsers, typeof regex incorrectly returns 'function' - if (!value || (typeof value !== 'object' && typeof value !== 'function')) { - return false; - } + /* eslint-disable es/no-array-prototype-indexof -- required for testing */ + var $$15 = _export; + var uncurryThis$C = functionUncurryThis; + var $IndexOf = arrayIncludes.indexOf; + var arrayMethodIsStrict$8 = arrayMethodIsStrict$9; - return toStr$7.call(value) === regexClass; - }; + var un$IndexOf = uncurryThis$C([].indexOf); - // http://www.ecma-international.org/ecma-262/5.1/#sec-9.2 + var NEGATIVE_ZERO$1 = !!un$IndexOf && 1 / un$IndexOf([1], 1, -0) < 0; + var STRICT_METHOD$8 = arrayMethodIsStrict$8('indexOf'); - var ToBoolean = function ToBoolean(value) { return !!value; }; + // `Array.prototype.indexOf` method + // https://tc39.es/ecma262/#sec-array.prototype.indexof + $$15({ target: 'Array', proto: true, forced: NEGATIVE_ZERO$1 || !STRICT_METHOD$8 }, { + indexOf: function indexOf(searchElement /* , fromIndex = 0 */) { + var fromIndex = arguments.length > 1 ? arguments[1] : undefined; + return NEGATIVE_ZERO$1 + // convert -0 to +0 + ? un$IndexOf(this, searchElement, fromIndex) || 0 + : $IndexOf(this, searchElement, fromIndex); + } + }); - var $match = GetIntrinsic('%Symbol.match%', true); + var anObject$e = anObject$n; + + // `RegExp.prototype.flags` getter implementation + // https://tc39.es/ecma262/#sec-get-regexp.prototype.flags + var regexpFlags$1 = function () { + var that = anObject$e(this); + var result = ''; + if (that.global) result += 'g'; + if (that.ignoreCase) result += 'i'; + if (that.multiline) result += 'm'; + if (that.dotAll) result += 's'; + if (that.unicode) result += 'u'; + if (that.sticky) result += 'y'; + return result; + }; + var fails$G = fails$V; + var global$M = global$1o; + // babel-minify and Closure Compiler transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError + var $RegExp$2 = global$M.RegExp; + var UNSUPPORTED_Y$3 = fails$G(function () { + var re = $RegExp$2('a', 'y'); + re.lastIndex = 2; + return re.exec('abcd') != null; + }); + // UC Browser bug + // https://github.com/zloirock/core-js/issues/1008 + var MISSED_STICKY$1 = UNSUPPORTED_Y$3 || fails$G(function () { + return !$RegExp$2('a', 'y').sticky; + }); - // https://ecma-international.org/ecma-262/6.0/#sec-isregexp + var BROKEN_CARET = UNSUPPORTED_Y$3 || fails$G(function () { + // https://bugzilla.mozilla.org/show_bug.cgi?id=773687 + var re = $RegExp$2('^r', 'gy'); + re.lastIndex = 2; + return re.exec('str') != null; + }); - var IsRegExp = function IsRegExp(argument) { - if (!argument || typeof argument !== 'object') { - return false; - } - if ($match) { - var isRegExp = argument[$match]; - if (typeof isRegExp !== 'undefined') { - return ToBoolean(isRegExp); - } - } - return isRegex(argument); + var regexpStickyHelpers = { + BROKEN_CARET: BROKEN_CARET, + MISSED_STICKY: MISSED_STICKY$1, + UNSUPPORTED_Y: UNSUPPORTED_Y$3 }; - var $TypeError$4 = GetIntrinsic('%TypeError%'); - - - - - - // https://ecma-international.org/ecma-262/5.1/#sec-8.10.5 - - var ToPropertyDescriptor = function ToPropertyDescriptor(Obj) { - if (Type$1(Obj) !== 'Object') { - throw new $TypeError$4('ToPropertyDescriptor requires an object'); - } - - var desc = {}; - if (src(Obj, 'enumerable')) { - desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable); - } - if (src(Obj, 'configurable')) { - desc['[[Configurable]]'] = ToBoolean(Obj.configurable); - } - if (src(Obj, 'value')) { - desc['[[Value]]'] = Obj.value; - } - if (src(Obj, 'writable')) { - desc['[[Writable]]'] = ToBoolean(Obj.writable); - } - if (src(Obj, 'get')) { - var getter = Obj.get; - if (typeof getter !== 'undefined' && !IsCallable(getter)) { - throw new TypeError('getter must be a function'); - } - desc['[[Get]]'] = getter; - } - if (src(Obj, 'set')) { - var setter = Obj.set; - if (typeof setter !== 'undefined' && !IsCallable(setter)) { - throw new $TypeError$4('setter must be a function'); - } - desc['[[Set]]'] = setter; - } - - if ((src(desc, '[[Get]]') || src(desc, '[[Set]]')) && (src(desc, '[[Value]]') || src(desc, '[[Writable]]'))) { - throw new $TypeError$4('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute'); - } - return desc; - }; + var fails$F = fails$V; + var global$L = global$1o; - var $TypeError$5 = GetIntrinsic('%TypeError%'); + // babel-minify and Closure Compiler transpiles RegExp('.', 's') -> /./s and it causes SyntaxError + var $RegExp$1 = global$L.RegExp; + var regexpUnsupportedDotAll = fails$F(function () { + var re = $RegExp$1('.', 's'); + return !(re.dotAll && re.exec('\n') && re.flags === 's'); + }); + var fails$E = fails$V; + var global$K = global$1o; - var $isEnumerable$1 = callBound('Object.prototype.propertyIsEnumerable'); + // babel-minify and Closure Compiler transpiles RegExp('(?b)', 'g') -> /(?b)/g and it causes SyntaxError + var $RegExp = global$K.RegExp; + var regexpUnsupportedNcg = fails$E(function () { + var re = $RegExp('(?b)', 'g'); + return re.exec('b').groups.a !== 'b' || + 'b'.replace(re, '$c') !== 'bc'; + }); + /* eslint-disable regexp/no-empty-capturing-group, regexp/no-empty-group, regexp/no-lazy-ends -- testing */ + /* eslint-disable regexp/no-useless-quantifier -- testing */ + var call$i = functionCall; + var uncurryThis$B = functionUncurryThis; + var toString$g = toString$k; + var regexpFlags = regexpFlags$1; + var stickyHelpers$2 = regexpStickyHelpers; + var shared = shared$5.exports; + var create$8 = objectCreate; + var getInternalState$2 = internalState.get; + var UNSUPPORTED_DOT_ALL$1 = regexpUnsupportedDotAll; + var UNSUPPORTED_NCG$1 = regexpUnsupportedNcg; + + var nativeReplace = shared('native-string-replace', String.prototype.replace); + var nativeExec = RegExp.prototype.exec; + var patchedExec = nativeExec; + var charAt$6 = uncurryThis$B(''.charAt); + var indexOf = uncurryThis$B(''.indexOf); + var replace$7 = uncurryThis$B(''.replace); + var stringSlice$9 = uncurryThis$B(''.slice); + + var UPDATES_LAST_INDEX_WRONG = (function () { + var re1 = /a/; + var re2 = /b*/g; + call$i(nativeExec, re1, 'a'); + call$i(nativeExec, re2, 'a'); + return re1.lastIndex !== 0 || re2.lastIndex !== 0; + })(); + var UNSUPPORTED_Y$2 = stickyHelpers$2.BROKEN_CARET; + // nonparticipating capturing group, copied from es5-shim's String#split patch. + var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined; + var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y$2 || UNSUPPORTED_DOT_ALL$1 || UNSUPPORTED_NCG$1; + if (PATCH) { + patchedExec = function exec(string) { + var re = this; + var state = getInternalState$2(re); + var str = toString$g(string); + var raw = state.raw; + var result, reCopy, lastIndex, match, i, object, group; + if (raw) { + raw.lastIndex = re.lastIndex; + result = call$i(patchedExec, raw, str); + re.lastIndex = raw.lastIndex; + return result; + } + var groups = state.groups; + var sticky = UNSUPPORTED_Y$2 && re.sticky; + var flags = call$i(regexpFlags, re); + var source = re.source; + var charsAdded = 0; + var strCopy = str; - // https://www.ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty + if (sticky) { + flags = replace$7(flags, 'y', ''); + if (indexOf(flags, 'g') === -1) { + flags += 'g'; + } - var OrdinaryGetOwnProperty = function OrdinaryGetOwnProperty(O, P) { - if (Type$1(O) !== 'Object') { - throw new $TypeError$5('Assertion failed: O must be an Object'); - } - if (!IsPropertyKey(P)) { - throw new $TypeError$5('Assertion failed: P must be a Property Key'); - } - if (!src(O, P)) { - return void 0; - } - if (!getOwnPropertyDescriptor) { - // ES3 / IE 8 fallback - var arrayLength = IsArray(O) && P === 'length'; - var regexLastIndex = IsRegExp(O) && P === 'lastIndex'; - return { - '[[Configurable]]': !(arrayLength || regexLastIndex), - '[[Enumerable]]': $isEnumerable$1(O, P), - '[[Value]]': O[P], - '[[Writable]]': true - }; - } - return ToPropertyDescriptor(getOwnPropertyDescriptor(O, P)); - }; + strCopy = stringSlice$9(str, re.lastIndex); + // Support anchored sticky behavior. + if (re.lastIndex > 0 && (!re.multiline || re.multiline && charAt$6(str, re.lastIndex - 1) !== '\n')) { + source = '(?: ' + source + ')'; + strCopy = ' ' + strCopy; + charsAdded++; + } + // ^(? + rx + ) is needed, in combination with some str slicing, to + // simulate the 'y' flag. + reCopy = new RegExp('^(?:' + source + ')', flags); + } - // https://www.ecma-international.org/ecma-262/6.0/#sec-isdatadescriptor + if (NPCG_INCLUDED) { + reCopy = new RegExp('^' + source + '$(?!\\s)', flags); + } + if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex; - var IsDataDescriptor = function IsDataDescriptor(Desc) { - if (typeof Desc === 'undefined') { - return false; - } + match = call$i(nativeExec, sticky ? reCopy : re, strCopy); - assertRecord(Type$1, 'Property Descriptor', 'Desc', Desc); + if (sticky) { + if (match) { + match.input = stringSlice$9(match.input, charsAdded); + match[0] = stringSlice$9(match[0], charsAdded); + match.index = re.lastIndex; + re.lastIndex += match[0].length; + } else re.lastIndex = 0; + } else if (UPDATES_LAST_INDEX_WRONG && match) { + re.lastIndex = re.global ? match.index + match[0].length : lastIndex; + } + if (NPCG_INCLUDED && match && match.length > 1) { + // Fix browsers whose `exec` methods don't consistently return `undefined` + // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/ + call$i(nativeReplace, match[0], reCopy, function () { + for (i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === undefined) match[i] = undefined; + } + }); + } - if (!src(Desc, '[[Value]]') && !src(Desc, '[[Writable]]')) { - return false; - } + if (match && groups) { + match.groups = object = create$8(null); + for (i = 0; i < groups.length; i++) { + group = groups[i]; + object[group[0]] = match[group[1]]; + } + } - return true; - }; + return match; + }; + } - var $Object$1 = GetIntrinsic('%Object%'); + var regexpExec$3 = patchedExec; + var $$14 = _export; + var exec$5 = regexpExec$3; + // `RegExp.prototype.exec` method + // https://tc39.es/ecma262/#sec-regexp.prototype.exec + $$14({ target: 'RegExp', proto: true, forced: /./.exec !== exec$5 }, { + exec: exec$5 + }); - var $preventExtensions = $Object$1.preventExtensions; - var $isExtensible = $Object$1.isExtensible; + var fails$D = fails$V; + var wellKnownSymbol$e = wellKnownSymbol$t; + var V8_VERSION$2 = engineV8Version; - // https://www.ecma-international.org/ecma-262/6.0/#sec-isextensible-o + var SPECIES$3 = wellKnownSymbol$e('species'); - var IsExtensible = $preventExtensions - ? function IsExtensible(obj) { - return !isPrimitive(obj) && $isExtensible(obj); - } - : function IsExtensible(obj) { - return !isPrimitive(obj); - }; + var arrayMethodHasSpeciesSupport$5 = function (METHOD_NAME) { + // We can't use this feature detection in V8 since it causes + // deoptimization and serious performance degradation + // https://github.com/zloirock/core-js/issues/677 + return V8_VERSION$2 >= 51 || !fails$D(function () { + var array = []; + var constructor = array.constructor = {}; + constructor[SPECIES$3] = function () { + return { foo: 1 }; + }; + return array[METHOD_NAME](Boolean).foo !== 1; + }); + }; - // http://www.ecma-international.org/ecma-262/5.1/#sec-9.12 + var $$13 = _export; + var $map$1 = arrayIteration.map; + var arrayMethodHasSpeciesSupport$4 = arrayMethodHasSpeciesSupport$5; - var SameValue = function SameValue(x, y) { - if (x === y) { // 0 === -0, but they are not identical. - if (x === 0) { return 1 / x === 1 / y; } - return true; - } - return _isNaN(x) && _isNaN(y); - }; + var HAS_SPECIES_SUPPORT$3 = arrayMethodHasSpeciesSupport$4('map'); - var $TypeError$6 = GetIntrinsic('%TypeError%'); + // `Array.prototype.map` method + // https://tc39.es/ecma262/#sec-array.prototype.map + // with adding support of @@species + $$13({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$3 }, { + map: function map(callbackfn /* , thisArg */) { + return $map$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } + }); + var $forEach$1 = arrayIteration.forEach; + var arrayMethodIsStrict$7 = arrayMethodIsStrict$9; + var STRICT_METHOD$7 = arrayMethodIsStrict$7('forEach'); + // `Array.prototype.forEach` method implementation + // https://tc39.es/ecma262/#sec-array.prototype.foreach + var arrayForEach = !STRICT_METHOD$7 ? function forEach(callbackfn /* , thisArg */) { + return $forEach$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + // eslint-disable-next-line es/no-array-prototype-foreach -- safe + } : [].forEach; + var $$12 = _export; + var forEach$3 = arrayForEach; + // `Array.prototype.forEach` method + // https://tc39.es/ecma262/#sec-array.prototype.foreach + // eslint-disable-next-line es/no-array-prototype-foreach -- safe + $$12({ target: 'Array', proto: true, forced: [].forEach != forEach$3 }, { + forEach: forEach$3 + }); + var global$J = global$1o; + var DOMIterables = domIterables; + var DOMTokenListPrototype = domTokenListPrototype; + var forEach$2 = arrayForEach; + var createNonEnumerableProperty$3 = createNonEnumerableProperty$b; + var handlePrototype = function (CollectionPrototype) { + // some Chrome versions have non-configurable methods on DOMTokenList + if (CollectionPrototype && CollectionPrototype.forEach !== forEach$2) try { + createNonEnumerableProperty$3(CollectionPrototype, 'forEach', forEach$2); + } catch (error) { + CollectionPrototype.forEach = forEach$2; + } + }; + for (var COLLECTION_NAME in DOMIterables) { + if (DOMIterables[COLLECTION_NAME]) { + handlePrototype(global$J[COLLECTION_NAME] && global$J[COLLECTION_NAME].prototype); + } + } + handlePrototype(DOMTokenListPrototype); + var $$11 = _export; + var isArray$5 = isArray$8; - // https://www.ecma-international.org/ecma-262/6.0/#sec-createdataproperty + // `Array.isArray` method + // https://tc39.es/ecma262/#sec-array.isarray + $$11({ target: 'Array', stat: true }, { + isArray: isArray$5 + }); - var CreateDataProperty = function CreateDataProperty(O, P, V) { - if (Type$1(O) !== 'Object') { - throw new $TypeError$6('Assertion failed: Type(O) is not Object'); - } - if (!IsPropertyKey(P)) { - throw new $TypeError$6('Assertion failed: IsPropertyKey(P) is not true'); - } - var oldDesc = OrdinaryGetOwnProperty(O, P); - var extensible = !oldDesc || IsExtensible(O); - var immutable = oldDesc && (!oldDesc['[[Writable]]'] || !oldDesc['[[Configurable]]']); - if (immutable || !extensible) { - return false; - } - return DefineOwnProperty( - IsDataDescriptor, - SameValue, - FromPropertyDescriptor, - O, - P, - { - '[[Configurable]]': true, - '[[Enumerable]]': true, - '[[Value]]': V, - '[[Writable]]': true - } - ); - }; + var $$10 = _export; + var fails$C = fails$V; + var getOwnPropertyNames$3 = objectGetOwnPropertyNamesExternal.f; - var $TypeError$7 = GetIntrinsic('%TypeError%'); + // eslint-disable-next-line es/no-object-getownpropertynames -- required for testing + var FAILS_ON_PRIMITIVES$5 = fails$C(function () { return !Object.getOwnPropertyNames(1); }); + // `Object.getOwnPropertyNames` method + // https://tc39.es/ecma262/#sec-object.getownpropertynames + $$10({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES$5 }, { + getOwnPropertyNames: getOwnPropertyNames$3 + }); + var global$I = global$1o; + var nativePromiseConstructor = global$I.Promise; + var wellKnownSymbol$d = wellKnownSymbol$t; + var Iterators$1 = iterators; - // // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow + var ITERATOR$7 = wellKnownSymbol$d('iterator'); + var ArrayPrototype = Array.prototype; - var CreateDataPropertyOrThrow = function CreateDataPropertyOrThrow(O, P, V) { - if (Type$1(O) !== 'Object') { - throw new $TypeError$7('Assertion failed: Type(O) is not Object'); - } - if (!IsPropertyKey(P)) { - throw new $TypeError$7('Assertion failed: IsPropertyKey(P) is not true'); - } - var success = CreateDataProperty(O, P, V); - if (!success) { - throw new $TypeError$7('unable to create data property'); - } - return success; + // check on default Array iterator + var isArrayIteratorMethod$3 = function (it) { + return it !== undefined && (Iterators$1.Array === it || ArrayPrototype[ITERATOR$7] === it); }; - var hasMap = typeof Map === 'function' && Map.prototype; - var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null; - var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null; - var mapForEach = hasMap && Map.prototype.forEach; - var hasSet = typeof Set === 'function' && Set.prototype; - var setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null; - var setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null; - var setForEach = hasSet && Set.prototype.forEach; - var booleanValueOf = Boolean.prototype.valueOf; - var objectToString$1 = Object.prototype.toString; + var classof$6 = classof$d; + var getMethod$5 = getMethod$7; + var Iterators = iterators; + var wellKnownSymbol$c = wellKnownSymbol$t; - var objectInspect = function inspect_ (obj, opts, depth, seen) { - if (typeof obj === 'undefined') { - return 'undefined'; - } - if (obj === null) { - return 'null'; - } - if (typeof obj === 'boolean') { - return obj ? 'true' : 'false'; - } - if (typeof obj === 'string') { - return inspectString(obj); - } - if (typeof obj === 'number') { - if (obj === 0) { - return Infinity / obj > 0 ? '0' : '-0'; - } - return String(obj); - } + var ITERATOR$6 = wellKnownSymbol$c('iterator'); - if (!opts) { opts = {}; } + var getIteratorMethod$5 = function (it) { + if (it != undefined) return getMethod$5(it, ITERATOR$6) + || getMethod$5(it, '@@iterator') + || Iterators[classof$6(it)]; + }; - var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth; - if (typeof depth === 'undefined') { depth = 0; } - if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') { - return '[Object]'; - } + var global$H = global$1o; + var call$h = functionCall; + var aCallable$7 = aCallable$a; + var anObject$d = anObject$n; + var tryToString$1 = tryToString$5; + var getIteratorMethod$4 = getIteratorMethod$5; - if (typeof seen === 'undefined') { seen = []; } - else if (indexOf$2(seen, obj) >= 0) { - return '[Circular]'; - } + var TypeError$d = global$H.TypeError; - function inspect (value, from) { - if (from) { - seen = seen.slice(); - seen.push(from); - } - return inspect_(value, opts, depth + 1, seen); - } + var getIterator$4 = function (argument, usingIterator) { + var iteratorMethod = arguments.length < 2 ? getIteratorMethod$4(argument) : usingIterator; + if (aCallable$7(iteratorMethod)) return anObject$d(call$h(iteratorMethod, argument)); + throw TypeError$d(tryToString$1(argument) + ' is not iterable'); + }; - if (typeof obj === 'function') { - var name = nameOf(obj); - return '[Function' + (name ? ': ' + name : '') + ']'; - } - if (isSymbol$3(obj)) { - var symString = Symbol.prototype.toString.call(obj); - return typeof obj === 'object' ? markBoxed(symString) : symString; - } - if (isElement(obj)) { - var s = '<' + String(obj.nodeName).toLowerCase(); - var attrs = obj.attributes || []; - for (var i = 0; i < attrs.length; i++) { - s += ' ' + attrs[i].name + '="' + quote(attrs[i].value) + '"'; - } - s += '>'; - if (obj.childNodes && obj.childNodes.length) { s += '...'; } - s += ''; - return s; - } - if (isArray$3(obj)) { - if (obj.length === 0) { return '[]'; } - return '[ ' + arrObjKeys(obj, inspect).join(', ') + ' ]'; - } - if (isError(obj)) { - var parts = arrObjKeys(obj, inspect); - if (parts.length === 0) { return '[' + String(obj) + ']'; } - return '{ [' + String(obj) + '] ' + parts.join(', ') + ' }'; - } - if (typeof obj === 'object' && typeof obj.inspect === 'function') { - return obj.inspect(); - } - if (isMap(obj)) { - var parts = []; - mapForEach.call(obj, function (value, key) { - parts.push(inspect(key, obj) + ' => ' + inspect(value, obj)); - }); - return collectionOf('Map', mapSize.call(obj), parts); - } - if (isSet(obj)) { - var parts = []; - setForEach.call(obj, function (value ) { - parts.push(inspect(value, obj)); - }); - return collectionOf('Set', setSize.call(obj), parts); - } - if (isNumber(obj)) { - return markBoxed(Number(obj)); - } - if (isBoolean(obj)) { - return markBoxed(booleanValueOf.call(obj)); - } - if (isString$1(obj)) { - return markBoxed(inspect(String(obj))); - } - if (!isDate(obj) && !isRegExp(obj)) { - var xs = arrObjKeys(obj, inspect); - if (xs.length === 0) { return '{}'; } - return '{ ' + xs.join(', ') + ' }'; + var call$g = functionCall; + var anObject$c = anObject$n; + var getMethod$4 = getMethod$7; + + var iteratorClose$2 = function (iterator, kind, value) { + var innerResult, innerError; + anObject$c(iterator); + try { + innerResult = getMethod$4(iterator, 'return'); + if (!innerResult) { + if (kind === 'throw') throw value; + return value; } - return String(obj); + innerResult = call$g(innerResult, iterator); + } catch (error) { + innerError = true; + innerResult = error; + } + if (kind === 'throw') throw value; + if (innerError) throw innerResult; + anObject$c(innerResult); + return value; }; - function quote (s) { - return String(s).replace(/"/g, '"'); - } + var global$G = global$1o; + var bind$d = functionBindContext; + var call$f = functionCall; + var anObject$b = anObject$n; + var tryToString = tryToString$5; + var isArrayIteratorMethod$2 = isArrayIteratorMethod$3; + var lengthOfArrayLike$d = lengthOfArrayLike$i; + var isPrototypeOf$4 = objectIsPrototypeOf; + var getIterator$3 = getIterator$4; + var getIteratorMethod$3 = getIteratorMethod$5; + var iteratorClose$1 = iteratorClose$2; - function isArray$3 (obj) { return toStr$8(obj) === '[object Array]' } - function isDate (obj) { return toStr$8(obj) === '[object Date]' } - function isRegExp (obj) { return toStr$8(obj) === '[object RegExp]' } - function isError (obj) { return toStr$8(obj) === '[object Error]' } - function isSymbol$3 (obj) { return toStr$8(obj) === '[object Symbol]' } - function isString$1 (obj) { return toStr$8(obj) === '[object String]' } - function isNumber (obj) { return toStr$8(obj) === '[object Number]' } - function isBoolean (obj) { return toStr$8(obj) === '[object Boolean]' } + var TypeError$c = global$G.TypeError; - var hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; }; - function has$1 (obj, key) { - return hasOwn.call(obj, key); - } + var Result = function (stopped, result) { + this.stopped = stopped; + this.result = result; + }; - function toStr$8 (obj) { - return objectToString$1.call(obj); - } + var ResultPrototype = Result.prototype; - function nameOf (f) { - if (f.name) { return f.name; } - var m = String(f).match(/^function\s*([\w$]+)/); - if (m) { return m[1]; } - } + var iterate$3 = function (iterable, unboundFunction, options) { + var that = options && options.that; + var AS_ENTRIES = !!(options && options.AS_ENTRIES); + var IS_ITERATOR = !!(options && options.IS_ITERATOR); + var INTERRUPTED = !!(options && options.INTERRUPTED); + var fn = bind$d(unboundFunction, that); + var iterator, iterFn, index, length, result, next, step; - function indexOf$2 (xs, x) { - if (xs.indexOf) { return xs.indexOf(x); } - for (var i = 0, l = xs.length; i < l; i++) { - if (xs[i] === x) { return i; } - } - return -1; - } + var stop = function (condition) { + if (iterator) iteratorClose$1(iterator, 'normal', condition); + return new Result(true, condition); + }; - function isMap (x) { - if (!mapSize) { - return false; + var callFn = function (value) { + if (AS_ENTRIES) { + anObject$b(value); + return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]); + } return INTERRUPTED ? fn(value, stop) : fn(value); + }; + + if (IS_ITERATOR) { + iterator = iterable; + } else { + iterFn = getIteratorMethod$3(iterable); + if (!iterFn) throw TypeError$c(tryToString(iterable) + ' is not iterable'); + // optimisation for array iterators + if (isArrayIteratorMethod$2(iterFn)) { + for (index = 0, length = lengthOfArrayLike$d(iterable); length > index; index++) { + result = callFn(iterable[index]); + if (result && isPrototypeOf$4(ResultPrototype, result)) return result; + } return new Result(false); } + iterator = getIterator$3(iterable, iterFn); + } + + next = iterator.next; + while (!(step = call$f(next, iterator)).done) { try { - mapSize.call(x); - try { - setSize.call(x); - } catch (s) { - return true; - } - return x instanceof Map; // core-js workaround, pre-v2.5.0 - } catch (e) {} - return false; - } + result = callFn(step.value); + } catch (error) { + iteratorClose$1(iterator, 'throw', error); + } + if (typeof result == 'object' && result && isPrototypeOf$4(ResultPrototype, result)) return result; + } return new Result(false); + }; - function isSet (x) { - if (!setSize) { - return false; + var wellKnownSymbol$b = wellKnownSymbol$t; + + var ITERATOR$5 = wellKnownSymbol$b('iterator'); + var SAFE_CLOSING = false; + + try { + var called = 0; + var iteratorWithReturn = { + next: function () { + return { done: !!called++ }; + }, + 'return': function () { + SAFE_CLOSING = true; } - try { - setSize.call(x); - try { - mapSize.call(x); - } catch (m) { - return true; + }; + iteratorWithReturn[ITERATOR$5] = function () { + return this; + }; + // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing + Array.from(iteratorWithReturn, function () { throw 2; }); + } catch (error) { /* empty */ } + + var checkCorrectnessOfIteration$4 = function (exec, SKIP_CLOSING) { + if (!SKIP_CLOSING && !SAFE_CLOSING) return false; + var ITERATION_SUPPORT = false; + try { + var object = {}; + object[ITERATOR$5] = function () { + return { + next: function () { + return { done: ITERATION_SUPPORT = true }; } - return x instanceof Set; // core-js workaround, pre-v2.5.0 - } catch (e) {} - return false; - } + }; + }; + exec(object); + } catch (error) { /* empty */ } + return ITERATION_SUPPORT; + }; - function isElement (x) { - if (!x || typeof x !== 'object') { return false; } - if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) { - return true; - } - return typeof x.nodeName === 'string' - && typeof x.getAttribute === 'function' - ; - } + var global$F = global$1o; - function inspectString (str) { - var s = str.replace(/(['\\])/g, '\\$1').replace(/[\x00-\x1f]/g, lowbyte); - return "'" + s + "'"; - } + var TypeError$b = global$F.TypeError; - function lowbyte (c) { - var n = c.charCodeAt(0); - var x = { 8: 'b', 9: 't', 10: 'n', 12: 'f', 13: 'r' }[n]; - if (x) { return '\\' + x; } - return '\\x' + (n < 0x10 ? '0' : '') + n.toString(16); - } + var validateArgumentsLength$4 = function (passed, required) { + if (passed < required) throw TypeError$b('Not enough arguments'); + return passed; + }; - function markBoxed (str) { - return 'Object(' + str + ')'; - } + var userAgent$6 = engineUserAgent; - function collectionOf (type, size, entries) { - return type + ' (' + size + ') {' + entries.join(', ') + '}'; - } + var engineIsIos = /(?:ipad|iphone|ipod).*applewebkit/i.test(userAgent$6); - function arrObjKeys (obj, inspect) { - var isArr = isArray$3(obj); - var xs = []; - if (isArr) { - xs.length = obj.length; - for (var i = 0; i < obj.length; i++) { - xs[i] = has$1(obj, i) ? inspect(obj[i], obj) : ''; - } - } - for (var key in obj) { - if (!has$1(obj, key)) { continue; } - if (isArr && String(Number(key)) === key && key < obj.length) { continue; } - if (/[^\w$]/.test(key)) { - xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj)); - } else { - xs.push(key + ': ' + inspect(obj[key], obj)); - } - } - return xs; + var classof$5 = classofRaw$1; + var global$E = global$1o; + + var engineIsNode = classof$5(global$E.process) == 'process'; + + var global$D = global$1o; + var apply$7 = functionApply; + var bind$c = functionBindContext; + var isCallable$8 = isCallable$r; + var hasOwn$8 = hasOwnProperty_1; + var fails$B = fails$V; + var html = html$2; + var arraySlice$8 = arraySlice$b; + var createElement = documentCreateElement$2; + var validateArgumentsLength$3 = validateArgumentsLength$4; + var IS_IOS$1 = engineIsIos; + var IS_NODE$4 = engineIsNode; + + var set$2 = global$D.setImmediate; + var clear = global$D.clearImmediate; + var process$3 = global$D.process; + var Dispatch$1 = global$D.Dispatch; + var Function$3 = global$D.Function; + var MessageChannel = global$D.MessageChannel; + var String$2 = global$D.String; + var counter = 0; + var queue$1 = {}; + var ONREADYSTATECHANGE = 'onreadystatechange'; + var location$1, defer, channel, port; + + try { + // Deno throws a ReferenceError on `location` access without `--location` flag + location$1 = global$D.location; + } catch (error) { /* empty */ } + + var run = function (id) { + if (hasOwn$8(queue$1, id)) { + var fn = queue$1[id]; + delete queue$1[id]; + fn(); + } + }; + + var runner = function (id) { + return function () { + run(id); + }; + }; + + var listener = function (event) { + run(event.data); + }; + + var post = function (id) { + // old engines have not location.origin + global$D.postMessage(String$2(id), location$1.protocol + '//' + location$1.host); + }; + + // Node.js 0.9+ & IE10+ has setImmediate, otherwise: + if (!set$2 || !clear) { + set$2 = function setImmediate(handler) { + validateArgumentsLength$3(arguments.length, 1); + var fn = isCallable$8(handler) ? handler : Function$3(handler); + var args = arraySlice$8(arguments, 1); + queue$1[++counter] = function () { + apply$7(fn, undefined, args); + }; + defer(counter); + return counter; + }; + clear = function clearImmediate(id) { + delete queue$1[id]; + }; + // Node.js 0.8- + if (IS_NODE$4) { + defer = function (id) { + process$3.nextTick(runner(id)); + }; + // Sphere (JS game engine) Dispatch API + } else if (Dispatch$1 && Dispatch$1.now) { + defer = function (id) { + Dispatch$1.now(runner(id)); + }; + // Browsers with MessageChannel, includes WebWorkers + // except iOS - https://github.com/zloirock/core-js/issues/624 + } else if (MessageChannel && !IS_IOS$1) { + channel = new MessageChannel(); + port = channel.port2; + channel.port1.onmessage = listener; + defer = bind$c(port.postMessage, port); + // Browsers with postMessage, skip WebWorkers + // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' + } else if ( + global$D.addEventListener && + isCallable$8(global$D.postMessage) && + !global$D.importScripts && + location$1 && location$1.protocol !== 'file:' && + !fails$B(post) + ) { + defer = post; + global$D.addEventListener('message', listener, false); + // IE8- + } else if (ONREADYSTATECHANGE in createElement('script')) { + defer = function (id) { + html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () { + html.removeChild(this); + run(id); + }; + }; + // Rest old browsers + } else { + defer = function (id) { + setTimeout(runner(id), 0); + }; + } } - var $TypeError$8 = GetIntrinsic('%TypeError%'); + var task$1 = { + set: set$2, + clear: clear + }; + var userAgent$5 = engineUserAgent; + var global$C = global$1o; + var engineIsIosPebble = /ipad|iphone|ipod/i.test(userAgent$5) && global$C.Pebble !== undefined; + var userAgent$4 = engineUserAgent; + var engineIsWebosWebkit = /web0s(?!.*chrome)/i.test(userAgent$4); + var global$B = global$1o; + var bind$b = functionBindContext; + var getOwnPropertyDescriptor$3 = objectGetOwnPropertyDescriptor.f; + var macrotask = task$1.set; + var IS_IOS = engineIsIos; + var IS_IOS_PEBBLE = engineIsIosPebble; + var IS_WEBOS_WEBKIT = engineIsWebosWebkit; + var IS_NODE$3 = engineIsNode; - /** - * 7.3.1 Get (O, P) - https://ecma-international.org/ecma-262/6.0/#sec-get-o-p - * 1. Assert: Type(O) is Object. - * 2. Assert: IsPropertyKey(P) is true. - * 3. Return O.[[Get]](P, O). - */ + var MutationObserver = global$B.MutationObserver || global$B.WebKitMutationObserver; + var document$2 = global$B.document; + var process$2 = global$B.process; + var Promise$1 = global$B.Promise; + // Node.js 11 shows ExperimentalWarning on getting `queueMicrotask` + var queueMicrotaskDescriptor = getOwnPropertyDescriptor$3(global$B, 'queueMicrotask'); + var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value; + + var flush, head, last, notify$1, toggle, node, promise, then; + + // modern engines have queueMicrotask method + if (!queueMicrotask) { + flush = function () { + var parent, fn; + if (IS_NODE$3 && (parent = process$2.domain)) parent.exit(); + while (head) { + fn = head.fn; + head = head.next; + try { + fn(); + } catch (error) { + if (head) notify$1(); + else last = undefined; + throw error; + } + } last = undefined; + if (parent) parent.enter(); + }; + + // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339 + // also except WebOS Webkit https://github.com/zloirock/core-js/issues/898 + if (!IS_IOS && !IS_NODE$3 && !IS_WEBOS_WEBKIT && MutationObserver && document$2) { + toggle = true; + node = document$2.createTextNode(''); + new MutationObserver(flush).observe(node, { characterData: true }); + notify$1 = function () { + node.data = toggle = !toggle; + }; + // environments with maybe non-completely correct, but existent Promise + } else if (!IS_IOS_PEBBLE && Promise$1 && Promise$1.resolve) { + // Promise.resolve without an argument throws an error in LG WebOS 2 + promise = Promise$1.resolve(undefined); + // workaround of WebKit ~ iOS Safari 10.1 bug + promise.constructor = Promise$1; + then = bind$b(promise.then, promise); + notify$1 = function () { + then(flush); + }; + // Node.js without promises + } else if (IS_NODE$3) { + notify$1 = function () { + process$2.nextTick(flush); + }; + // for other environments - macrotask based on: + // - setImmediate + // - MessageChannel + // - window.postMessag + // - onreadystatechange + // - setTimeout + } else { + // strange IE + webpack dev server bug - use .bind(global) + macrotask = bind$b(macrotask, global$B); + notify$1 = function () { + macrotask(flush); + }; + } + } + + var microtask$1 = queueMicrotask || function (fn) { + var task = { fn: fn, next: undefined }; + if (last) last.next = task; + if (!head) { + head = task; + notify$1(); + } last = task; + }; + + var newPromiseCapability$2 = {}; - var Get = function Get(O, P) { - // 7.3.1.1 - if (Type$1(O) !== 'Object') { - throw new $TypeError$8('Assertion failed: Type(O) is not Object'); - } - // 7.3.1.2 - if (!IsPropertyKey(P)) { - throw new $TypeError$8('Assertion failed: IsPropertyKey(P) is not true, got ' + objectInspect(P)); - } - // 7.3.1.3 - return O[P]; + var aCallable$6 = aCallable$a; + + var PromiseCapability = function (C) { + var resolve, reject; + this.promise = new C(function ($$resolve, $$reject) { + if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor'); + resolve = $$resolve; + reject = $$reject; + }); + this.resolve = aCallable$6(resolve); + this.reject = aCallable$6(reject); }; - var $TypeError$9 = GetIntrinsic('%TypeError%'); - - var isPropertyDescriptor = function IsPropertyDescriptor(ES, Desc) { - if (ES.Type(Desc) !== 'Object') { - return false; - } - var allowed = { - '[[Configurable]]': true, - '[[Enumerable]]': true, - '[[Get]]': true, - '[[Set]]': true, - '[[Value]]': true, - '[[Writable]]': true - }; - - for (var key in Desc) { // eslint-disable-line no-restricted-syntax - if (src(Desc, key) && !allowed[key]) { - return false; - } - } - - if (ES.IsDataDescriptor(Desc) && ES.IsAccessorDescriptor(Desc)) { - throw new $TypeError$9('Property Descriptors may not be both accessor and data descriptors'); - } - return true; + // `NewPromiseCapability` abstract operation + // https://tc39.es/ecma262/#sec-newpromisecapability + newPromiseCapability$2.f = function (C) { + return new PromiseCapability(C); }; - // https://www.ecma-international.org/ecma-262/6.0/#sec-isaccessordescriptor + var anObject$a = anObject$n; + var isObject$j = isObject$s; + var newPromiseCapability$1 = newPromiseCapability$2; - var IsAccessorDescriptor = function IsAccessorDescriptor(Desc) { - if (typeof Desc === 'undefined') { - return false; - } + var promiseResolve$2 = function (C, x) { + anObject$a(C); + if (isObject$j(x) && x.constructor === C) return x; + var promiseCapability = newPromiseCapability$1.f(C); + var resolve = promiseCapability.resolve; + resolve(x); + return promiseCapability.promise; + }; + + var global$A = global$1o; - assertRecord(Type$1, 'Property Descriptor', 'Desc', Desc); + var hostReportErrors$1 = function (a, b) { + var console = global$A.console; + if (console && console.error) { + arguments.length == 1 ? console.error(a) : console.error(a, b); + } + }; - if (!src(Desc, '[[Get]]') && !src(Desc, '[[Set]]')) { - return false; - } + var perform$1 = function (exec) { + try { + return { error: false, value: exec() }; + } catch (error) { + return { error: true, value: error }; + } + }; - return true; + var Queue$1 = function () { + this.head = null; + this.tail = null; }; - var $TypeError$a = GetIntrinsic('%TypeError%'); + Queue$1.prototype = { + add: function (item) { + var entry = { item: item, next: null }; + if (this.head) this.tail.next = entry; + else this.head = entry; + this.tail = entry; + }, + get: function () { + var entry = this.head; + if (entry) { + this.head = entry.next; + if (this.tail === entry) this.tail = null; + return entry.item; + } + } + }; + + var queue = Queue$1; + + var engineIsBrowser = typeof window == 'object'; + + var $$$ = _export; + var global$z = global$1o; + var getBuiltIn$3 = getBuiltIn$b; + var call$e = functionCall; + var NativePromise$1 = nativePromiseConstructor; + var redefine$8 = redefine$h.exports; + var redefineAll$2 = redefineAll$4; + var setPrototypeOf$3 = objectSetPrototypeOf; + var setToStringTag$5 = setToStringTag$a; + var setSpecies$3 = setSpecies$5; + var aCallable$5 = aCallable$a; + var isCallable$7 = isCallable$r; + var isObject$i = isObject$s; + var anInstance$5 = anInstance$7; + var inspectSource = inspectSource$4; + var iterate$2 = iterate$3; + var checkCorrectnessOfIteration$3 = checkCorrectnessOfIteration$4; + var speciesConstructor$3 = speciesConstructor$5; + var task = task$1.set; + var microtask = microtask$1; + var promiseResolve$1 = promiseResolve$2; + var hostReportErrors = hostReportErrors$1; + var newPromiseCapabilityModule = newPromiseCapability$2; + var perform = perform$1; + var Queue = queue; + var InternalStateModule$4 = internalState; + var isForced$3 = isForced_1; + var wellKnownSymbol$a = wellKnownSymbol$t; + var IS_BROWSER = engineIsBrowser; + var IS_NODE$2 = engineIsNode; + var V8_VERSION$1 = engineV8Version; + + var SPECIES$2 = wellKnownSymbol$a('species'); + var PROMISE = 'Promise'; + + var getInternalState$1 = InternalStateModule$4.getterFor(PROMISE); + var setInternalState$4 = InternalStateModule$4.set; + var getInternalPromiseState = InternalStateModule$4.getterFor(PROMISE); + var NativePromisePrototype = NativePromise$1 && NativePromise$1.prototype; + var PromiseConstructor = NativePromise$1; + var PromisePrototype = NativePromisePrototype; + var TypeError$a = global$z.TypeError; + var document$1 = global$z.document; + var process$1 = global$z.process; + var newPromiseCapability = newPromiseCapabilityModule.f; + var newGenericPromiseCapability = newPromiseCapability; + + var DISPATCH_EVENT = !!(document$1 && document$1.createEvent && global$z.dispatchEvent); + var NATIVE_REJECTION_EVENT = isCallable$7(global$z.PromiseRejectionEvent); + var UNHANDLED_REJECTION = 'unhandledrejection'; + var REJECTION_HANDLED = 'rejectionhandled'; + var PENDING = 0; + var FULFILLED = 1; + var REJECTED = 2; + var HANDLED = 1; + var UNHANDLED = 2; + var SUBCLASSING = false; + + var Internal, OwnPromiseCapability, PromiseWrapper, nativeThen; + + var FORCED$g = isForced$3(PROMISE, function () { + var PROMISE_CONSTRUCTOR_SOURCE = inspectSource(PromiseConstructor); + var GLOBAL_CORE_JS_PROMISE = PROMISE_CONSTRUCTOR_SOURCE !== String(PromiseConstructor); + // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables + // https://bugs.chromium.org/p/chromium/issues/detail?id=830565 + // We can't detect it synchronously, so just check versions + if (!GLOBAL_CORE_JS_PROMISE && V8_VERSION$1 === 66) return true; + // We can't use @@species feature detection in V8 since it causes + // deoptimization and performance degradation + // https://github.com/zloirock/core-js/issues/679 + if (V8_VERSION$1 >= 51 && /native code/.test(PROMISE_CONSTRUCTOR_SOURCE)) return false; + // Detect correctness of subclassing with @@species support + var promise = new PromiseConstructor(function (resolve) { resolve(1); }); + var FakePromise = function (exec) { + exec(function () { /* empty */ }, function () { /* empty */ }); + }; + var constructor = promise.constructor = {}; + constructor[SPECIES$2] = FakePromise; + SUBCLASSING = promise.then(function () { /* empty */ }) instanceof FakePromise; + if (!SUBCLASSING) return true; + // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test + return !GLOBAL_CORE_JS_PROMISE && IS_BROWSER && !NATIVE_REJECTION_EVENT; + }); + var INCORRECT_ITERATION$1 = FORCED$g || !checkCorrectnessOfIteration$3(function (iterable) { + PromiseConstructor.all(iterable)['catch'](function () { /* empty */ }); + }); + // helpers + var isThenable = function (it) { + var then; + return isObject$i(it) && isCallable$7(then = it.then) ? then : false; + }; + var callReaction = function (reaction, state) { + var value = state.value; + var ok = state.state == FULFILLED; + var handler = ok ? reaction.ok : reaction.fail; + var resolve = reaction.resolve; + var reject = reaction.reject; + var domain = reaction.domain; + var result, then, exited; + try { + if (handler) { + if (!ok) { + if (state.rejection === UNHANDLED) onHandleUnhandled(state); + state.rejection = HANDLED; + } + if (handler === true) result = value; + else { + if (domain) domain.enter(); + result = handler(value); // can throw + if (domain) { + domain.exit(); + exited = true; + } + } + if (result === reaction.promise) { + reject(TypeError$a('Promise-chain cycle')); + } else if (then = isThenable(result)) { + call$e(then, result, resolve, reject); + } else resolve(result); + } else reject(value); + } catch (error) { + if (domain && !exited) domain.exit(); + reject(error); + } + }; + + var notify = function (state, isReject) { + if (state.notified) return; + state.notified = true; + microtask(function () { + var reactions = state.reactions; + var reaction; + while (reaction = reactions.get()) { + callReaction(reaction, state); + } + state.notified = false; + if (isReject && !state.rejection) onUnhandled(state); + }); + }; + var dispatchEvent$1 = function (name, promise, reason) { + var event, handler; + if (DISPATCH_EVENT) { + event = document$1.createEvent('Event'); + event.promise = promise; + event.reason = reason; + event.initEvent(name, false, true); + global$z.dispatchEvent(event); + } else event = { promise: promise, reason: reason }; + if (!NATIVE_REJECTION_EVENT && (handler = global$z['on' + name])) handler(event); + else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason); + }; + + var onUnhandled = function (state) { + call$e(task, global$z, function () { + var promise = state.facade; + var value = state.value; + var IS_UNHANDLED = isUnhandled(state); + var result; + if (IS_UNHANDLED) { + result = perform(function () { + if (IS_NODE$2) { + process$1.emit('unhandledRejection', value, promise); + } else dispatchEvent$1(UNHANDLED_REJECTION, promise, value); + }); + // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should + state.rejection = IS_NODE$2 || isUnhandled(state) ? UNHANDLED : HANDLED; + if (result.error) throw result.value; + } + }); + }; + var isUnhandled = function (state) { + return state.rejection !== HANDLED && !state.parent; + }; + var onHandleUnhandled = function (state) { + call$e(task, global$z, function () { + var promise = state.facade; + if (IS_NODE$2) { + process$1.emit('rejectionHandled', promise); + } else dispatchEvent$1(REJECTION_HANDLED, promise, state.value); + }); + }; + var bind$a = function (fn, state, unwrap) { + return function (value) { + fn(state, value, unwrap); + }; + }; + var internalReject = function (state, value, unwrap) { + if (state.done) return; + state.done = true; + if (unwrap) state = unwrap; + state.value = value; + state.state = REJECTED; + notify(state, true); + }; + var internalResolve = function (state, value, unwrap) { + if (state.done) return; + state.done = true; + if (unwrap) state = unwrap; + try { + if (state.facade === value) throw TypeError$a("Promise can't be resolved itself"); + var then = isThenable(value); + if (then) { + microtask(function () { + var wrapper = { done: false }; + try { + call$e(then, value, + bind$a(internalResolve, wrapper, state), + bind$a(internalReject, wrapper, state) + ); + } catch (error) { + internalReject(wrapper, error, state); + } + }); + } else { + state.value = value; + state.state = FULFILLED; + notify(state, false); + } + } catch (error) { + internalReject({ done: false }, error, state); + } + }; + // constructor polyfill + if (FORCED$g) { + // 25.4.3.1 Promise(executor) + PromiseConstructor = function Promise(executor) { + anInstance$5(this, PromisePrototype); + aCallable$5(executor); + call$e(Internal, this); + var state = getInternalState$1(this); + try { + executor(bind$a(internalResolve, state), bind$a(internalReject, state)); + } catch (error) { + internalReject(state, error); + } + }; + PromisePrototype = PromiseConstructor.prototype; + // eslint-disable-next-line no-unused-vars -- required for `.length` + Internal = function Promise(executor) { + setInternalState$4(this, { + type: PROMISE, + done: false, + notified: false, + parent: false, + reactions: new Queue(), + rejection: false, + state: PENDING, + value: undefined + }); + }; + Internal.prototype = redefineAll$2(PromisePrototype, { + // `Promise.prototype.then` method + // https://tc39.es/ecma262/#sec-promise.prototype.then + // eslint-disable-next-line unicorn/no-thenable -- safe + then: function then(onFulfilled, onRejected) { + var state = getInternalPromiseState(this); + var reaction = newPromiseCapability(speciesConstructor$3(this, PromiseConstructor)); + state.parent = true; + reaction.ok = isCallable$7(onFulfilled) ? onFulfilled : true; + reaction.fail = isCallable$7(onRejected) && onRejected; + reaction.domain = IS_NODE$2 ? process$1.domain : undefined; + if (state.state == PENDING) state.reactions.add(reaction); + else microtask(function () { + callReaction(reaction, state); + }); + return reaction.promise; + }, + // `Promise.prototype.catch` method + // https://tc39.es/ecma262/#sec-promise.prototype.catch + 'catch': function (onRejected) { + return this.then(undefined, onRejected); + } + }); + OwnPromiseCapability = function () { + var promise = new Internal(); + var state = getInternalState$1(promise); + this.promise = promise; + this.resolve = bind$a(internalResolve, state); + this.reject = bind$a(internalReject, state); + }; + newPromiseCapabilityModule.f = newPromiseCapability = function (C) { + return C === PromiseConstructor || C === PromiseWrapper + ? new OwnPromiseCapability(C) + : newGenericPromiseCapability(C); + }; + if (isCallable$7(NativePromise$1) && NativePromisePrototype !== Object.prototype) { + nativeThen = NativePromisePrototype.then; - // https://www.ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow + if (!SUBCLASSING) { + // make `Promise#then` return a polyfilled `Promise` for native promise-based APIs + redefine$8(NativePromisePrototype, 'then', function then(onFulfilled, onRejected) { + var that = this; + return new PromiseConstructor(function (resolve, reject) { + call$e(nativeThen, that, resolve, reject); + }).then(onFulfilled, onRejected); + // https://github.com/zloirock/core-js/issues/640 + }, { unsafe: true }); - var DefinePropertyOrThrow = function DefinePropertyOrThrow(O, P, desc) { - if (Type$1(O) !== 'Object') { - throw new $TypeError$a('Assertion failed: Type(O) is not Object'); - } + // makes sure that native promise-based APIs `Promise#catch` properly works with patched `Promise#then` + redefine$8(NativePromisePrototype, 'catch', PromisePrototype['catch'], { unsafe: true }); + } - if (!IsPropertyKey(P)) { - throw new $TypeError$a('Assertion failed: IsPropertyKey(P) is not true'); - } + // make `.constructor === Promise` work for native promise-based APIs + try { + delete NativePromisePrototype.constructor; + } catch (error) { /* empty */ } - var Desc = isPropertyDescriptor({ - Type: Type$1, - IsDataDescriptor: IsDataDescriptor, - IsAccessorDescriptor: IsAccessorDescriptor - }, desc) ? desc : ToPropertyDescriptor(desc); - if (!isPropertyDescriptor({ - Type: Type$1, - IsDataDescriptor: IsDataDescriptor, - IsAccessorDescriptor: IsAccessorDescriptor - }, Desc)) { - throw new $TypeError$a('Assertion failed: Desc is not a valid Property Descriptor'); - } + // make `instanceof Promise` work for native promise-based APIs + if (setPrototypeOf$3) { + setPrototypeOf$3(NativePromisePrototype, PromisePrototype); + } + } + } - return DefineOwnProperty( - IsDataDescriptor, - SameValue, - FromPropertyDescriptor, - O, - P, - Desc - ); - }; + $$$({ global: true, wrap: true, forced: FORCED$g }, { + Promise: PromiseConstructor + }); - var IsConstructor = createCommonjsModule(function (module) { + setToStringTag$5(PromiseConstructor, PROMISE, false); + setSpecies$3(PROMISE); + PromiseWrapper = getBuiltIn$3(PROMISE); + // statics + $$$({ target: PROMISE, stat: true, forced: FORCED$g }, { + // `Promise.reject` method + // https://tc39.es/ecma262/#sec-promise.reject + reject: function reject(r) { + var capability = newPromiseCapability(this); + call$e(capability.reject, undefined, r); + return capability.promise; + } + }); - var $construct = GetIntrinsic('%Reflect.construct%', true); + $$$({ target: PROMISE, stat: true, forced: FORCED$g }, { + // `Promise.resolve` method + // https://tc39.es/ecma262/#sec-promise.resolve + resolve: function resolve(x) { + return promiseResolve$1(this, x); + } + }); - var DefinePropertyOrThrow$1 = DefinePropertyOrThrow; - try { - DefinePropertyOrThrow$1({}, '', { '[[Get]]': function () {} }); - } catch (e) { - // Accessor properties aren't supported - DefinePropertyOrThrow$1 = null; - } - - // https://www.ecma-international.org/ecma-262/6.0/#sec-isconstructor - - if (DefinePropertyOrThrow$1 && $construct) { - var isConstructorMarker = {}; - var badArrayLike = {}; - DefinePropertyOrThrow$1(badArrayLike, 'length', { - '[[Get]]': function () { - throw isConstructorMarker; - }, - '[[Enumerable]]': true - }); - - module.exports = function IsConstructor(argument) { - try { - // `Reflect.construct` invokes `IsConstructor(target)` before `Get(args, 'length')`: - $construct(argument, badArrayLike); - } catch (err) { - return err === isConstructorMarker; - } - }; - } else { - module.exports = function IsConstructor(argument) { - // unfortunately there's no way to truly check this without try/catch `new argument` in old environments - return typeof argument === 'function' && !!argument.prototype; - }; - } + $$$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION$1 }, { + // `Promise.all` method + // https://tc39.es/ecma262/#sec-promise.all + all: function all(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var resolve = capability.resolve; + var reject = capability.reject; + var result = perform(function () { + var $promiseResolve = aCallable$5(C.resolve); + var values = []; + var counter = 0; + var remaining = 1; + iterate$2(iterable, function (promise) { + var index = counter++; + var alreadyCalled = false; + remaining++; + call$e($promiseResolve, C, promise).then(function (value) { + if (alreadyCalled) return; + alreadyCalled = true; + values[index] = value; + --remaining || resolve(values); + }, reject); + }); + --remaining || resolve(values); + }); + if (result.error) reject(result.value); + return capability.promise; + }, + // `Promise.race` method + // https://tc39.es/ecma262/#sec-promise.race + race: function race(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var reject = capability.reject; + var result = perform(function () { + var $promiseResolve = aCallable$5(C.resolve); + iterate$2(iterable, function (promise) { + call$e($promiseResolve, C, promise).then(capability.resolve, reject); + }); + }); + if (result.error) reject(result.value); + return capability.promise; + } + }); + + var typedArrayConstructor = {exports: {}}; + + /* eslint-disable no-new -- required for testing */ + + var global$y = global$1o; + var fails$A = fails$V; + var checkCorrectnessOfIteration$2 = checkCorrectnessOfIteration$4; + var NATIVE_ARRAY_BUFFER_VIEWS$1 = arrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS; + + var ArrayBuffer$2 = global$y.ArrayBuffer; + var Int8Array$3 = global$y.Int8Array; + + var typedArrayConstructorsRequireWrappers = !NATIVE_ARRAY_BUFFER_VIEWS$1 || !fails$A(function () { + Int8Array$3(1); + }) || !fails$A(function () { + new Int8Array$3(-1); + }) || !checkCorrectnessOfIteration$2(function (iterable) { + new Int8Array$3(); + new Int8Array$3(null); + new Int8Array$3(1.5); + new Int8Array$3(iterable); + }, true) || fails$A(function () { + // Safari (11+) bug - a reason why even Safari 13 should load a typed array polyfill + return new Int8Array$3(new ArrayBuffer$2(2), 1, undefined).length !== 1; }); - var $String = GetIntrinsic('%String%'); - var $TypeError$b = GetIntrinsic('%TypeError%'); + var isObject$h = isObject$s; - // https://www.ecma-international.org/ecma-262/6.0/#sec-tostring + var floor$6 = Math.floor; - var ToString = function ToString(argument) { - if (typeof argument === 'symbol') { - throw new $TypeError$b('Cannot convert a Symbol value to a string'); - } - return $String(argument); + // `IsIntegralNumber` abstract operation + // https://tc39.es/ecma262/#sec-isintegralnumber + // eslint-disable-next-line es/no-number-isinteger -- safe + var isIntegralNumber$1 = Number.isInteger || function isInteger(it) { + return !isObject$h(it) && isFinite(it) && floor$6(it) === it; }; - var hasToStringTag$3 = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol'; - var toStr$9 = Object.prototype.toString; + var global$x = global$1o; + var toIntegerOrInfinity$5 = toIntegerOrInfinity$b; - var isStandardArguments = function isArguments(value) { - if (hasToStringTag$3 && value && typeof value === 'object' && Symbol.toStringTag in value) { - return false; - } - return toStr$9.call(value) === '[object Arguments]'; - }; + var RangeError$9 = global$x.RangeError; - var isLegacyArguments = function isArguments(value) { - if (isStandardArguments(value)) { - return true; - } - return value !== null && - typeof value === 'object' && - typeof value.length === 'number' && - value.length >= 0 && - toStr$9.call(value) !== '[object Array]' && - toStr$9.call(value.callee) === '[object Function]'; + var toPositiveInteger$1 = function (it) { + var result = toIntegerOrInfinity$5(it); + if (result < 0) throw RangeError$9("The argument can't be less than 0"); + return result; }; - var supportsStandardArguments = (function () { - return isStandardArguments(arguments); - }()); + var global$w = global$1o; + var toPositiveInteger = toPositiveInteger$1; - isStandardArguments.isLegacyArguments = isLegacyArguments; // for tests + var RangeError$8 = global$w.RangeError; - var isArguments$2 = supportsStandardArguments ? isStandardArguments : isLegacyArguments; + var toOffset$2 = function (it, BYTES) { + var offset = toPositiveInteger(it); + if (offset % BYTES) throw RangeError$8('Wrong offset'); + return offset; + }; - var toString = {}.toString; + var bind$9 = functionBindContext; + var call$d = functionCall; + var aConstructor$1 = aConstructor$3; + var toObject$c = toObject$i; + var lengthOfArrayLike$c = lengthOfArrayLike$i; + var getIterator$2 = getIterator$4; + var getIteratorMethod$2 = getIteratorMethod$5; + var isArrayIteratorMethod$1 = isArrayIteratorMethod$3; + var aTypedArrayConstructor$2 = arrayBufferViewCore.aTypedArrayConstructor; - var isarray = Array.isArray || function (arr) { - return toString.call(arr) == '[object Array]'; + var typedArrayFrom$2 = function from(source /* , mapfn, thisArg */) { + var C = aConstructor$1(this); + var O = toObject$c(source); + var argumentsLength = arguments.length; + var mapfn = argumentsLength > 1 ? arguments[1] : undefined; + var mapping = mapfn !== undefined; + var iteratorMethod = getIteratorMethod$2(O); + var i, length, result, step, iterator, next; + if (iteratorMethod && !isArrayIteratorMethod$1(iteratorMethod)) { + iterator = getIterator$2(O, iteratorMethod); + next = iterator.next; + O = []; + while (!(step = call$d(next, iterator)).done) { + O.push(step.value); + } + } + if (mapping && argumentsLength > 2) { + mapfn = bind$9(mapfn, arguments[2]); + } + length = lengthOfArrayLike$c(O); + result = new (aTypedArrayConstructor$2(C))(length); + for (i = 0; length > i; i++) { + result[i] = mapping ? mapfn(O[i], i) : O[i]; + } + return result; }; - var strValue = String.prototype.valueOf; - var tryStringObject = function tryStringObject(value) { - try { - strValue.call(value); - return true; - } catch (e) { - return false; - } - }; - var toStr$a = Object.prototype.toString; - var strClass = '[object String]'; - var hasToStringTag$4 = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol'; - - var isString$2 = function isString(value) { - if (typeof value === 'string') { - return true; - } - if (typeof value !== 'object') { - return false; - } - return hasToStringTag$4 ? tryStringObject(value) : toStr$a.call(value) === strClass; + var isCallable$6 = isCallable$r; + var isObject$g = isObject$s; + var setPrototypeOf$2 = objectSetPrototypeOf; + + // makes subclassing work correct for wrapped built-ins + var inheritIfRequired$4 = function ($this, dummy, Wrapper) { + var NewTarget, NewTargetPrototype; + if ( + // it can work only with native `setPrototypeOf` + setPrototypeOf$2 && + // we haven't completely correct pre-ES6 way for getting `new.target`, so use this + isCallable$6(NewTarget = dummy.constructor) && + NewTarget !== Wrapper && + isObject$g(NewTargetPrototype = NewTarget.prototype) && + NewTargetPrototype !== Wrapper.prototype + ) setPrototypeOf$2($this, NewTargetPrototype); + return $this; + }; + + var $$_ = _export; + var global$v = global$1o; + var call$c = functionCall; + var DESCRIPTORS$c = descriptors; + var TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS$1 = typedArrayConstructorsRequireWrappers; + var ArrayBufferViewCore$n = arrayBufferViewCore; + var ArrayBufferModule = arrayBuffer; + var anInstance$4 = anInstance$7; + var createPropertyDescriptor$1 = createPropertyDescriptor$7; + var createNonEnumerableProperty$2 = createNonEnumerableProperty$b; + var isIntegralNumber = isIntegralNumber$1; + var toLength$7 = toLength$c; + var toIndex = toIndex$2; + var toOffset$1 = toOffset$2; + var toPropertyKey = toPropertyKey$5; + var hasOwn$7 = hasOwnProperty_1; + var classof$4 = classof$d; + var isObject$f = isObject$s; + var isSymbol$2 = isSymbol$6; + var create$7 = objectCreate; + var isPrototypeOf$3 = objectIsPrototypeOf; + var setPrototypeOf$1 = objectSetPrototypeOf; + var getOwnPropertyNames$2 = objectGetOwnPropertyNames.f; + var typedArrayFrom$1 = typedArrayFrom$2; + var forEach$1 = arrayIteration.forEach; + var setSpecies$2 = setSpecies$5; + var definePropertyModule = objectDefineProperty; + var getOwnPropertyDescriptorModule$1 = objectGetOwnPropertyDescriptor; + var InternalStateModule$3 = internalState; + var inheritIfRequired$3 = inheritIfRequired$4; + + var getInternalState = InternalStateModule$3.get; + var setInternalState$3 = InternalStateModule$3.set; + var nativeDefineProperty = definePropertyModule.f; + var nativeGetOwnPropertyDescriptor$1 = getOwnPropertyDescriptorModule$1.f; + var round = Math.round; + var RangeError$7 = global$v.RangeError; + var ArrayBuffer$1 = ArrayBufferModule.ArrayBuffer; + var ArrayBufferPrototype = ArrayBuffer$1.prototype; + var DataView$1 = ArrayBufferModule.DataView; + var NATIVE_ARRAY_BUFFER_VIEWS = ArrayBufferViewCore$n.NATIVE_ARRAY_BUFFER_VIEWS; + var TYPED_ARRAY_CONSTRUCTOR$1 = ArrayBufferViewCore$n.TYPED_ARRAY_CONSTRUCTOR; + var TYPED_ARRAY_TAG = ArrayBufferViewCore$n.TYPED_ARRAY_TAG; + var TypedArray = ArrayBufferViewCore$n.TypedArray; + var TypedArrayPrototype$1 = ArrayBufferViewCore$n.TypedArrayPrototype; + var aTypedArrayConstructor$1 = ArrayBufferViewCore$n.aTypedArrayConstructor; + var isTypedArray = ArrayBufferViewCore$n.isTypedArray; + var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT'; + var WRONG_LENGTH = 'Wrong length'; + + var fromList = function (C, list) { + aTypedArrayConstructor$1(C); + var index = 0; + var length = list.length; + var result = new C(length); + while (length > index) result[index] = list[index++]; + return result; }; - var $Map = typeof Map === 'function' && Map.prototype ? Map : null; - var $Set = typeof Set === 'function' && Set.prototype ? Set : null; - - var exported; - - if (!$Map) { - // eslint-disable-next-line no-unused-vars - exported = function isMap(x) { - // `Map` is not present in this environment. - return false; - }; - } - - var $mapHas = $Map ? Map.prototype.has : null; - var $setHas = $Set ? Set.prototype.has : null; - if (!exported && !$mapHas) { - // eslint-disable-next-line no-unused-vars - exported = function isMap(x) { - // `Map` does not have a `has` method - return false; - }; - } - - var isMap$1 = exported || function isMap(x) { - if (!x || typeof x !== 'object') { - return false; - } - try { - $mapHas.call(x); - if ($setHas) { - try { - $setHas.call(x); - } catch (e) { - return true; - } - } - return x instanceof $Map; // core-js workaround, pre-v2.5.0 - } catch (e$1) {} - return false; + var addGetter = function (it, key) { + nativeDefineProperty(it, key, { get: function () { + return getInternalState(this)[key]; + } }); }; - var $Map$1 = typeof Map === 'function' && Map.prototype ? Map : null; - var $Set$1 = typeof Set === 'function' && Set.prototype ? Set : null; - - var exported$1; - - if (!$Set$1) { - // eslint-disable-next-line no-unused-vars - exported$1 = function isSet(x) { - // `Set` is not present in this environment. - return false; - }; - } - - var $mapHas$1 = $Map$1 ? Map.prototype.has : null; - var $setHas$1 = $Set$1 ? Set.prototype.has : null; - if (!exported$1 && !$setHas$1) { - // eslint-disable-next-line no-unused-vars - exported$1 = function isSet(x) { - // `Set` does not have a `has` method - return false; - }; - } - - var isSet$1 = exported$1 || function isSet(x) { - if (!x || typeof x !== 'object') { - return false; - } - try { - $setHas$1.call(x); - if ($mapHas$1) { - try { - $mapHas$1.call(x); - } catch (e) { - return true; - } - } - return x instanceof $Set$1; // core-js workaround, pre-v2.5.0 - } catch (e$1) {} - return false; + var isArrayBuffer = function (it) { + var klass; + return isPrototypeOf$3(ArrayBufferPrototype, it) || (klass = classof$4(it)) == 'ArrayBuffer' || klass == 'SharedArrayBuffer'; }; - var esGetIterator = createCommonjsModule(function (module) { + var isTypedArrayIndex = function (target, key) { + return isTypedArray(target) + && !isSymbol$2(key) + && key in target + && isIntegralNumber(+key) + && key >= 0; + }; - /* eslint global-require: 0 */ - // the code is structured this way so that bundlers can - // alias out `has-symbols` to `() => true` or `() => false` if your target - // environments' Symbol capabilities are known, and then use - // dead code elimination on the rest of this module. - // - // Similarly, `isarray` can be aliased to `Array.isArray` if - // available in all target environments. - - - - if (hasSymbols$1() || shams()) { - var $iterator = Symbol.iterator; - // Symbol is available natively or shammed - // natively: - // - Chrome >= 38 - // - Edge 12-14?, Edge >= 15 for sure - // - FF >= 36 - // - Safari >= 9 - // - node >= 0.12 - module.exports = function getIterator(iterable) { - // alternatively, `iterable[$iterator]?.()` - if (iterable != null && typeof iterable[$iterator] !== 'undefined') { - return iterable[$iterator](); - } - if (isArguments$2(iterable)) { - // arguments objects lack Symbol.iterator - // - node 0.12 - return Array.prototype[$iterator].call(iterable); - } - }; - } else { - // Symbol is not available, native or shammed - var isArray = isarray; - var isString = isString$2; - var GetIntrinsic$1 = GetIntrinsic; - var $Map = GetIntrinsic$1('%Map%', true); - var $Set = GetIntrinsic$1('%Set%', true); - var callBound$1 = callBound; - var $arrayPush = callBound$1('Array.prototype.push'); - var $charCodeAt = callBound$1('String.prototype.charCodeAt'); - var $stringSlice = callBound$1('String.prototype.slice'); - - var advanceStringIndex = function advanceStringIndex(S, index) { - var length = S.length; - if ((index + 1) >= length) { - return index + 1; - } - - var first = $charCodeAt(S, index); - if (first < 0xD800 || first > 0xDBFF) { - return index + 1; - } - - var second = $charCodeAt(S, index + 1); - if (second < 0xDC00 || second > 0xDFFF) { - return index + 1; - } - - return index + 2; - }; - - var getArrayIterator = function getArrayIterator(arraylike) { - var i = 0; - return { - next: function next() { - var done = i >= arraylike.length; - var value; - if (!done) { - value = arraylike[i]; - i += 1; - } - return { - done: done, - value: value - }; - } - }; - }; - - var getNonCollectionIterator = function getNonCollectionIterator(iterable) { - if (isArray(iterable) || isArguments$2(iterable)) { - return getArrayIterator(iterable); - } - if (isString(iterable)) { - var i = 0; - return { - next: function next() { - var nextIndex = advanceStringIndex(iterable, i); - var value = $stringSlice(iterable, i, nextIndex); - i = nextIndex; - return { - done: nextIndex > iterable.length, - value: value - }; - } - }; - } - }; - - if (!$Map && !$Set) { - // the only language iterables are Array, String, arguments - // - Safari <= 6.0 - // - Chrome < 38 - // - node < 0.12 - // - FF < 13 - // - IE < 11 - // - Edge < 11 - - module.exports = getNonCollectionIterator; - } else { - // either Map or Set are available, but Symbol is not - // - es6-shim on an ES5 browser - // - Safari 6.2 (maybe 6.1?) - // - FF v[13, 36) - // - IE 11 - // - Edge 11 - // - Safari v[6, 9) - - var isMap = isMap$1; - var isSet = isSet$1; - - // Firefox >= 27, IE 11, Safari 6.2 - 9, Edge 11, es6-shim in older envs, all have forEach - var $mapForEach = callBound$1('Map.prototype.forEach', true); - var $setForEach = callBound$1('Set.prototype.forEach', true); - if (typeof process === 'undefined' || !process.versions || !process.versions.node) { // "if is not node" - - // Firefox 17 - 26 has `.iterator()`, whose iterator `.next()` either - // returns a value, or throws a StopIteration object. These browsers - // do not have any other mechanism for iteration. - var $mapIterator = callBound$1('Map.prototype.iterator', true); - var $setIterator = callBound$1('Set.prototype.iterator', true); - var getStopIterationIterator = function (iterator) { - var done = false; - return { - next: function next() { - try { - return { - done: done, - value: done ? undefined : iterator.next() - }; - } catch (e) { - done = true; - return { - done: true, - value: undefined - }; - } - } - }; - }; - } - // Firefox 27-35, and some older es6-shim versions, use a string "@@iterator" property - // this returns a proper iterator object, so we should use it instead of forEach. - // newer es6-shim versions use a string "_es6-shim iterator_" property. - var $mapAtAtIterator = callBound$1('Map.prototype.@@iterator', true) || callBound$1('Map.prototype._es6-shim iterator_', true); - var $setAtAtIterator = callBound$1('Set.prototype.@@iterator', true) || callBound$1('Set.prototype._es6-shim iterator_', true); - - var getCollectionIterator = function getCollectionIterator(iterable) { - if (isMap(iterable)) { - if ($mapIterator) { - return getStopIterationIterator($mapIterator(iterable)); - } - if ($mapAtAtIterator) { - return $mapAtAtIterator(iterable); - } - if ($mapForEach) { - var entries = []; - $mapForEach(iterable, function (v, k) { - $arrayPush(entries, [k, v]); - }); - return getArrayIterator(entries); - } - } - if (isSet(iterable)) { - if ($setIterator) { - return getStopIterationIterator($setIterator(iterable)); - } - if ($setAtAtIterator) { - return $setAtAtIterator(iterable); - } - if ($setForEach) { - var values = []; - $setForEach(iterable, function (v) { - $arrayPush(values, v); - }); - return getArrayIterator(values); - } - } - }; - - module.exports = function getIterator(iterable) { - return getCollectionIterator(iterable) || getNonCollectionIterator(iterable); - }; - } - } - }); + var wrappedGetOwnPropertyDescriptor = function getOwnPropertyDescriptor(target, key) { + key = toPropertyKey(key); + return isTypedArrayIndex(target, key) + ? createPropertyDescriptor$1(2, target[key]) + : nativeGetOwnPropertyDescriptor$1(target, key); + }; - var $TypeError$c = TypeError; - - // eslint-disable-next-line consistent-return - var iterateIterator = function iterateIterator(iterator) { - if (!iterator || typeof iterator.next !== 'function') { - throw new $TypeError$c('iterator must be an object with a `next` method'); - } - if (arguments.length > 1) { - var callback = arguments[1]; - if (typeof callback !== 'function') { - throw new $TypeError$c('`callback`, if provided, must be a function'); - } - } - var values = callback || []; - var result; - while ((result = iterator.next()) && !result.done) { - if (callback) { - callback(result.value); // eslint-disable-line callback-return - } else { - values.push(result.value); - } - } - if (!callback) { - return values; - } + var wrappedDefineProperty = function defineProperty(target, key, descriptor) { + key = toPropertyKey(key); + if (isTypedArrayIndex(target, key) + && isObject$f(descriptor) + && hasOwn$7(descriptor, 'value') + && !hasOwn$7(descriptor, 'get') + && !hasOwn$7(descriptor, 'set') + // TODO: add validation descriptor w/o calling accessors + && !descriptor.configurable + && (!hasOwn$7(descriptor, 'writable') || descriptor.writable) + && (!hasOwn$7(descriptor, 'enumerable') || descriptor.enumerable) + ) { + target[key] = descriptor.value; + return target; + } return nativeDefineProperty(target, key, descriptor); }; - var $TypeError$d = TypeError; + if (DESCRIPTORS$c) { + if (!NATIVE_ARRAY_BUFFER_VIEWS) { + getOwnPropertyDescriptorModule$1.f = wrappedGetOwnPropertyDescriptor; + definePropertyModule.f = wrappedDefineProperty; + addGetter(TypedArrayPrototype$1, 'buffer'); + addGetter(TypedArrayPrototype$1, 'byteOffset'); + addGetter(TypedArrayPrototype$1, 'byteLength'); + addGetter(TypedArrayPrototype$1, 'length'); + } + $$_({ target: 'Object', stat: true, forced: !NATIVE_ARRAY_BUFFER_VIEWS }, { + getOwnPropertyDescriptor: wrappedGetOwnPropertyDescriptor, + defineProperty: wrappedDefineProperty + }); - var iterateValue = function iterateValue(iterable) { - var iterator = esGetIterator(iterable); - if (!iterator) { - throw new $TypeError$d('non-iterable value provided'); - } - if (arguments.length > 1) { - return iterateIterator(iterator, arguments[1]); - } - return iterateIterator(iterator); - }; + typedArrayConstructor.exports = function (TYPE, wrapper, CLAMPED) { + var BYTES = TYPE.match(/\d+$/)[0] / 8; + var CONSTRUCTOR_NAME = TYPE + (CLAMPED ? 'Clamped' : '') + 'Array'; + var GETTER = 'get' + TYPE; + var SETTER = 'set' + TYPE; + var NativeTypedArrayConstructor = global$v[CONSTRUCTOR_NAME]; + var TypedArrayConstructor = NativeTypedArrayConstructor; + var TypedArrayConstructorPrototype = TypedArrayConstructor && TypedArrayConstructor.prototype; + var exported = {}; - var implementation$5 = function from(items) { - var C = this; - if (items === null || typeof items === 'undefined') { - throw new TypeError('`Array.from` requires an array-like object, not `null` or `undefined`'); - } - var mapFn, T; - if (typeof arguments[1] !== 'undefined') { - mapFn = arguments[1]; - if (!IsCallable(mapFn)) { - throw new TypeError('When provided, the second argument to `Array.from` must be a function'); - } - if (arguments.length > 2) { - T = arguments[2]; - } - } - - var values; - try { - values = iterateValue(items); - } catch (e) { - values = items; - } - - var arrayLike = ToObject(values); - var len = ToLength(arrayLike.length); - var A = IsConstructor(C) ? ToObject(new C(len)) : new Array(len); - var k = 0; - var kValue, mappedValue; - - while (k < len) { - var Pk = ToString(k); - kValue = Get(arrayLike, Pk); - if (mapFn) { - mappedValue = typeof T === 'undefined' ? mapFn(kValue, k) : Call(mapFn, T, [kValue, k]); - } else { - mappedValue = kValue; - } - CreateDataPropertyOrThrow(A, Pk, mappedValue); - k += 1; - } - A.length = len; - return A; - }; + var getter = function (that, index) { + var data = getInternalState(that); + return data.view[GETTER](index * BYTES + data.byteOffset, true); + }; - var tryCall = function (fn) { - try { - return fn(); - } catch (e) { - return false; - } - }; + var setter = function (that, index, value) { + var data = getInternalState(that); + if (CLAMPED) value = (value = round(value)) < 0 ? 0 : value > 0xFF ? 0xFF : value & 0xFF; + data.view[SETTER](index * BYTES + data.byteOffset, value, true); + }; - var polyfill$8 = function getPolyfill() { - if (IsCallable(Array.from)) { - var handlesUndefMapper = tryCall(function () { - // Microsoft Edge v0.11 throws if the mapFn argument is *provided* but undefined, - // but the spec doesn't care if it's provided or not - undefined doesn't throw. - return Array.from([0], undefined); - }); - if (!handlesUndefMapper) { - var origArrayFrom = Array.from; - return function from(items) { - /* eslint no-invalid-this: 0 */ - if (arguments.length > 1 && typeof arguments[1] !== 'undefined') { - return Call(origArrayFrom, this, arguments); - } else { - return Call(origArrayFrom, this, [items]); - } - }; - } - var implemented = tryCall(function () { - // Detects a Firefox bug in v32 - // https://bugzilla.mozilla.org/show_bug.cgi?id=1063993 - return Array.from({ 'length': -1 }) === 0; - }) - && tryCall(function () { - // Detects a bug in Webkit nightly r181886 - var arr = Array.from([0].entries()); - return arr.length === 1 && IsArray(arr[0]) && arr[0][0] === 0 && arr[0][1] === 0; - }) - && tryCall(function () { - return Array.from({ 'length': -Infinity }); - }); - if (implemented) { - return Array.from; - } - } - - return implementation$5; - }; + var addElement = function (that, index) { + nativeDefineProperty(that, index, { + get: function () { + return getter(this, index); + }, + set: function (value) { + return setter(this, index, value); + }, + enumerable: true + }); + }; - var shim$a = function shimArrayFrom() { - var polyfill = polyfill$8(); + if (!NATIVE_ARRAY_BUFFER_VIEWS) { + TypedArrayConstructor = wrapper(function (that, data, offset, $length) { + anInstance$4(that, TypedArrayConstructorPrototype); + var index = 0; + var byteOffset = 0; + var buffer, byteLength, length; + if (!isObject$f(data)) { + length = toIndex(data); + byteLength = length * BYTES; + buffer = new ArrayBuffer$1(byteLength); + } else if (isArrayBuffer(data)) { + buffer = data; + byteOffset = toOffset$1(offset, BYTES); + var $len = data.byteLength; + if ($length === undefined) { + if ($len % BYTES) throw RangeError$7(WRONG_LENGTH); + byteLength = $len - byteOffset; + if (byteLength < 0) throw RangeError$7(WRONG_LENGTH); + } else { + byteLength = toLength$7($length) * BYTES; + if (byteLength + byteOffset > $len) throw RangeError$7(WRONG_LENGTH); + } + length = byteLength / BYTES; + } else if (isTypedArray(data)) { + return fromList(TypedArrayConstructor, data); + } else { + return call$c(typedArrayFrom$1, TypedArrayConstructor, data); + } + setInternalState$3(that, { + buffer: buffer, + byteOffset: byteOffset, + byteLength: byteLength, + length: length, + view: new DataView$1(buffer) + }); + while (index < length) addElement(that, index++); + }); - defineProperties_1(Array, { 'from': polyfill }, { - 'from': function () { - return Array.from !== polyfill; - } - }); + if (setPrototypeOf$1) setPrototypeOf$1(TypedArrayConstructor, TypedArray); + TypedArrayConstructorPrototype = TypedArrayConstructor.prototype = create$7(TypedArrayPrototype$1); + } else if (TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS$1) { + TypedArrayConstructor = wrapper(function (dummy, data, typedArrayOffset, $length) { + anInstance$4(dummy, TypedArrayConstructorPrototype); + return inheritIfRequired$3(function () { + if (!isObject$f(data)) return new NativeTypedArrayConstructor(toIndex(data)); + if (isArrayBuffer(data)) return $length !== undefined + ? new NativeTypedArrayConstructor(data, toOffset$1(typedArrayOffset, BYTES), $length) + : typedArrayOffset !== undefined + ? new NativeTypedArrayConstructor(data, toOffset$1(typedArrayOffset, BYTES)) + : new NativeTypedArrayConstructor(data); + if (isTypedArray(data)) return fromList(TypedArrayConstructor, data); + return call$c(typedArrayFrom$1, TypedArrayConstructor, data); + }(), dummy, TypedArrayConstructor); + }); - return polyfill; - }; + if (setPrototypeOf$1) setPrototypeOf$1(TypedArrayConstructor, TypedArray); + forEach$1(getOwnPropertyNames$2(NativeTypedArrayConstructor), function (key) { + if (!(key in TypedArrayConstructor)) { + createNonEnumerableProperty$2(TypedArrayConstructor, key, NativeTypedArrayConstructor[key]); + } + }); + TypedArrayConstructor.prototype = TypedArrayConstructorPrototype; + } - var polyfill$9 = polyfill$8(); + if (TypedArrayConstructorPrototype.constructor !== TypedArrayConstructor) { + createNonEnumerableProperty$2(TypedArrayConstructorPrototype, 'constructor', TypedArrayConstructor); + } - // eslint-disable-next-line no-unused-vars - var boundFromShim = function from(items) { - // eslint-disable-next-line no-invalid-this - return polyfill$9.apply(this || Array, arguments); - }; + createNonEnumerableProperty$2(TypedArrayConstructorPrototype, TYPED_ARRAY_CONSTRUCTOR$1, TypedArrayConstructor); - defineProperties_1(boundFromShim, { - 'getPolyfill': polyfill$8, - 'implementation': implementation$5, - 'shim': shim$a - }); + if (TYPED_ARRAY_TAG) { + createNonEnumerableProperty$2(TypedArrayConstructorPrototype, TYPED_ARRAY_TAG, CONSTRUCTOR_NAME); + } - var array_from = boundFromShim; + exported[CONSTRUCTOR_NAME] = TypedArrayConstructor; - var $isEnumerable$2 = callBound('Object.prototype.propertyIsEnumerable'); + $$_({ + global: true, forced: TypedArrayConstructor != NativeTypedArrayConstructor, sham: !NATIVE_ARRAY_BUFFER_VIEWS + }, exported); - var implementation$6 = function values(O) { - var obj = RequireObjectCoercible(O); - var vals = []; - for (var key in obj) { - if (src(obj, key) && $isEnumerable$2(obj, key)) { - vals.push(obj[key]); - } - } - return vals; - }; + if (!(BYTES_PER_ELEMENT in TypedArrayConstructor)) { + createNonEnumerableProperty$2(TypedArrayConstructor, BYTES_PER_ELEMENT, BYTES); + } - var polyfill$a = function getPolyfill() { - return typeof Object.values === 'function' ? Object.values : implementation$6; - }; + if (!(BYTES_PER_ELEMENT in TypedArrayConstructorPrototype)) { + createNonEnumerableProperty$2(TypedArrayConstructorPrototype, BYTES_PER_ELEMENT, BYTES); + } - var shim$b = function shimValues() { - var polyfill = polyfill$a(); - defineProperties_1(Object, { values: polyfill }, { - values: function testValues() { - return Object.values !== polyfill; - } - }); - return polyfill; - }; + setSpecies$2(CONSTRUCTOR_NAME); + }; + } else typedArrayConstructor.exports = function () { /* empty */ }; + + var createTypedArrayConstructor$1 = typedArrayConstructor.exports; - var polyfill$b = polyfill$a(); + // `Uint8Array` constructor + // https://tc39.es/ecma262/#sec-typedarray-objects + createTypedArrayConstructor$1('Uint8', function (init) { + return function Uint8Array(data, byteOffset, length) { + return init(this, data, byteOffset, length); + }; + }); - defineProperties_1(polyfill$b, { - getPolyfill: polyfill$a, - implementation: implementation$6, - shim: shim$b + var toObject$b = toObject$i; + var toAbsoluteIndex$4 = toAbsoluteIndex$9; + var lengthOfArrayLike$b = lengthOfArrayLike$i; + + var min$7 = Math.min; + + // `Array.prototype.copyWithin` method implementation + // https://tc39.es/ecma262/#sec-array.prototype.copywithin + // eslint-disable-next-line es/no-array-prototype-copywithin -- safe + var arrayCopyWithin = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) { + var O = toObject$b(this); + var len = lengthOfArrayLike$b(O); + var to = toAbsoluteIndex$4(target, len); + var from = toAbsoluteIndex$4(start, len); + var end = arguments.length > 2 ? arguments[2] : undefined; + var count = min$7((end === undefined ? len : toAbsoluteIndex$4(end, len)) - from, len - to); + var inc = 1; + if (from < to && to < from + count) { + inc = -1; + from += count - 1; + to += count - 1; + } + while (count-- > 0) { + if (from in O) O[to] = O[from]; + else delete O[to]; + to += inc; + from += inc; + } return O; + }; + + var uncurryThis$A = functionUncurryThis; + var ArrayBufferViewCore$m = arrayBufferViewCore; + var $ArrayCopyWithin = arrayCopyWithin; + + var u$ArrayCopyWithin = uncurryThis$A($ArrayCopyWithin); + var aTypedArray$l = ArrayBufferViewCore$m.aTypedArray; + var exportTypedArrayMethod$m = ArrayBufferViewCore$m.exportTypedArrayMethod; + + // `%TypedArray%.prototype.copyWithin` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.copywithin + exportTypedArrayMethod$m('copyWithin', function copyWithin(target, start /* , end */) { + return u$ArrayCopyWithin(aTypedArray$l(this), target, start, arguments.length > 2 ? arguments[2] : undefined); }); - var object_values = polyfill$b; + var ArrayBufferViewCore$l = arrayBufferViewCore; + var $every$1 = arrayIteration.every; - // modified from https://github.com/es-shims/es6-shim + var aTypedArray$k = ArrayBufferViewCore$l.aTypedArray; + var exportTypedArrayMethod$l = ArrayBufferViewCore$l.exportTypedArrayMethod; + // `%TypedArray%.prototype.every` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.every + exportTypedArrayMethod$l('every', function every(callbackfn /* , thisArg */) { + return $every$1(aTypedArray$k(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); + }); - var canBeObject = function (obj) { - return typeof obj !== 'undefined' && obj !== null; - }; - var hasSymbols$5 = shams(); - var toObject = Object; - var push = functionBind.call(Function.call, Array.prototype.push); - var propIsEnumerable = functionBind.call(Function.call, Object.prototype.propertyIsEnumerable); - var originalGetSymbols = hasSymbols$5 ? Object.getOwnPropertySymbols : null; - - var implementation$7 = function assign(target, source1) { - var arguments$1 = arguments; - - if (!canBeObject(target)) { throw new TypeError('target must be an object'); } - var objTarget = toObject(target); - var s, source, i, props, syms, value, key; - for (s = 1; s < arguments.length; ++s) { - source = toObject(arguments$1[s]); - props = objectKeys(source); - var getSymbols = hasSymbols$5 && (Object.getOwnPropertySymbols || originalGetSymbols); - if (getSymbols) { - syms = getSymbols(source); - for (i = 0; i < syms.length; ++i) { - key = syms[i]; - if (propIsEnumerable(source, key)) { - push(props, key); - } - } - } - for (i = 0; i < props.length; ++i) { - key = props[i]; - value = source[key]; - if (propIsEnumerable(source, key)) { - objTarget[key] = value; - } - } - } - return objTarget; - }; + var ArrayBufferViewCore$k = arrayBufferViewCore; + var call$b = functionCall; + var $fill = arrayFill$1; + + var aTypedArray$j = ArrayBufferViewCore$k.aTypedArray; + var exportTypedArrayMethod$k = ArrayBufferViewCore$k.exportTypedArrayMethod; + + // `%TypedArray%.prototype.fill` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.fill + exportTypedArrayMethod$k('fill', function fill(value /* , start, end */) { + var length = arguments.length; + return call$b( + $fill, + aTypedArray$j(this), + value, + length > 1 ? arguments[1] : undefined, + length > 2 ? arguments[2] : undefined + ); + }); - var lacksProperEnumerationOrder = function () { - if (!Object.assign) { - return false; - } - // v8, specifically in node 4.x, has a bug with incorrect property enumeration order - // note: this does not detect the bug unless there's 20 characters - var str = 'abcdefghijklmnopqrst'; - var letters = str.split(''); - var map = {}; - for (var i = 0; i < letters.length; ++i) { - map[letters[i]] = letters[i]; - } - var obj = Object.assign({}, map); - var actual = ''; - for (var k in obj) { - actual += k; - } - return str !== actual; - }; + var lengthOfArrayLike$a = lengthOfArrayLike$i; - var assignHasPendingExceptions = function () { - if (!Object.assign || !Object.preventExtensions) { - return false; - } - // Firefox 37 still has "pending exception" logic in its Object.assign implementation, - // which is 72% slower than our shim, and Firefox 40's native implementation. - var thrower = Object.preventExtensions({ 1: 2 }); - try { - Object.assign(thrower, 'xy'); - } catch (e) { - return thrower[1] === 'y'; - } - return false; + var arrayFromConstructorAndList$1 = function (Constructor, list) { + var index = 0; + var length = lengthOfArrayLike$a(list); + var result = new Constructor(length); + while (length > index) result[index] = list[index++]; + return result; }; - var polyfill$c = function getPolyfill() { - if (!Object.assign) { - return implementation$7; - } - if (lacksProperEnumerationOrder()) { - return implementation$7; - } - if (assignHasPendingExceptions()) { - return implementation$7; - } - return Object.assign; + var ArrayBufferViewCore$j = arrayBufferViewCore; + var speciesConstructor$2 = speciesConstructor$5; + + var TYPED_ARRAY_CONSTRUCTOR = ArrayBufferViewCore$j.TYPED_ARRAY_CONSTRUCTOR; + var aTypedArrayConstructor = ArrayBufferViewCore$j.aTypedArrayConstructor; + + // a part of `TypedArraySpeciesCreate` abstract operation + // https://tc39.es/ecma262/#typedarray-species-create + var typedArraySpeciesConstructor$4 = function (originalArray) { + return aTypedArrayConstructor(speciesConstructor$2(originalArray, originalArray[TYPED_ARRAY_CONSTRUCTOR])); }; - var shim$c = function shimAssign() { - var polyfill = polyfill$c(); - defineProperties_1( - Object, - { assign: polyfill }, - { assign: function () { return Object.assign !== polyfill; } } - ); - return polyfill; + var arrayFromConstructorAndList = arrayFromConstructorAndList$1; + var typedArraySpeciesConstructor$3 = typedArraySpeciesConstructor$4; + + var typedArrayFromSpeciesAndList = function (instance, list) { + return arrayFromConstructorAndList(typedArraySpeciesConstructor$3(instance), list); }; - var polyfill$d = polyfill$c(); + var ArrayBufferViewCore$i = arrayBufferViewCore; + var $filter$1 = arrayIteration.filter; + var fromSpeciesAndList = typedArrayFromSpeciesAndList; + + var aTypedArray$i = ArrayBufferViewCore$i.aTypedArray; + var exportTypedArrayMethod$j = ArrayBufferViewCore$i.exportTypedArrayMethod; - defineProperties_1(polyfill$d, { - getPolyfill: polyfill$c, - implementation: implementation$7, - shim: shim$c + // `%TypedArray%.prototype.filter` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.filter + exportTypedArrayMethod$j('filter', function filter(callbackfn /* , thisArg */) { + var list = $filter$1(aTypedArray$i(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); + return fromSpeciesAndList(this, list); }); - var object_assign = polyfill$d; + var ArrayBufferViewCore$h = arrayBufferViewCore; + var $find$1 = arrayIteration.find; - /** - * @this {Promise} - */ - function finallyConstructor(callback) { - var constructor = this.constructor; - return this.then( - function(value) { - // @ts-ignore - return constructor.resolve(callback()).then(function() { - return value; - }); - }, - function(reason) { - // @ts-ignore - return constructor.resolve(callback()).then(function() { - // @ts-ignore - return constructor.reject(reason); - }); - } - ); - } + var aTypedArray$h = ArrayBufferViewCore$h.aTypedArray; + var exportTypedArrayMethod$i = ArrayBufferViewCore$h.exportTypedArrayMethod; - // Store setTimeout reference so promise-polyfill will be unaffected by - // other code modifying setTimeout (like sinon.useFakeTimers()) - var setTimeoutFunc = setTimeout; + // `%TypedArray%.prototype.find` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.find + exportTypedArrayMethod$i('find', function find(predicate /* , thisArg */) { + return $find$1(aTypedArray$h(this), predicate, arguments.length > 1 ? arguments[1] : undefined); + }); - function isArray$4(x) { - return Boolean(x && typeof x.length !== 'undefined'); - } + var ArrayBufferViewCore$g = arrayBufferViewCore; + var $findIndex$1 = arrayIteration.findIndex; - function noop$1() {} + var aTypedArray$g = ArrayBufferViewCore$g.aTypedArray; + var exportTypedArrayMethod$h = ArrayBufferViewCore$g.exportTypedArrayMethod; - // Polyfill for Function.prototype.bind - function bind$2(fn, thisArg) { - return function() { - fn.apply(thisArg, arguments); - }; - } + // `%TypedArray%.prototype.findIndex` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.findindex + exportTypedArrayMethod$h('findIndex', function findIndex(predicate /* , thisArg */) { + return $findIndex$1(aTypedArray$g(this), predicate, arguments.length > 1 ? arguments[1] : undefined); + }); - /** - * @constructor - * @param {Function} fn - */ - function Promise$1(fn) { - if (!(this instanceof Promise$1)) - { throw new TypeError('Promises must be constructed via new'); } - if (typeof fn !== 'function') { throw new TypeError('not a function'); } - /** @type {!number} */ - this._state = 0; - /** @type {!boolean} */ - this._handled = false; - /** @type {Promise|undefined} */ - this._value = undefined; - /** @type {!Array} */ - this._deferreds = []; - - doResolve(fn, this); - } - - function handle(self, deferred) { - while (self._state === 3) { - self = self._value; - } - if (self._state === 0) { - self._deferreds.push(deferred); - return; - } - self._handled = true; - Promise$1._immediateFn(function() { - var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected; - if (cb === null) { - (self._state === 1 ? resolve : reject)(deferred.promise, self._value); - return; - } - var ret; - try { - ret = cb(self._value); - } catch (e) { - reject(deferred.promise, e); - return; - } - resolve(deferred.promise, ret); - }); - } + var ArrayBufferViewCore$f = arrayBufferViewCore; + var $forEach = arrayIteration.forEach; - function resolve(self, newValue) { - try { - // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure - if (newValue === self) - { throw new TypeError('A promise cannot be resolved with itself.'); } - if ( - newValue && - (typeof newValue === 'object' || typeof newValue === 'function') - ) { - var then = newValue.then; - if (newValue instanceof Promise$1) { - self._state = 3; - self._value = newValue; - finale(self); - return; - } else if (typeof then === 'function') { - doResolve(bind$2(then, newValue), self); - return; - } - } - self._state = 1; - self._value = newValue; - finale(self); - } catch (e) { - reject(self, e); - } - } + var aTypedArray$f = ArrayBufferViewCore$f.aTypedArray; + var exportTypedArrayMethod$g = ArrayBufferViewCore$f.exportTypedArrayMethod; - function reject(self, newValue) { - self._state = 2; - self._value = newValue; - finale(self); - } + // `%TypedArray%.prototype.forEach` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.foreach + exportTypedArrayMethod$g('forEach', function forEach(callbackfn /* , thisArg */) { + $forEach(aTypedArray$f(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); + }); - function finale(self) { - if (self._state === 2 && self._deferreds.length === 0) { - Promise$1._immediateFn(function() { - if (!self._handled) { - Promise$1._unhandledRejectionFn(self._value); - } - }); - } + var ArrayBufferViewCore$e = arrayBufferViewCore; + var $includes$1 = arrayIncludes.includes; - for (var i = 0, len = self._deferreds.length; i < len; i++) { - handle(self, self._deferreds[i]); - } - self._deferreds = null; - } + var aTypedArray$e = ArrayBufferViewCore$e.aTypedArray; + var exportTypedArrayMethod$f = ArrayBufferViewCore$e.exportTypedArrayMethod; - /** - * @constructor - */ - function Handler(onFulfilled, onRejected, promise) { - this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; - this.onRejected = typeof onRejected === 'function' ? onRejected : null; - this.promise = promise; - } + // `%TypedArray%.prototype.includes` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.includes + exportTypedArrayMethod$f('includes', function includes(searchElement /* , fromIndex */) { + return $includes$1(aTypedArray$e(this), searchElement, arguments.length > 1 ? arguments[1] : undefined); + }); - /** - * Take a potentially misbehaving resolver function and make sure - * onFulfilled and onRejected are only called once. - * - * Makes no guarantees about asynchrony. - */ - function doResolve(fn, self) { - var done = false; - try { - fn( - function(value) { - if (done) { return; } - done = true; - resolve(self, value); - }, - function(reason) { - if (done) { return; } - done = true; - reject(self, reason); - } - ); - } catch (ex) { - if (done) { return; } - done = true; - reject(self, ex); - } - } + var ArrayBufferViewCore$d = arrayBufferViewCore; + var $indexOf = arrayIncludes.indexOf; - Promise$1.prototype['catch'] = function(onRejected) { - return this.then(null, onRejected); - }; + var aTypedArray$d = ArrayBufferViewCore$d.aTypedArray; + var exportTypedArrayMethod$e = ArrayBufferViewCore$d.exportTypedArrayMethod; - Promise$1.prototype.then = function(onFulfilled, onRejected) { - // @ts-ignore - var prom = new this.constructor(noop$1); + // `%TypedArray%.prototype.indexOf` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.indexof + exportTypedArrayMethod$e('indexOf', function indexOf(searchElement /* , fromIndex */) { + return $indexOf(aTypedArray$d(this), searchElement, arguments.length > 1 ? arguments[1] : undefined); + }); - handle(this, new Handler(onFulfilled, onRejected, prom)); - return prom; - }; + var global$u = global$1o; + var fails$z = fails$V; + var uncurryThis$z = functionUncurryThis; + var ArrayBufferViewCore$c = arrayBufferViewCore; + var ArrayIterators = es_array_iterator; + var wellKnownSymbol$9 = wellKnownSymbol$t; + + var ITERATOR$4 = wellKnownSymbol$9('iterator'); + var Uint8Array$2 = global$u.Uint8Array; + var arrayValues = uncurryThis$z(ArrayIterators.values); + var arrayKeys = uncurryThis$z(ArrayIterators.keys); + var arrayEntries = uncurryThis$z(ArrayIterators.entries); + var aTypedArray$c = ArrayBufferViewCore$c.aTypedArray; + var exportTypedArrayMethod$d = ArrayBufferViewCore$c.exportTypedArrayMethod; + var TypedArrayPrototype = Uint8Array$2 && Uint8Array$2.prototype; + + var GENERIC = !fails$z(function () { + TypedArrayPrototype[ITERATOR$4].call([1]); + }); - Promise$1.prototype['finally'] = finallyConstructor; + var ITERATOR_IS_VALUES = !!TypedArrayPrototype + && TypedArrayPrototype.values + && TypedArrayPrototype[ITERATOR$4] === TypedArrayPrototype.values + && TypedArrayPrototype.values.name === 'values'; + + var typedArrayValues = function values() { + return arrayValues(aTypedArray$c(this)); + }; + + // `%TypedArray%.prototype.entries` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.entries + exportTypedArrayMethod$d('entries', function entries() { + return arrayEntries(aTypedArray$c(this)); + }, GENERIC); + // `%TypedArray%.prototype.keys` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.keys + exportTypedArrayMethod$d('keys', function keys() { + return arrayKeys(aTypedArray$c(this)); + }, GENERIC); + // `%TypedArray%.prototype.values` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.values + exportTypedArrayMethod$d('values', typedArrayValues, GENERIC || !ITERATOR_IS_VALUES, { name: 'values' }); + // `%TypedArray%.prototype[@@iterator]` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype-@@iterator + exportTypedArrayMethod$d(ITERATOR$4, typedArrayValues, GENERIC || !ITERATOR_IS_VALUES, { name: 'values' }); + + var ArrayBufferViewCore$b = arrayBufferViewCore; + var uncurryThis$y = functionUncurryThis; + + var aTypedArray$b = ArrayBufferViewCore$b.aTypedArray; + var exportTypedArrayMethod$c = ArrayBufferViewCore$b.exportTypedArrayMethod; + var $join = uncurryThis$y([].join); + + // `%TypedArray%.prototype.join` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.join + exportTypedArrayMethod$c('join', function join(separator) { + return $join(aTypedArray$b(this), separator); + }); - Promise$1.all = function(arr) { - return new Promise$1(function(resolve, reject) { - if (!isArray$4(arr)) { - return reject(new TypeError('Promise.all accepts an array')); - } + /* eslint-disable es/no-array-prototype-lastindexof -- safe */ + var apply$6 = functionApply; + var toIndexedObject$5 = toIndexedObject$d; + var toIntegerOrInfinity$4 = toIntegerOrInfinity$b; + var lengthOfArrayLike$9 = lengthOfArrayLike$i; + var arrayMethodIsStrict$6 = arrayMethodIsStrict$9; + + var min$6 = Math.min; + var $lastIndexOf$1 = [].lastIndexOf; + var NEGATIVE_ZERO = !!$lastIndexOf$1 && 1 / [1].lastIndexOf(1, -0) < 0; + var STRICT_METHOD$6 = arrayMethodIsStrict$6('lastIndexOf'); + var FORCED$f = NEGATIVE_ZERO || !STRICT_METHOD$6; + + // `Array.prototype.lastIndexOf` method implementation + // https://tc39.es/ecma262/#sec-array.prototype.lastindexof + var arrayLastIndexOf = FORCED$f ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) { + // convert -0 to +0 + if (NEGATIVE_ZERO) return apply$6($lastIndexOf$1, this, arguments) || 0; + var O = toIndexedObject$5(this); + var length = lengthOfArrayLike$9(O); + var index = length - 1; + if (arguments.length > 1) index = min$6(index, toIntegerOrInfinity$4(arguments[1])); + if (index < 0) index = length + index; + for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0; + return -1; + } : $lastIndexOf$1; - var args = Array.prototype.slice.call(arr); - if (args.length === 0) { return resolve([]); } - var remaining = args.length; + var ArrayBufferViewCore$a = arrayBufferViewCore; + var apply$5 = functionApply; + var $lastIndexOf = arrayLastIndexOf; - function res(i, val) { - try { - if (val && (typeof val === 'object' || typeof val === 'function')) { - var then = val.then; - if (typeof then === 'function') { - then.call( - val, - function(val) { - res(i, val); - }, - reject - ); - return; - } - } - args[i] = val; - if (--remaining === 0) { - resolve(args); - } - } catch (ex) { - reject(ex); - } - } + var aTypedArray$a = ArrayBufferViewCore$a.aTypedArray; + var exportTypedArrayMethod$b = ArrayBufferViewCore$a.exportTypedArrayMethod; - for (var i = 0; i < args.length; i++) { - res(i, args[i]); - } - }); - }; + // `%TypedArray%.prototype.lastIndexOf` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.lastindexof + exportTypedArrayMethod$b('lastIndexOf', function lastIndexOf(searchElement /* , fromIndex */) { + var length = arguments.length; + return apply$5($lastIndexOf, aTypedArray$a(this), length > 1 ? [searchElement, arguments[1]] : [searchElement]); + }); - Promise$1.resolve = function(value) { - if (value && typeof value === 'object' && value.constructor === Promise$1) { - return value; - } + var ArrayBufferViewCore$9 = arrayBufferViewCore; + var $map = arrayIteration.map; + var typedArraySpeciesConstructor$2 = typedArraySpeciesConstructor$4; - return new Promise$1(function(resolve) { - resolve(value); - }); - }; + var aTypedArray$9 = ArrayBufferViewCore$9.aTypedArray; + var exportTypedArrayMethod$a = ArrayBufferViewCore$9.exportTypedArrayMethod; - Promise$1.reject = function(value) { - return new Promise$1(function(resolve, reject) { - reject(value); + // `%TypedArray%.prototype.map` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.map + exportTypedArrayMethod$a('map', function map(mapfn /* , thisArg */) { + return $map(aTypedArray$9(this), mapfn, arguments.length > 1 ? arguments[1] : undefined, function (O, length) { + return new (typedArraySpeciesConstructor$2(O))(length); }); - }; + }); - Promise$1.race = function(arr) { - return new Promise$1(function(resolve, reject) { - if (!isArray$4(arr)) { - return reject(new TypeError('Promise.race accepts an array')); + var global$t = global$1o; + var aCallable$4 = aCallable$a; + var toObject$a = toObject$i; + var IndexedObject$2 = indexedObject; + var lengthOfArrayLike$8 = lengthOfArrayLike$i; + + var TypeError$9 = global$t.TypeError; + + // `Array.prototype.{ reduce, reduceRight }` methods implementation + var createMethod$3 = function (IS_RIGHT) { + return function (that, callbackfn, argumentsLength, memo) { + aCallable$4(callbackfn); + var O = toObject$a(that); + var self = IndexedObject$2(O); + var length = lengthOfArrayLike$8(O); + var index = IS_RIGHT ? length - 1 : 0; + var i = IS_RIGHT ? -1 : 1; + if (argumentsLength < 2) while (true) { + if (index in self) { + memo = self[index]; + index += i; + break; + } + index += i; + if (IS_RIGHT ? index < 0 : length <= index) { + throw TypeError$9('Reduce of empty array with no initial value'); + } } - - for (var i = 0, len = arr.length; i < len; i++) { - Promise$1.resolve(arr[i]).then(resolve, reject); + for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) { + memo = callbackfn(memo, self[index], index, O); } - }); - }; - - // Use polyfill for setImmediate for performance gains - Promise$1._immediateFn = - // @ts-ignore - (typeof setImmediate === 'function' && - function(fn) { - // @ts-ignore - setImmediate(fn); - }) || - function(fn) { - setTimeoutFunc(fn, 0); + return memo; }; + }; - Promise$1._unhandledRejectionFn = function _unhandledRejectionFn(err) { - if (typeof console !== 'undefined' && console) { - console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console - } + var arrayReduce = { + // `Array.prototype.reduce` method + // https://tc39.es/ecma262/#sec-array.prototype.reduce + left: createMethod$3(false), + // `Array.prototype.reduceRight` method + // https://tc39.es/ecma262/#sec-array.prototype.reduceright + right: createMethod$3(true) }; - /** @suppress {undefinedVars} */ - var globalNS = (function() { - // the only reliable means to get the global object is - // `Function('return this')()` - // However, this causes CSP violations in Chrome apps. - if (typeof self !== 'undefined') { - return self; - } - if (typeof window !== 'undefined') { - return window; - } - if (typeof global !== 'undefined') { - return global; - } - throw new Error('unable to locate global object'); - })(); + var ArrayBufferViewCore$8 = arrayBufferViewCore; + var $reduce$1 = arrayReduce.left; - if (!('Promise' in globalNS)) { - globalNS['Promise'] = Promise$1; - } else if (!globalNS.Promise.prototype['finally']) { - globalNS.Promise.prototype['finally'] = finallyConstructor; - } + var aTypedArray$8 = ArrayBufferViewCore$8.aTypedArray; + var exportTypedArrayMethod$9 = ArrayBufferViewCore$8.exportTypedArrayMethod; - var polyfill$e = /*#__PURE__*/Object.freeze({ - __proto__: null + // `%TypedArray%.prototype.reduce` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.reduce + exportTypedArrayMethod$9('reduce', function reduce(callbackfn /* , initialValue */) { + var length = arguments.length; + return $reduce$1(aTypedArray$8(this), callbackfn, length, length > 1 ? arguments[1] : undefined); }); - var setAsap = createCommonjsModule(function (module) { - (function (thisVar, undefined$1) { - var main = (typeof window === 'object' && window) || (typeof commonjsGlobal === 'object' && commonjsGlobal) || - typeof self === 'object' && self || thisVar; - - var hasSetImmediate = typeof setImmediate === 'function'; - var hasNextTick = typeof process === 'object' && !!process && typeof process.nextTick === 'function'; - var index = 0; - - function getNewIndex() { - if (index === 9007199254740991) { - return 0; - } - return ++index; - } - - var setAsap = (function () { - var hiddenDiv, scriptEl, timeoutFn, callbacks; - - // Modern browsers, fastest async - if (main.MutationObserver) { - return function setAsap(callback) { - hiddenDiv = document.createElement("div"); - (new MutationObserver(function() { - callback(); - hiddenDiv = null; - })).observe(hiddenDiv, { attributes: true }); - hiddenDiv.setAttribute('i', '1'); - }; - - // Browsers that support postMessage - } else if (!hasSetImmediate && main.postMessage && !main.importScripts && main.addEventListener) { - - var MESSAGE_PREFIX = "com.setImmediate" + Math.random(); - callbacks = {}; - - var onGlobalMessage = function (event) { - if (event.source === main && event.data.indexOf(MESSAGE_PREFIX) === 0) { - var i = +event.data.split(':')[1]; - callbacks[i](); - delete callbacks[i]; - } - }; - - main.addEventListener("message", onGlobalMessage, false); - - return function setAsap(callback) { - var i = getNewIndex(); - callbacks[i] = callback; - main.postMessage(MESSAGE_PREFIX + ':' + i, "*"); - }; - - // IE browsers without postMessage - } else if (!hasSetImmediate && main.document && 'onreadystatechange' in document.createElement('script')) { - - return function setAsap(callback) { - scriptEl = document.createElement("script"); - scriptEl.onreadystatechange = function onreadystatechange() { - scriptEl.onreadystatechange = null; - scriptEl.parentNode.removeChild(scriptEl); - scriptEl = null; - callback(); - }; - document.body.appendChild(scriptEl); - }; - - // All other browsers and node - } else { - - timeoutFn = (hasSetImmediate && setImmediate) || (hasNextTick && process.nextTick) || setTimeout; - return function setAsap(callback) { - timeoutFn(callback); - }; - } - - })(); - - if ( module.exports) { - module.exports = setAsap; - } else if (typeof commonjsRequire !== 'undefined' && commonjsRequire.amd) { - undefined$1(function () { - return setAsap; - }); - } else { - main.setAsap = setAsap; - } - })(commonjsGlobal); + var ArrayBufferViewCore$7 = arrayBufferViewCore; + var $reduceRight$1 = arrayReduce.right; + + var aTypedArray$7 = ArrayBufferViewCore$7.aTypedArray; + var exportTypedArrayMethod$8 = ArrayBufferViewCore$7.exportTypedArrayMethod; + + // `%TypedArray%.prototype.reduceRicht` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.reduceright + exportTypedArrayMethod$8('reduceRight', function reduceRight(callbackfn /* , initialValue */) { + var length = arguments.length; + return $reduceRight$1(aTypedArray$7(this), callbackfn, length, length > 1 ? arguments[1] : undefined); }); - var performanceNow = createCommonjsModule(function (module) { - // Generated by CoffeeScript 1.12.2 - (function() { - var getNanoSeconds, hrtime, loadTime, moduleLoadTime, nodeLoadTime, upTime; + var ArrayBufferViewCore$6 = arrayBufferViewCore; - if ((typeof performance !== "undefined" && performance !== null) && performance.now) { - module.exports = function() { - return performance.now(); - }; - } else if ((typeof process !== "undefined" && process !== null) && process.hrtime) { - module.exports = function() { - return (getNanoSeconds() - nodeLoadTime) / 1e6; - }; - hrtime = process.hrtime; - getNanoSeconds = function() { - var hr; - hr = hrtime(); - return hr[0] * 1e9 + hr[1]; - }; - moduleLoadTime = getNanoSeconds(); - upTime = process.uptime() * 1e9; - nodeLoadTime = moduleLoadTime - upTime; - } else if (Date.now) { - module.exports = function() { - return Date.now() - loadTime; - }; - loadTime = Date.now(); - } else { - module.exports = function() { - return new Date().getTime() - loadTime; - }; - loadTime = new Date().getTime(); - } + var aTypedArray$6 = ArrayBufferViewCore$6.aTypedArray; + var exportTypedArrayMethod$7 = ArrayBufferViewCore$6.exportTypedArrayMethod; + var floor$5 = Math.floor; - }).call(commonjsGlobal); + // `%TypedArray%.prototype.reverse` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.reverse + exportTypedArrayMethod$7('reverse', function reverse() { + var that = this; + var length = aTypedArray$6(that).length; + var middle = floor$5(length / 2); + var index = 0; + var value; + while (index < middle) { + value = that[index]; + that[index++] = that[--length]; + that[length] = value; + } return that; + }); + var global$s = global$1o; + var call$a = functionCall; + var ArrayBufferViewCore$5 = arrayBufferViewCore; + var lengthOfArrayLike$7 = lengthOfArrayLike$i; + var toOffset = toOffset$2; + var toIndexedObject$4 = toObject$i; + var fails$y = fails$V; + + var RangeError$6 = global$s.RangeError; + var Int8Array$2 = global$s.Int8Array; + var Int8ArrayPrototype = Int8Array$2 && Int8Array$2.prototype; + var $set = Int8ArrayPrototype && Int8ArrayPrototype.set; + var aTypedArray$5 = ArrayBufferViewCore$5.aTypedArray; + var exportTypedArrayMethod$6 = ArrayBufferViewCore$5.exportTypedArrayMethod; + + var WORKS_WITH_OBJECTS_AND_GEERIC_ON_TYPED_ARRAYS = !fails$y(function () { + // eslint-disable-next-line es/no-typed-arrays -- required for testing + var array = new Uint8ClampedArray(2); + call$a($set, array, { length: 1, 0: 3 }, 1); + return array[1] !== 3; + }); + // https://bugs.chromium.org/p/v8/issues/detail?id=11294 and other + var TO_OBJECT_BUG = WORKS_WITH_OBJECTS_AND_GEERIC_ON_TYPED_ARRAYS && ArrayBufferViewCore$5.NATIVE_ARRAY_BUFFER_VIEWS && fails$y(function () { + var array = new Int8Array$2(2); + array.set(1); + array.set('2', 1); + return array[0] !== 0 || array[1] !== 2; }); - var root = typeof window === 'undefined' ? commonjsGlobal : window - , vendors = ['moz', 'webkit'] - , suffix = 'AnimationFrame' - , raf = root['request' + suffix] - , caf = root['cancel' + suffix] || root['cancelRequest' + suffix]; - - for(var i = 0; !raf && i < vendors.length; i++) { - raf = root[vendors[i] + 'Request' + suffix]; - caf = root[vendors[i] + 'Cancel' + suffix] - || root[vendors[i] + 'CancelRequest' + suffix]; - } - - // Some versions of FF have rAF but not cAF - if(!raf || !caf) { - var last = 0 - , id$2 = 0 - , queue = [] - , frameDuration = 1000 / 60; - - raf = function(callback) { - if(queue.length === 0) { - var _now = performanceNow() - , next = Math.max(0, frameDuration - (_now - last)); - last = next + _now; - setTimeout(function() { - var cp = queue.slice(0); - // Clear queue here to prevent - // callbacks from appending listeners - // to the current frame's queue - queue.length = 0; - for(var i = 0; i < cp.length; i++) { - if(!cp[i].cancelled) { - try{ - cp[i].callback(last); - } catch(e) { - setTimeout(function() { throw e }, 0); - } - } - } - }, Math.round(next)); - } - queue.push({ - handle: ++id$2, - callback: callback, - cancelled: false - }); - return id$2 - }; + // `%TypedArray%.prototype.set` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.set + exportTypedArrayMethod$6('set', function set(arrayLike /* , offset */) { + aTypedArray$5(this); + var offset = toOffset(arguments.length > 1 ? arguments[1] : undefined, 1); + var src = toIndexedObject$4(arrayLike); + if (WORKS_WITH_OBJECTS_AND_GEERIC_ON_TYPED_ARRAYS) return call$a($set, this, src, offset); + var length = this.length; + var len = lengthOfArrayLike$7(src); + var index = 0; + if (len + offset > length) throw RangeError$6('Wrong length'); + while (index < len) this[offset + index] = src[index++]; + }, !WORKS_WITH_OBJECTS_AND_GEERIC_ON_TYPED_ARRAYS || TO_OBJECT_BUG); - caf = function(handle) { - for(var i = 0; i < queue.length; i++) { - if(queue[i].handle === handle) { - queue[i].cancelled = true; - } - } - }; - } + var ArrayBufferViewCore$4 = arrayBufferViewCore; + var typedArraySpeciesConstructor$1 = typedArraySpeciesConstructor$4; + var fails$x = fails$V; + var arraySlice$7 = arraySlice$b; - var raf_1 = function(fn) { - // Wrap in a new function to prevent - // `cancel` potentially being assigned - // to the native rAF function - return raf.call(root, fn) - }; - var cancel = function() { - caf.apply(root, arguments); + var aTypedArray$4 = ArrayBufferViewCore$4.aTypedArray; + var exportTypedArrayMethod$5 = ArrayBufferViewCore$4.exportTypedArrayMethod; + + var FORCED$e = fails$x(function () { + // eslint-disable-next-line es/no-typed-arrays -- required for testing + new Int8Array(1).slice(); + }); + + // `%TypedArray%.prototype.slice` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.slice + exportTypedArrayMethod$5('slice', function slice(start, end) { + var list = arraySlice$7(aTypedArray$4(this), start, end); + var C = typedArraySpeciesConstructor$1(this); + var index = 0; + var length = list.length; + var result = new C(length); + while (length > index) result[index] = list[index++]; + return result; + }, FORCED$e); + + var ArrayBufferViewCore$3 = arrayBufferViewCore; + var $some$1 = arrayIteration.some; + + var aTypedArray$3 = ArrayBufferViewCore$3.aTypedArray; + var exportTypedArrayMethod$4 = ArrayBufferViewCore$3.exportTypedArrayMethod; + + // `%TypedArray%.prototype.some` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.some + exportTypedArrayMethod$4('some', function some(callbackfn /* , thisArg */) { + return $some$1(aTypedArray$3(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); + }); + + var arraySlice$6 = arraySliceSimple; + + var floor$4 = Math.floor; + + var mergeSort = function (array, comparefn) { + var length = array.length; + var middle = floor$4(length / 2); + return length < 8 ? insertionSort(array, comparefn) : merge$5( + array, + mergeSort(arraySlice$6(array, 0, middle), comparefn), + mergeSort(arraySlice$6(array, middle), comparefn), + comparefn + ); }; - var polyfill$f = function(object) { - if (!object) { - object = root; - } - object.requestAnimationFrame = raf; - object.cancelAnimationFrame = caf; + + var insertionSort = function (array, comparefn) { + var length = array.length; + var i = 1; + var element, j; + + while (i < length) { + j = i; + element = array[i]; + while (j && comparefn(array[j - 1], element) > 0) { + array[j] = array[--j]; + } + if (j !== i++) array[j] = element; + } return array; }; - raf_1.cancel = cancel; - raf_1.polyfill = polyfill$f; - var global$1 = (function(self) { - return self - // eslint-disable-next-line no-invalid-this - })(typeof self !== 'undefined' ? self : undefined); - var support = { - searchParams: 'URLSearchParams' in global$1, - iterable: 'Symbol' in global$1 && 'iterator' in Symbol, - blob: - 'FileReader' in global$1 && - 'Blob' in global$1 && - (function() { - try { - new Blob(); - return true - } catch (e) { - return false - } - })(), - formData: 'FormData' in global$1, - arrayBuffer: 'ArrayBuffer' in global$1 + var merge$5 = function (array, left, right, comparefn) { + var llength = left.length; + var rlength = right.length; + var lindex = 0; + var rindex = 0; + + while (lindex < llength || rindex < rlength) { + array[lindex + rindex] = (lindex < llength && rindex < rlength) + ? comparefn(left[lindex], right[rindex]) <= 0 ? left[lindex++] : right[rindex++] + : lindex < llength ? left[lindex++] : right[rindex++]; + } return array; }; - function isDataView(obj) { - return obj && DataView.prototype.isPrototypeOf(obj) - } + var arraySort$1 = mergeSort; - if (support.arrayBuffer) { - var viewClasses = [ - '[object Int8Array]', - '[object Uint8Array]', - '[object Uint8ClampedArray]', - '[object Int16Array]', - '[object Uint16Array]', - '[object Int32Array]', - '[object Uint32Array]', - '[object Float32Array]', - '[object Float64Array]' - ]; + var userAgent$3 = engineUserAgent; - var isArrayBufferView = - ArrayBuffer.isView || - function(obj) { - return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1 - }; - } + var firefox = userAgent$3.match(/firefox\/(\d+)/i); - function normalizeName(name) { - if (typeof name !== 'string') { - name = String(name); - } - if (/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(name) || name === '') { - throw new TypeError('Invalid character in header field name') - } - return name.toLowerCase() - } + var engineFfVersion = !!firefox && +firefox[1]; - function normalizeValue(value) { - if (typeof value !== 'string') { - value = String(value); + var UA = engineUserAgent; + + var engineIsIeOrEdge = /MSIE|Trident/.test(UA); + + var userAgent$2 = engineUserAgent; + + var webkit = userAgent$2.match(/AppleWebKit\/(\d+)\./); + + var engineWebkitVersion = !!webkit && +webkit[1]; + + var global$r = global$1o; + var uncurryThis$x = functionUncurryThis; + var fails$w = fails$V; + var aCallable$3 = aCallable$a; + var internalSort$1 = arraySort$1; + var ArrayBufferViewCore$2 = arrayBufferViewCore; + var FF$1 = engineFfVersion; + var IE_OR_EDGE$1 = engineIsIeOrEdge; + var V8$1 = engineV8Version; + var WEBKIT$1 = engineWebkitVersion; + + var Array$3 = global$r.Array; + var aTypedArray$2 = ArrayBufferViewCore$2.aTypedArray; + var exportTypedArrayMethod$3 = ArrayBufferViewCore$2.exportTypedArrayMethod; + var Uint16Array = global$r.Uint16Array; + var un$Sort$1 = Uint16Array && uncurryThis$x(Uint16Array.prototype.sort); + + // WebKit + var ACCEPT_INCORRECT_ARGUMENTS = !!un$Sort$1 && !(fails$w(function () { + un$Sort$1(new Uint16Array(2), null); + }) && fails$w(function () { + un$Sort$1(new Uint16Array(2), {}); + })); + + var STABLE_SORT$1 = !!un$Sort$1 && !fails$w(function () { + // feature detection can be too slow, so check engines versions + if (V8$1) return V8$1 < 74; + if (FF$1) return FF$1 < 67; + if (IE_OR_EDGE$1) return true; + if (WEBKIT$1) return WEBKIT$1 < 602; + + var array = new Uint16Array(516); + var expected = Array$3(516); + var index, mod; + + for (index = 0; index < 516; index++) { + mod = index % 4; + array[index] = 515 - index; + expected[index] = index - 2 * mod + 3; } - return value - } - // Build a destructive iterator for the value list - function iteratorFor(items) { - var iterator = { - next: function() { - var value = items.shift(); - return {done: value === undefined, value: value} - } - }; + un$Sort$1(array, function (a, b) { + return (a / 4 | 0) - (b / 4 | 0); + }); - if (support.iterable) { - iterator[Symbol.iterator] = function() { - return iterator - }; + for (index = 0; index < 516; index++) { + if (array[index] !== expected[index]) return true; } + }); + + var getSortCompare$1 = function (comparefn) { + return function (x, y) { + if (comparefn !== undefined) return +comparefn(x, y) || 0; + // eslint-disable-next-line no-self-compare -- NaN check + if (y !== y) return -1; + // eslint-disable-next-line no-self-compare -- NaN check + if (x !== x) return 1; + if (x === 0 && y === 0) return 1 / x > 0 && 1 / y < 0 ? 1 : -1; + return x > y; + }; + }; + + // `%TypedArray%.prototype.sort` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.sort + exportTypedArrayMethod$3('sort', function sort(comparefn) { + if (comparefn !== undefined) aCallable$3(comparefn); + if (STABLE_SORT$1) return un$Sort$1(this, comparefn); + + return internalSort$1(aTypedArray$2(this), getSortCompare$1(comparefn)); + }, !STABLE_SORT$1 || ACCEPT_INCORRECT_ARGUMENTS); + + var ArrayBufferViewCore$1 = arrayBufferViewCore; + var toLength$6 = toLength$c; + var toAbsoluteIndex$3 = toAbsoluteIndex$9; + var typedArraySpeciesConstructor = typedArraySpeciesConstructor$4; + + var aTypedArray$1 = ArrayBufferViewCore$1.aTypedArray; + var exportTypedArrayMethod$2 = ArrayBufferViewCore$1.exportTypedArrayMethod; + + // `%TypedArray%.prototype.subarray` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.subarray + exportTypedArrayMethod$2('subarray', function subarray(begin, end) { + var O = aTypedArray$1(this); + var length = O.length; + var beginIndex = toAbsoluteIndex$3(begin, length); + var C = typedArraySpeciesConstructor(O); + return new C( + O.buffer, + O.byteOffset + beginIndex * O.BYTES_PER_ELEMENT, + toLength$6((end === undefined ? length : toAbsoluteIndex$3(end, length)) - beginIndex) + ); + }); + + var global$q = global$1o; + var apply$4 = functionApply; + var ArrayBufferViewCore = arrayBufferViewCore; + var fails$v = fails$V; + var arraySlice$5 = arraySlice$b; + + var Int8Array$1 = global$q.Int8Array; + var aTypedArray = ArrayBufferViewCore.aTypedArray; + var exportTypedArrayMethod$1 = ArrayBufferViewCore.exportTypedArrayMethod; + var $toLocaleString = [].toLocaleString; + + // iOS Safari 6.x fails here + var TO_LOCALE_STRING_BUG = !!Int8Array$1 && fails$v(function () { + $toLocaleString.call(new Int8Array$1(1)); + }); - return iterator + var FORCED$d = fails$v(function () { + return [1, 2].toLocaleString() != new Int8Array$1([1, 2]).toLocaleString(); + }) || !fails$v(function () { + Int8Array$1.prototype.toLocaleString.call([1, 2]); + }); + + // `%TypedArray%.prototype.toLocaleString` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.tolocalestring + exportTypedArrayMethod$1('toLocaleString', function toLocaleString() { + return apply$4( + $toLocaleString, + TO_LOCALE_STRING_BUG ? arraySlice$5(aTypedArray(this)) : aTypedArray(this), + arraySlice$5(arguments) + ); + }, FORCED$d); + + var exportTypedArrayMethod = arrayBufferViewCore.exportTypedArrayMethod; + var fails$u = fails$V; + var global$p = global$1o; + var uncurryThis$w = functionUncurryThis; + + var Uint8Array$1 = global$p.Uint8Array; + var Uint8ArrayPrototype = Uint8Array$1 && Uint8Array$1.prototype || {}; + var arrayToString = [].toString; + var join$5 = uncurryThis$w([].join); + + if (fails$u(function () { arrayToString.call({}); })) { + arrayToString = function toString() { + return join$5(this); + }; } - function Headers(headers) { - this.map = {}; + var IS_NOT_ARRAY_METHOD = Uint8ArrayPrototype.toString != arrayToString; - if (headers instanceof Headers) { - headers.forEach(function(value, name) { - this.append(name, value); - }, this); - } else if (Array.isArray(headers)) { - headers.forEach(function(header) { - this.append(header[0], header[1]); - }, this); - } else if (headers) { - Object.getOwnPropertyNames(headers).forEach(function(name) { - this.append(name, headers[name]); - }, this); + // `%TypedArray%.prototype.toString` method + // https://tc39.es/ecma262/#sec-%typedarray%.prototype.tostring + exportTypedArrayMethod('toString', arrayToString, IS_NOT_ARRAY_METHOD); + + var $$Z = _export; + var uncurryThis$v = functionUncurryThis; + var IndexedObject$1 = indexedObject; + var toIndexedObject$3 = toIndexedObject$d; + var arrayMethodIsStrict$5 = arrayMethodIsStrict$9; + + var un$Join = uncurryThis$v([].join); + + var ES3_STRINGS = IndexedObject$1 != Object; + var STRICT_METHOD$5 = arrayMethodIsStrict$5('join', ','); + + // `Array.prototype.join` method + // https://tc39.es/ecma262/#sec-array.prototype.join + $$Z({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD$5 }, { + join: function join(separator) { + return un$Join(toIndexedObject$3(this), separator === undefined ? ',' : separator); } - } + }); - Headers.prototype.append = function(name, value) { - name = normalizeName(name); - value = normalizeValue(value); - var oldValue = this.map[name]; - this.map[name] = oldValue ? oldValue + ', ' + value : value; - }; + var $$Y = _export; + var global$o = global$1o; + var isArray$4 = isArray$8; + var isConstructor$1 = isConstructor$4; + var isObject$e = isObject$s; + var toAbsoluteIndex$2 = toAbsoluteIndex$9; + var lengthOfArrayLike$6 = lengthOfArrayLike$i; + var toIndexedObject$2 = toIndexedObject$d; + var createProperty$3 = createProperty$5; + var wellKnownSymbol$8 = wellKnownSymbol$t; + var arrayMethodHasSpeciesSupport$3 = arrayMethodHasSpeciesSupport$5; + var un$Slice = arraySlice$b; + + var HAS_SPECIES_SUPPORT$2 = arrayMethodHasSpeciesSupport$3('slice'); + + var SPECIES$1 = wellKnownSymbol$8('species'); + var Array$2 = global$o.Array; + var max$3 = Math.max; + + // `Array.prototype.slice` method + // https://tc39.es/ecma262/#sec-array.prototype.slice + // fallback for not array-like ES3 strings and DOM objects + $$Y({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$2 }, { + slice: function slice(start, end) { + var O = toIndexedObject$2(this); + var length = lengthOfArrayLike$6(O); + var k = toAbsoluteIndex$2(start, length); + var fin = toAbsoluteIndex$2(end === undefined ? length : end, length); + // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible + var Constructor, result, n; + if (isArray$4(O)) { + Constructor = O.constructor; + // cross-realm fallback + if (isConstructor$1(Constructor) && (Constructor === Array$2 || isArray$4(Constructor.prototype))) { + Constructor = undefined; + } else if (isObject$e(Constructor)) { + Constructor = Constructor[SPECIES$1]; + if (Constructor === null) Constructor = undefined; + } + if (Constructor === Array$2 || Constructor === undefined) { + return un$Slice(O, k, fin); + } + } + result = new (Constructor === undefined ? Array$2 : Constructor)(max$3(fin - k, 0)); + for (n = 0; k < fin; k++, n++) if (k in O) createProperty$3(result, n, O[k]); + result.length = n; + return result; + } + }); - Headers.prototype['delete'] = function(name) { - delete this.map[normalizeName(name)]; - }; + var fails$t = fails$V; + var wellKnownSymbol$7 = wellKnownSymbol$t; + var IS_PURE = isPure; + + var ITERATOR$3 = wellKnownSymbol$7('iterator'); + + var nativeUrl = !fails$t(function () { + // eslint-disable-next-line unicorn/relative-url-style -- required for testing + var url = new URL('b?a=1&b=2&c=3', 'http://a'); + var searchParams = url.searchParams; + var result = ''; + url.pathname = 'c%20d'; + searchParams.forEach(function (value, key) { + searchParams['delete']('b'); + result += key + value; + }); + return (IS_PURE && !url.toJSON) + || !searchParams.sort + || url.href !== 'http://a/c%20d?a=1&c=3' + || searchParams.get('c') !== '3' + || String(new URLSearchParams('?a=1')) !== 'a=1' + || !searchParams[ITERATOR$3] + // throws in Edge + || new URL('https://a@b').username !== 'a' + || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b' + // not punycoded in Edge + || new URL('http://тест').host !== 'xn--e1aybc' + // not escaped in Chrome 62- + || new URL('http://a#б').hash !== '#%D0%B1' + // fails in Chrome 66- + || result !== 'a1c3' + // throws in Safari + || new URL('http://x', undefined).host !== 'x'; + }); - Headers.prototype.get = function(name) { - name = normalizeName(name); - return this.has(name) ? this.map[name] : null + // TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env` + + var $$X = _export; + var global$n = global$1o; + var getBuiltIn$2 = getBuiltIn$b; + var call$9 = functionCall; + var uncurryThis$u = functionUncurryThis; + var USE_NATIVE_URL$1 = nativeUrl; + var redefine$7 = redefine$h.exports; + var redefineAll$1 = redefineAll$4; + var setToStringTag$4 = setToStringTag$a; + var createIteratorConstructor = createIteratorConstructor$2; + var InternalStateModule$2 = internalState; + var anInstance$3 = anInstance$7; + var isCallable$5 = isCallable$r; + var hasOwn$6 = hasOwnProperty_1; + var bind$8 = functionBindContext; + var classof$3 = classof$d; + var anObject$9 = anObject$n; + var isObject$d = isObject$s; + var $toString$2 = toString$k; + var create$6 = objectCreate; + var createPropertyDescriptor = createPropertyDescriptor$7; + var getIterator$1 = getIterator$4; + var getIteratorMethod$1 = getIteratorMethod$5; + var validateArgumentsLength$2 = validateArgumentsLength$4; + var wellKnownSymbol$6 = wellKnownSymbol$t; + var arraySort = arraySort$1; + + var ITERATOR$2 = wellKnownSymbol$6('iterator'); + var URL_SEARCH_PARAMS = 'URLSearchParams'; + var URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator'; + var setInternalState$2 = InternalStateModule$2.set; + var getInternalParamsState = InternalStateModule$2.getterFor(URL_SEARCH_PARAMS); + var getInternalIteratorState = InternalStateModule$2.getterFor(URL_SEARCH_PARAMS_ITERATOR); + + var n$Fetch = getBuiltIn$2('fetch'); + var N$Request = getBuiltIn$2('Request'); + var Headers$1 = getBuiltIn$2('Headers'); + var RequestPrototype = N$Request && N$Request.prototype; + var HeadersPrototype = Headers$1 && Headers$1.prototype; + var RegExp$1 = global$n.RegExp; + var TypeError$8 = global$n.TypeError; + var decodeURIComponent$1 = global$n.decodeURIComponent; + var encodeURIComponent$1 = global$n.encodeURIComponent; + var charAt$5 = uncurryThis$u(''.charAt); + var join$4 = uncurryThis$u([].join); + var push$7 = uncurryThis$u([].push); + var replace$6 = uncurryThis$u(''.replace); + var shift$1 = uncurryThis$u([].shift); + var splice = uncurryThis$u([].splice); + var split$3 = uncurryThis$u(''.split); + var stringSlice$8 = uncurryThis$u(''.slice); + + var plus = /\+/g; + var sequences = Array(4); + + var percentSequence = function (bytes) { + return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp$1('((?:%[\\da-f]{2}){' + bytes + '})', 'gi')); + }; + + var percentDecode = function (sequence) { + try { + return decodeURIComponent$1(sequence); + } catch (error) { + return sequence; + } }; - Headers.prototype.has = function(name) { - return this.map.hasOwnProperty(normalizeName(name)) + var deserialize = function (it) { + var result = replace$6(it, plus, ' '); + var bytes = 4; + try { + return decodeURIComponent$1(result); + } catch (error) { + while (bytes) { + result = replace$6(result, percentSequence(bytes--), percentDecode); + } + return result; + } }; - Headers.prototype.set = function(name, value) { - this.map[normalizeName(name)] = normalizeValue(value); + var find$1 = /[!'()~]|%20/g; + + var replacements = { + '!': '%21', + "'": '%27', + '(': '%28', + ')': '%29', + '~': '%7E', + '%20': '+' }; - Headers.prototype.forEach = function(callback, thisArg) { - for (var name in this.map) { - if (this.map.hasOwnProperty(name)) { - callback.call(thisArg, this.map[name], name, this); - } - } + var replacer = function (match) { + return replacements[match]; }; - Headers.prototype.keys = function() { - var items = []; - this.forEach(function(value, name) { - items.push(name); - }); - return iteratorFor(items) + var serialize = function (it) { + return replace$6(encodeURIComponent$1(it), find$1, replacer); }; - Headers.prototype.values = function() { - var items = []; - this.forEach(function(value) { - items.push(value); + var URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) { + setInternalState$2(this, { + type: URL_SEARCH_PARAMS_ITERATOR, + iterator: getIterator$1(getInternalParamsState(params).entries), + kind: kind }); - return iteratorFor(items) + }, 'Iterator', function next() { + var state = getInternalIteratorState(this); + var kind = state.kind; + var step = state.iterator.next(); + var entry = step.value; + if (!step.done) { + step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value]; + } return step; + }, true); + + var URLSearchParamsState = function (init) { + this.entries = []; + this.url = null; + + if (init !== undefined) { + if (isObject$d(init)) this.parseObject(init); + else this.parseQuery(typeof init == 'string' ? charAt$5(init, 0) === '?' ? stringSlice$8(init, 1) : init : $toString$2(init)); + } + }; + + URLSearchParamsState.prototype = { + type: URL_SEARCH_PARAMS, + bindURL: function (url) { + this.url = url; + this.update(); + }, + parseObject: function (object) { + var iteratorMethod = getIteratorMethod$1(object); + var iterator, next, step, entryIterator, entryNext, first, second; + + if (iteratorMethod) { + iterator = getIterator$1(object, iteratorMethod); + next = iterator.next; + while (!(step = call$9(next, iterator)).done) { + entryIterator = getIterator$1(anObject$9(step.value)); + entryNext = entryIterator.next; + if ( + (first = call$9(entryNext, entryIterator)).done || + (second = call$9(entryNext, entryIterator)).done || + !call$9(entryNext, entryIterator).done + ) throw TypeError$8('Expected sequence with length 2'); + push$7(this.entries, { key: $toString$2(first.value), value: $toString$2(second.value) }); + } + } else for (var key in object) if (hasOwn$6(object, key)) { + push$7(this.entries, { key: key, value: $toString$2(object[key]) }); + } + }, + parseQuery: function (query) { + if (query) { + var attributes = split$3(query, '&'); + var index = 0; + var attribute, entry; + while (index < attributes.length) { + attribute = attributes[index++]; + if (attribute.length) { + entry = split$3(attribute, '='); + push$7(this.entries, { + key: deserialize(shift$1(entry)), + value: deserialize(join$4(entry, '=')) + }); + } + } + } + }, + serialize: function () { + var entries = this.entries; + var result = []; + var index = 0; + var entry; + while (index < entries.length) { + entry = entries[index++]; + push$7(result, serialize(entry.key) + '=' + serialize(entry.value)); + } return join$4(result, '&'); + }, + update: function () { + this.entries.length = 0; + this.parseQuery(this.url.query); + }, + updateURL: function () { + if (this.url) this.url.update(); + } }; - Headers.prototype.entries = function() { - var items = []; - this.forEach(function(value, name) { - items.push([name, value]); - }); - return iteratorFor(items) + // `URLSearchParams` constructor + // https://url.spec.whatwg.org/#interface-urlsearchparams + var URLSearchParamsConstructor = function URLSearchParams(/* init */) { + anInstance$3(this, URLSearchParamsPrototype); + var init = arguments.length > 0 ? arguments[0] : undefined; + setInternalState$2(this, new URLSearchParamsState(init)); }; - if (support.iterable) { - Headers.prototype[Symbol.iterator] = Headers.prototype.entries; - } + var URLSearchParamsPrototype = URLSearchParamsConstructor.prototype; - function consumed(body) { - if (body.bodyUsed) { - return Promise.reject(new TypeError('Already read')) + redefineAll$1(URLSearchParamsPrototype, { + // `URLSearchParams.prototype.append` method + // https://url.spec.whatwg.org/#dom-urlsearchparams-append + append: function append(name, value) { + validateArgumentsLength$2(arguments.length, 2); + var state = getInternalParamsState(this); + push$7(state.entries, { key: $toString$2(name), value: $toString$2(value) }); + state.updateURL(); + }, + // `URLSearchParams.prototype.delete` method + // https://url.spec.whatwg.org/#dom-urlsearchparams-delete + 'delete': function (name) { + validateArgumentsLength$2(arguments.length, 1); + var state = getInternalParamsState(this); + var entries = state.entries; + var key = $toString$2(name); + var index = 0; + while (index < entries.length) { + if (entries[index].key === key) splice(entries, index, 1); + else index++; + } + state.updateURL(); + }, + // `URLSearchParams.prototype.get` method + // https://url.spec.whatwg.org/#dom-urlsearchparams-get + get: function get(name) { + validateArgumentsLength$2(arguments.length, 1); + var entries = getInternalParamsState(this).entries; + var key = $toString$2(name); + var index = 0; + for (; index < entries.length; index++) { + if (entries[index].key === key) return entries[index].value; + } + return null; + }, + // `URLSearchParams.prototype.getAll` method + // https://url.spec.whatwg.org/#dom-urlsearchparams-getall + getAll: function getAll(name) { + validateArgumentsLength$2(arguments.length, 1); + var entries = getInternalParamsState(this).entries; + var key = $toString$2(name); + var result = []; + var index = 0; + for (; index < entries.length; index++) { + if (entries[index].key === key) push$7(result, entries[index].value); + } + return result; + }, + // `URLSearchParams.prototype.has` method + // https://url.spec.whatwg.org/#dom-urlsearchparams-has + has: function has(name) { + validateArgumentsLength$2(arguments.length, 1); + var entries = getInternalParamsState(this).entries; + var key = $toString$2(name); + var index = 0; + while (index < entries.length) { + if (entries[index++].key === key) return true; + } + return false; + }, + // `URLSearchParams.prototype.set` method + // https://url.spec.whatwg.org/#dom-urlsearchparams-set + set: function set(name, value) { + validateArgumentsLength$2(arguments.length, 1); + var state = getInternalParamsState(this); + var entries = state.entries; + var found = false; + var key = $toString$2(name); + var val = $toString$2(value); + var index = 0; + var entry; + for (; index < entries.length; index++) { + entry = entries[index]; + if (entry.key === key) { + if (found) splice(entries, index--, 1); + else { + found = true; + entry.value = val; + } + } + } + if (!found) push$7(entries, { key: key, value: val }); + state.updateURL(); + }, + // `URLSearchParams.prototype.sort` method + // https://url.spec.whatwg.org/#dom-urlsearchparams-sort + sort: function sort() { + var state = getInternalParamsState(this); + arraySort(state.entries, function (a, b) { + return a.key > b.key ? 1 : -1; + }); + state.updateURL(); + }, + // `URLSearchParams.prototype.forEach` method + forEach: function forEach(callback /* , thisArg */) { + var entries = getInternalParamsState(this).entries; + var boundFunction = bind$8(callback, arguments.length > 1 ? arguments[1] : undefined); + var index = 0; + var entry; + while (index < entries.length) { + entry = entries[index++]; + boundFunction(entry.value, entry.key, this); + } + }, + // `URLSearchParams.prototype.keys` method + keys: function keys() { + return new URLSearchParamsIterator(this, 'keys'); + }, + // `URLSearchParams.prototype.values` method + values: function values() { + return new URLSearchParamsIterator(this, 'values'); + }, + // `URLSearchParams.prototype.entries` method + entries: function entries() { + return new URLSearchParamsIterator(this, 'entries'); } - body.bodyUsed = true; - } + }, { enumerable: true }); - function fileReaderReady(reader) { - return new Promise(function(resolve, reject) { - reader.onload = function() { - resolve(reader.result); - }; - reader.onerror = function() { - reject(reader.error); - }; - }) - } + // `URLSearchParams.prototype[@@iterator]` method + redefine$7(URLSearchParamsPrototype, ITERATOR$2, URLSearchParamsPrototype.entries, { name: 'entries' }); - function readBlobAsArrayBuffer(blob) { - var reader = new FileReader(); - var promise = fileReaderReady(reader); - reader.readAsArrayBuffer(blob); - return promise - } + // `URLSearchParams.prototype.toString` method + // https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior + redefine$7(URLSearchParamsPrototype, 'toString', function toString() { + return getInternalParamsState(this).serialize(); + }, { enumerable: true }); - function readBlobAsText(blob) { - var reader = new FileReader(); - var promise = fileReaderReady(reader); - reader.readAsText(blob); - return promise - } + setToStringTag$4(URLSearchParamsConstructor, URL_SEARCH_PARAMS); - function readArrayBufferAsText(buf) { - var view = new Uint8Array(buf); - var chars = new Array(view.length); + $$X({ global: true, forced: !USE_NATIVE_URL$1 }, { + URLSearchParams: URLSearchParamsConstructor + }); - for (var i = 0; i < view.length; i++) { - chars[i] = String.fromCharCode(view[i]); + // Wrap `fetch` and `Request` for correct work with polyfilled `URLSearchParams` + if (!USE_NATIVE_URL$1 && isCallable$5(Headers$1)) { + var headersHas = uncurryThis$u(HeadersPrototype.has); + var headersSet = uncurryThis$u(HeadersPrototype.set); + + var wrapRequestOptions = function (init) { + if (isObject$d(init)) { + var body = init.body; + var headers; + if (classof$3(body) === URL_SEARCH_PARAMS) { + headers = init.headers ? new Headers$1(init.headers) : new Headers$1(); + if (!headersHas(headers, 'content-type')) { + headersSet(headers, 'content-type', 'application/x-www-form-urlencoded;charset=UTF-8'); + } + return create$6(init, { + body: createPropertyDescriptor(0, $toString$2(body)), + headers: createPropertyDescriptor(0, headers) + }); + } + } return init; + }; + + if (isCallable$5(n$Fetch)) { + $$X({ global: true, enumerable: true, forced: true }, { + fetch: function fetch(input /* , init */) { + return n$Fetch(input, arguments.length > 1 ? wrapRequestOptions(arguments[1]) : {}); + } + }); + } + + if (isCallable$5(N$Request)) { + var RequestConstructor = function Request(input /* , init */) { + anInstance$3(this, RequestPrototype); + return new N$Request(input, arguments.length > 1 ? wrapRequestOptions(arguments[1]) : {}); + }; + + RequestPrototype.constructor = RequestConstructor; + RequestConstructor.prototype = RequestPrototype; + + $$X({ global: true, forced: true }, { + Request: RequestConstructor + }); + } + } + + var web_urlSearchParams = { + URLSearchParams: URLSearchParamsConstructor, + getState: getInternalParamsState + }; + + var uncurryThis$t = functionUncurryThis; + var PROPER_FUNCTION_NAME$1 = functionName.PROPER; + var redefine$6 = redefine$h.exports; + var anObject$8 = anObject$n; + var isPrototypeOf$2 = objectIsPrototypeOf; + var $toString$1 = toString$k; + var fails$s = fails$V; + var regExpFlags$2 = regexpFlags$1; + + var TO_STRING = 'toString'; + var RegExpPrototype$3 = RegExp.prototype; + var n$ToString = RegExpPrototype$3[TO_STRING]; + var getFlags$1 = uncurryThis$t(regExpFlags$2); + + var NOT_GENERIC = fails$s(function () { return n$ToString.call({ source: 'a', flags: 'b' }) != '/a/b'; }); + // FF44- RegExp#toString has a wrong name + var INCORRECT_NAME = PROPER_FUNCTION_NAME$1 && n$ToString.name != TO_STRING; + + // `RegExp.prototype.toString` method + // https://tc39.es/ecma262/#sec-regexp.prototype.tostring + if (NOT_GENERIC || INCORRECT_NAME) { + redefine$6(RegExp.prototype, TO_STRING, function toString() { + var R = anObject$8(this); + var p = $toString$1(R.source); + var rf = R.flags; + var f = $toString$1(rf === undefined && isPrototypeOf$2(RegExpPrototype$3, R) && !('flags' in RegExpPrototype$3) ? getFlags$1(R) : rf); + return '/' + p + '/' + f; + }, { unsafe: true }); + } + + // TODO: Remove from `core-js@4` since it's moved to entry points + + var uncurryThis$s = functionUncurryThis; + var redefine$5 = redefine$h.exports; + var regexpExec$2 = regexpExec$3; + var fails$r = fails$V; + var wellKnownSymbol$5 = wellKnownSymbol$t; + var createNonEnumerableProperty$1 = createNonEnumerableProperty$b; + + var SPECIES = wellKnownSymbol$5('species'); + var RegExpPrototype$2 = RegExp.prototype; + + var fixRegexpWellKnownSymbolLogic = function (KEY, exec, FORCED, SHAM) { + var SYMBOL = wellKnownSymbol$5(KEY); + + var DELEGATES_TO_SYMBOL = !fails$r(function () { + // String methods call symbol-named RegEp methods + var O = {}; + O[SYMBOL] = function () { return 7; }; + return ''[KEY](O) != 7; + }); + + var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails$r(function () { + // Symbol-named RegExp methods call .exec + var execCalled = false; + var re = /a/; + + if (KEY === 'split') { + // We can't use real regex here since it causes deoptimization + // and serious performance degradation in V8 + // https://github.com/zloirock/core-js/issues/306 + re = {}; + // RegExp[@@split] doesn't call the regex's exec method, but first creates + // a new one. We need to return the patched regex when creating the new one. + re.constructor = {}; + re.constructor[SPECIES] = function () { return re; }; + re.flags = ''; + re[SYMBOL] = /./[SYMBOL]; + } + + re.exec = function () { execCalled = true; return null; }; + + re[SYMBOL](''); + return !execCalled; + }); + + if ( + !DELEGATES_TO_SYMBOL || + !DELEGATES_TO_EXEC || + FORCED + ) { + var uncurriedNativeRegExpMethod = uncurryThis$s(/./[SYMBOL]); + var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) { + var uncurriedNativeMethod = uncurryThis$s(nativeMethod); + var $exec = regexp.exec; + if ($exec === regexpExec$2 || $exec === RegExpPrototype$2.exec) { + if (DELEGATES_TO_SYMBOL && !forceStringMethod) { + // The native String method already delegates to @@method (this + // polyfilled function), leasing to infinite recursion. + // We avoid it by directly calling the native @@method method. + return { done: true, value: uncurriedNativeRegExpMethod(regexp, str, arg2) }; + } + return { done: true, value: uncurriedNativeMethod(str, regexp, arg2) }; + } + return { done: false }; + }); + + redefine$5(String.prototype, KEY, methods[0]); + redefine$5(RegExpPrototype$2, SYMBOL, methods[1]); + } + + if (SHAM) createNonEnumerableProperty$1(RegExpPrototype$2[SYMBOL], 'sham', true); + }; + + var charAt$4 = stringMultibyte.charAt; + + // `AdvanceStringIndex` abstract operation + // https://tc39.es/ecma262/#sec-advancestringindex + var advanceStringIndex$3 = function (S, index, unicode) { + return index + (unicode ? charAt$4(S, index).length : 1); + }; + + var uncurryThis$r = functionUncurryThis; + var toObject$9 = toObject$i; + + var floor$3 = Math.floor; + var charAt$3 = uncurryThis$r(''.charAt); + var replace$5 = uncurryThis$r(''.replace); + var stringSlice$7 = uncurryThis$r(''.slice); + var SUBSTITUTION_SYMBOLS = /\$([$&'`]|\d{1,2}|<[^>]*>)/g; + var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&'`]|\d{1,2})/g; + + // `GetSubstitution` abstract operation + // https://tc39.es/ecma262/#sec-getsubstitution + var getSubstitution$1 = function (matched, str, position, captures, namedCaptures, replacement) { + var tailPos = position + matched.length; + var m = captures.length; + var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED; + if (namedCaptures !== undefined) { + namedCaptures = toObject$9(namedCaptures); + symbols = SUBSTITUTION_SYMBOLS; + } + return replace$5(replacement, symbols, function (match, ch) { + var capture; + switch (charAt$3(ch, 0)) { + case '$': return '$'; + case '&': return matched; + case '`': return stringSlice$7(str, 0, position); + case "'": return stringSlice$7(str, tailPos); + case '<': + capture = namedCaptures[stringSlice$7(ch, 1, -1)]; + break; + default: // \d\d? + var n = +ch; + if (n === 0) return match; + if (n > m) { + var f = floor$3(n / 10); + if (f === 0) return match; + if (f <= m) return captures[f - 1] === undefined ? charAt$3(ch, 1) : captures[f - 1] + charAt$3(ch, 1); + return match; + } + capture = captures[n - 1]; + } + return capture === undefined ? '' : capture; + }); + }; + + var global$m = global$1o; + var call$8 = functionCall; + var anObject$7 = anObject$n; + var isCallable$4 = isCallable$r; + var classof$2 = classofRaw$1; + var regexpExec$1 = regexpExec$3; + + var TypeError$7 = global$m.TypeError; + + // `RegExpExec` abstract operation + // https://tc39.es/ecma262/#sec-regexpexec + var regexpExecAbstract = function (R, S) { + var exec = R.exec; + if (isCallable$4(exec)) { + var result = call$8(exec, R, S); + if (result !== null) anObject$7(result); + return result; + } + if (classof$2(R) === 'RegExp') return call$8(regexpExec$1, R, S); + throw TypeError$7('RegExp#exec called on incompatible receiver'); + }; + + var apply$3 = functionApply; + var call$7 = functionCall; + var uncurryThis$q = functionUncurryThis; + var fixRegExpWellKnownSymbolLogic$3 = fixRegexpWellKnownSymbolLogic; + var fails$q = fails$V; + var anObject$6 = anObject$n; + var isCallable$3 = isCallable$r; + var toIntegerOrInfinity$3 = toIntegerOrInfinity$b; + var toLength$5 = toLength$c; + var toString$f = toString$k; + var requireObjectCoercible$a = requireObjectCoercible$e; + var advanceStringIndex$2 = advanceStringIndex$3; + var getMethod$3 = getMethod$7; + var getSubstitution = getSubstitution$1; + var regExpExec$3 = regexpExecAbstract; + var wellKnownSymbol$4 = wellKnownSymbol$t; + + var REPLACE = wellKnownSymbol$4('replace'); + var max$2 = Math.max; + var min$5 = Math.min; + var concat$2 = uncurryThis$q([].concat); + var push$6 = uncurryThis$q([].push); + var stringIndexOf$2 = uncurryThis$q(''.indexOf); + var stringSlice$6 = uncurryThis$q(''.slice); + + var maybeToString = function (it) { + return it === undefined ? it : String(it); + }; + + // IE <= 11 replaces $0 with the whole match, as if it was $& + // https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0 + var REPLACE_KEEPS_$0 = (function () { + // eslint-disable-next-line regexp/prefer-escape-replacement-dollar-char -- required for testing + return 'a'.replace(/./, '$0') === '$0'; + })(); + + // Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string + var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () { + if (/./[REPLACE]) { + return /./[REPLACE]('a', '$0') === ''; + } + return false; + })(); + + var REPLACE_SUPPORTS_NAMED_GROUPS = !fails$q(function () { + var re = /./; + re.exec = function () { + var result = []; + result.groups = { a: '7' }; + return result; + }; + // eslint-disable-next-line regexp/no-useless-dollar-replacements -- false positive + return ''.replace(re, '$') !== '7'; + }); + + // @@replace logic + fixRegExpWellKnownSymbolLogic$3('replace', function (_, nativeReplace, maybeCallNative) { + var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0'; + + return [ + // `String.prototype.replace` method + // https://tc39.es/ecma262/#sec-string.prototype.replace + function replace(searchValue, replaceValue) { + var O = requireObjectCoercible$a(this); + var replacer = searchValue == undefined ? undefined : getMethod$3(searchValue, REPLACE); + return replacer + ? call$7(replacer, searchValue, O, replaceValue) + : call$7(nativeReplace, toString$f(O), searchValue, replaceValue); + }, + // `RegExp.prototype[@@replace]` method + // https://tc39.es/ecma262/#sec-regexp.prototype-@@replace + function (string, replaceValue) { + var rx = anObject$6(this); + var S = toString$f(string); + + if ( + typeof replaceValue == 'string' && + stringIndexOf$2(replaceValue, UNSAFE_SUBSTITUTE) === -1 && + stringIndexOf$2(replaceValue, '$<') === -1 + ) { + var res = maybeCallNative(nativeReplace, rx, S, replaceValue); + if (res.done) return res.value; + } + + var functionalReplace = isCallable$3(replaceValue); + if (!functionalReplace) replaceValue = toString$f(replaceValue); + + var global = rx.global; + if (global) { + var fullUnicode = rx.unicode; + rx.lastIndex = 0; + } + var results = []; + while (true) { + var result = regExpExec$3(rx, S); + if (result === null) break; + + push$6(results, result); + if (!global) break; + + var matchStr = toString$f(result[0]); + if (matchStr === '') rx.lastIndex = advanceStringIndex$2(S, toLength$5(rx.lastIndex), fullUnicode); + } + + var accumulatedResult = ''; + var nextSourcePosition = 0; + for (var i = 0; i < results.length; i++) { + result = results[i]; + + var matched = toString$f(result[0]); + var position = max$2(min$5(toIntegerOrInfinity$3(result.index), S.length), 0); + var captures = []; + // NOTE: This is equivalent to + // captures = result.slice(1).map(maybeToString) + // but for some reason `nativeSlice.call(result, 1, result.length)` (called in + // the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and + // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it. + for (var j = 1; j < result.length; j++) push$6(captures, maybeToString(result[j])); + var namedCaptures = result.groups; + if (functionalReplace) { + var replacerArgs = concat$2([matched], captures, position, S); + if (namedCaptures !== undefined) push$6(replacerArgs, namedCaptures); + var replacement = toString$f(apply$3(replaceValue, undefined, replacerArgs)); + } else { + replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue); + } + if (position >= nextSourcePosition) { + accumulatedResult += stringSlice$6(S, nextSourcePosition, position) + replacement; + nextSourcePosition = position + matched.length; + } + } + return accumulatedResult + stringSlice$6(S, nextSourcePosition); + } + ]; + }, !REPLACE_SUPPORTS_NAMED_GROUPS || !REPLACE_KEEPS_$0 || REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE); + + var isObject$c = isObject$s; + var classof$1 = classofRaw$1; + var wellKnownSymbol$3 = wellKnownSymbol$t; + + var MATCH$2 = wellKnownSymbol$3('match'); + + // `IsRegExp` abstract operation + // https://tc39.es/ecma262/#sec-isregexp + var isRegexp = function (it) { + var isRegExp; + return isObject$c(it) && ((isRegExp = it[MATCH$2]) !== undefined ? !!isRegExp : classof$1(it) == 'RegExp'); + }; + + var apply$2 = functionApply; + var call$6 = functionCall; + var uncurryThis$p = functionUncurryThis; + var fixRegExpWellKnownSymbolLogic$2 = fixRegexpWellKnownSymbolLogic; + var isRegExp$2 = isRegexp; + var anObject$5 = anObject$n; + var requireObjectCoercible$9 = requireObjectCoercible$e; + var speciesConstructor$1 = speciesConstructor$5; + var advanceStringIndex$1 = advanceStringIndex$3; + var toLength$4 = toLength$c; + var toString$e = toString$k; + var getMethod$2 = getMethod$7; + var arraySlice$4 = arraySliceSimple; + var callRegExpExec = regexpExecAbstract; + var regexpExec = regexpExec$3; + var stickyHelpers$1 = regexpStickyHelpers; + var fails$p = fails$V; + + var UNSUPPORTED_Y$1 = stickyHelpers$1.UNSUPPORTED_Y; + var MAX_UINT32 = 0xFFFFFFFF; + var min$4 = Math.min; + var $push = [].push; + var exec$4 = uncurryThis$p(/./.exec); + var push$5 = uncurryThis$p($push); + var stringSlice$5 = uncurryThis$p(''.slice); + + // Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec + // Weex JS has frozen built-in prototypes, so use try / catch wrapper + var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails$p(function () { + // eslint-disable-next-line regexp/no-empty-group -- required for testing + var re = /(?:)/; + var originalExec = re.exec; + re.exec = function () { return originalExec.apply(this, arguments); }; + var result = 'ab'.split(re); + return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b'; + }); + + // @@split logic + fixRegExpWellKnownSymbolLogic$2('split', function (SPLIT, nativeSplit, maybeCallNative) { + var internalSplit; + if ( + 'abbc'.split(/(b)*/)[1] == 'c' || + // eslint-disable-next-line regexp/no-empty-group -- required for testing + 'test'.split(/(?:)/, -1).length != 4 || + 'ab'.split(/(?:ab)*/).length != 2 || + '.'.split(/(.?)(.?)/).length != 4 || + // eslint-disable-next-line regexp/no-empty-capturing-group, regexp/no-empty-group -- required for testing + '.'.split(/()()/).length > 1 || + ''.split(/.?/).length + ) { + // based on es5-shim implementation, need to rework it + internalSplit = function (separator, limit) { + var string = toString$e(requireObjectCoercible$9(this)); + var lim = limit === undefined ? MAX_UINT32 : limit >>> 0; + if (lim === 0) return []; + if (separator === undefined) return [string]; + // If `separator` is not a regex, use native split + if (!isRegExp$2(separator)) { + return call$6(nativeSplit, string, separator, lim); + } + var output = []; + var flags = (separator.ignoreCase ? 'i' : '') + + (separator.multiline ? 'm' : '') + + (separator.unicode ? 'u' : '') + + (separator.sticky ? 'y' : ''); + var lastLastIndex = 0; + // Make `global` and avoid `lastIndex` issues by working with a copy + var separatorCopy = new RegExp(separator.source, flags + 'g'); + var match, lastIndex, lastLength; + while (match = call$6(regexpExec, separatorCopy, string)) { + lastIndex = separatorCopy.lastIndex; + if (lastIndex > lastLastIndex) { + push$5(output, stringSlice$5(string, lastLastIndex, match.index)); + if (match.length > 1 && match.index < string.length) apply$2($push, output, arraySlice$4(match, 1)); + lastLength = match[0].length; + lastLastIndex = lastIndex; + if (output.length >= lim) break; + } + if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop + } + if (lastLastIndex === string.length) { + if (lastLength || !exec$4(separatorCopy, '')) push$5(output, ''); + } else push$5(output, stringSlice$5(string, lastLastIndex)); + return output.length > lim ? arraySlice$4(output, 0, lim) : output; + }; + // Chakra, V8 + } else if ('0'.split(undefined, 0).length) { + internalSplit = function (separator, limit) { + return separator === undefined && limit === 0 ? [] : call$6(nativeSplit, this, separator, limit); + }; + } else internalSplit = nativeSplit; + + return [ + // `String.prototype.split` method + // https://tc39.es/ecma262/#sec-string.prototype.split + function split(separator, limit) { + var O = requireObjectCoercible$9(this); + var splitter = separator == undefined ? undefined : getMethod$2(separator, SPLIT); + return splitter + ? call$6(splitter, separator, O, limit) + : call$6(internalSplit, toString$e(O), separator, limit); + }, + // `RegExp.prototype[@@split]` method + // https://tc39.es/ecma262/#sec-regexp.prototype-@@split + // + // NOTE: This cannot be properly polyfilled in engines that don't support + // the 'y' flag. + function (string, limit) { + var rx = anObject$5(this); + var S = toString$e(string); + var res = maybeCallNative(internalSplit, rx, S, limit, internalSplit !== nativeSplit); + + if (res.done) return res.value; + + var C = speciesConstructor$1(rx, RegExp); + + var unicodeMatching = rx.unicode; + var flags = (rx.ignoreCase ? 'i' : '') + + (rx.multiline ? 'm' : '') + + (rx.unicode ? 'u' : '') + + (UNSUPPORTED_Y$1 ? 'g' : 'y'); + + // ^(? + rx + ) is needed, in combination with some S slicing, to + // simulate the 'y' flag. + var splitter = new C(UNSUPPORTED_Y$1 ? '^(?:' + rx.source + ')' : rx, flags); + var lim = limit === undefined ? MAX_UINT32 : limit >>> 0; + if (lim === 0) return []; + if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : []; + var p = 0; + var q = 0; + var A = []; + while (q < S.length) { + splitter.lastIndex = UNSUPPORTED_Y$1 ? 0 : q; + var z = callRegExpExec(splitter, UNSUPPORTED_Y$1 ? stringSlice$5(S, q) : S); + var e; + if ( + z === null || + (e = min$4(toLength$4(splitter.lastIndex + (UNSUPPORTED_Y$1 ? q : 0)), S.length)) === p + ) { + q = advanceStringIndex$1(S, q, unicodeMatching); + } else { + push$5(A, stringSlice$5(S, p, q)); + if (A.length === lim) return A; + for (var i = 1; i <= z.length - 1; i++) { + push$5(A, z[i]); + if (A.length === lim) return A; + } + q = p = e; + } + } + push$5(A, stringSlice$5(S, p)); + return A; + } + ]; + }, !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC, UNSUPPORTED_Y$1); + + // a string of all valid unicode whitespaces + var whitespaces$4 = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002' + + '\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'; + + var uncurryThis$o = functionUncurryThis; + var requireObjectCoercible$8 = requireObjectCoercible$e; + var toString$d = toString$k; + var whitespaces$3 = whitespaces$4; + + var replace$4 = uncurryThis$o(''.replace); + var whitespace = '[' + whitespaces$3 + ']'; + var ltrim = RegExp('^' + whitespace + whitespace + '*'); + var rtrim$2 = RegExp(whitespace + whitespace + '*$'); + + // `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation + var createMethod$2 = function (TYPE) { + return function ($this) { + var string = toString$d(requireObjectCoercible$8($this)); + if (TYPE & 1) string = replace$4(string, ltrim, ''); + if (TYPE & 2) string = replace$4(string, rtrim$2, ''); + return string; + }; + }; + + var stringTrim = { + // `String.prototype.{ trimLeft, trimStart }` methods + // https://tc39.es/ecma262/#sec-string.prototype.trimstart + start: createMethod$2(1), + // `String.prototype.{ trimRight, trimEnd }` methods + // https://tc39.es/ecma262/#sec-string.prototype.trimend + end: createMethod$2(2), + // `String.prototype.trim` method + // https://tc39.es/ecma262/#sec-string.prototype.trim + trim: createMethod$2(3) + }; + + var PROPER_FUNCTION_NAME = functionName.PROPER; + var fails$o = fails$V; + var whitespaces$2 = whitespaces$4; + + var non = '\u200B\u0085\u180E'; + + // check that a method works with the correct list + // of whitespaces and has a correct name + var stringTrimForced = function (METHOD_NAME) { + return fails$o(function () { + return !!whitespaces$2[METHOD_NAME]() + || non[METHOD_NAME]() !== non + || (PROPER_FUNCTION_NAME && whitespaces$2[METHOD_NAME].name !== METHOD_NAME); + }); + }; + + var $$W = _export; + var $trim = stringTrim.trim; + var forcedStringTrimMethod$2 = stringTrimForced; + + // `String.prototype.trim` method + // https://tc39.es/ecma262/#sec-string.prototype.trim + $$W({ target: 'String', proto: true, forced: forcedStringTrimMethod$2('trim') }, { + trim: function trim() { + return $trim(this); + } + }); + + var DESCRIPTORS$b = descriptors; + var FUNCTION_NAME_EXISTS = functionName.EXISTS; + var uncurryThis$n = functionUncurryThis; + var defineProperty$6 = objectDefineProperty.f; + + var FunctionPrototype = Function.prototype; + var functionToString = uncurryThis$n(FunctionPrototype.toString); + var nameRE = /function\b(?:\s|\/\*[\S\s]*?\*\/|\/\/[^\n\r]*[\n\r]+)*([^\s(/]*)/; + var regExpExec$2 = uncurryThis$n(nameRE.exec); + var NAME = 'name'; + + // Function instances `.name` property + // https://tc39.es/ecma262/#sec-function-instances-name + if (DESCRIPTORS$b && !FUNCTION_NAME_EXISTS) { + defineProperty$6(FunctionPrototype, NAME, { + configurable: true, + get: function () { + try { + return regExpExec$2(nameRE, functionToString(this))[1]; + } catch (error) { + return ''; + } + } + }); + } + + var $$V = _export; + var DESCRIPTORS$a = descriptors; + var create$5 = objectCreate; + + // `Object.create` method + // https://tc39.es/ecma262/#sec-object.create + $$V({ target: 'Object', stat: true, sham: !DESCRIPTORS$a }, { + create: create$5 + }); + + var $$U = _export; + var global$l = global$1o; + var apply$1 = functionApply; + var isCallable$2 = isCallable$r; + var userAgent$1 = engineUserAgent; + var arraySlice$3 = arraySlice$b; + var validateArgumentsLength$1 = validateArgumentsLength$4; + + var MSIE = /MSIE .\./.test(userAgent$1); // <- dirty ie9- check + var Function$2 = global$l.Function; + + var wrap$1 = function (scheduler) { + return function (handler, timeout /* , ...arguments */) { + var boundArgs = validateArgumentsLength$1(arguments.length, 1) > 2; + var fn = isCallable$2(handler) ? handler : Function$2(handler); + var args = boundArgs ? arraySlice$3(arguments, 2) : undefined; + return scheduler(boundArgs ? function () { + apply$1(fn, this, args); + } : fn, timeout); + }; + }; + + // ie9- setTimeout & setInterval additional parameters fix + // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timers + $$U({ global: true, bind: true, forced: MSIE }, { + // `setTimeout` method + // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-settimeout + setTimeout: wrap$1(global$l.setTimeout), + // `setInterval` method + // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-setinterval + setInterval: wrap$1(global$l.setInterval) + }); + + var global$k = typeof globalThis !== 'undefined' && globalThis || typeof self !== 'undefined' && self || typeof global$k !== 'undefined' && global$k; + var support = { + searchParams: 'URLSearchParams' in global$k, + iterable: 'Symbol' in global$k && 'iterator' in Symbol, + blob: 'FileReader' in global$k && 'Blob' in global$k && function () { + try { + new Blob(); + return true; + } catch (e) { + return false; + } + }(), + formData: 'FormData' in global$k, + arrayBuffer: 'ArrayBuffer' in global$k + }; + + function isDataView(obj) { + return obj && DataView.prototype.isPrototypeOf(obj); + } + + if (support.arrayBuffer) { + var viewClasses = ['[object Int8Array]', '[object Uint8Array]', '[object Uint8ClampedArray]', '[object Int16Array]', '[object Uint16Array]', '[object Int32Array]', '[object Uint32Array]', '[object Float32Array]', '[object Float64Array]']; + + var isArrayBufferView = ArrayBuffer.isView || function (obj) { + return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1; + }; + } + + function normalizeName(name) { + if (typeof name !== 'string') { + name = String(name); + } + + if (/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(name) || name === '') { + throw new TypeError('Invalid character in header field name: "' + name + '"'); + } + + return name.toLowerCase(); + } + + function normalizeValue(value) { + if (typeof value !== 'string') { + value = String(value); + } + + return value; + } // Build a destructive iterator for the value list + + + function iteratorFor(items) { + var iterator = { + next: function next() { + var value = items.shift(); + return { + done: value === undefined, + value: value + }; + } + }; + + if (support.iterable) { + iterator[Symbol.iterator] = function () { + return iterator; + }; + } + + return iterator; + } + + function Headers(headers) { + this.map = {}; + + if (headers instanceof Headers) { + headers.forEach(function (value, name) { + this.append(name, value); + }, this); + } else if (Array.isArray(headers)) { + headers.forEach(function (header) { + this.append(header[0], header[1]); + }, this); + } else if (headers) { + Object.getOwnPropertyNames(headers).forEach(function (name) { + this.append(name, headers[name]); + }, this); + } + } + + Headers.prototype.append = function (name, value) { + name = normalizeName(name); + value = normalizeValue(value); + var oldValue = this.map[name]; + this.map[name] = oldValue ? oldValue + ', ' + value : value; + }; + + Headers.prototype['delete'] = function (name) { + delete this.map[normalizeName(name)]; + }; + + Headers.prototype.get = function (name) { + name = normalizeName(name); + return this.has(name) ? this.map[name] : null; + }; + + Headers.prototype.has = function (name) { + return this.map.hasOwnProperty(normalizeName(name)); + }; + + Headers.prototype.set = function (name, value) { + this.map[normalizeName(name)] = normalizeValue(value); + }; + + Headers.prototype.forEach = function (callback, thisArg) { + for (var name in this.map) { + if (this.map.hasOwnProperty(name)) { + callback.call(thisArg, this.map[name], name, this); + } + } + }; + + Headers.prototype.keys = function () { + var items = []; + this.forEach(function (value, name) { + items.push(name); + }); + return iteratorFor(items); + }; + + Headers.prototype.values = function () { + var items = []; + this.forEach(function (value) { + items.push(value); + }); + return iteratorFor(items); + }; + + Headers.prototype.entries = function () { + var items = []; + this.forEach(function (value, name) { + items.push([name, value]); + }); + return iteratorFor(items); + }; + + if (support.iterable) { + Headers.prototype[Symbol.iterator] = Headers.prototype.entries; + } + + function consumed(body) { + if (body.bodyUsed) { + return Promise.reject(new TypeError('Already read')); + } + + body.bodyUsed = true; + } + + function fileReaderReady(reader) { + return new Promise(function (resolve, reject) { + reader.onload = function () { + resolve(reader.result); + }; + + reader.onerror = function () { + reject(reader.error); + }; + }); + } + + function readBlobAsArrayBuffer(blob) { + var reader = new FileReader(); + var promise = fileReaderReady(reader); + reader.readAsArrayBuffer(blob); + return promise; + } + + function readBlobAsText(blob) { + var reader = new FileReader(); + var promise = fileReaderReady(reader); + reader.readAsText(blob); + return promise; + } + + function readArrayBufferAsText(buf) { + var view = new Uint8Array(buf); + var chars = new Array(view.length); + + for (var i = 0; i < view.length; i++) { + chars[i] = String.fromCharCode(view[i]); } - return chars.join('') + + return chars.join(''); } function bufferClone(buf) { if (buf.slice) { - return buf.slice(0) + return buf.slice(0); } else { var view = new Uint8Array(buf.byteLength); view.set(new Uint8Array(buf)); - return view.buffer + return view.buffer; } } function Body() { this.bodyUsed = false; - this._initBody = function(body) { + this._initBody = function (body) { /* fetch-mock wraps the Response object in an ES6 Proxy to provide useful test harness features such as flush. However, on @@ -5060,6 +6783,7 @@ */ this.bodyUsed = this.bodyUsed; this._bodyInit = body; + if (!body) { this._bodyText = ''; } else if (typeof body === 'string') { @@ -5071,8 +6795,8 @@ } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { this._bodyText = body.toString(); } else if (support.arrayBuffer && support.blob && isDataView(body)) { - this._bodyArrayBuffer = bufferClone(body.buffer); - // IE 10-11 can't handle a DataView body. + this._bodyArrayBuffer = bufferClone(body.buffer); // IE 10-11 can't handle a DataView body. + this._bodyInit = new Blob([this._bodyArrayBuffer]); } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) { this._bodyArrayBuffer = bufferClone(body); @@ -5092,86 +6816,106 @@ }; if (support.blob) { - this.blob = function() { + this.blob = function () { var rejected = consumed(this); + if (rejected) { - return rejected + return rejected; } if (this._bodyBlob) { - return Promise.resolve(this._bodyBlob) + return Promise.resolve(this._bodyBlob); } else if (this._bodyArrayBuffer) { - return Promise.resolve(new Blob([this._bodyArrayBuffer])) + return Promise.resolve(new Blob([this._bodyArrayBuffer])); } else if (this._bodyFormData) { - throw new Error('could not read FormData body as blob') + throw new Error('could not read FormData body as blob'); } else { - return Promise.resolve(new Blob([this._bodyText])) + return Promise.resolve(new Blob([this._bodyText])); } }; - this.arrayBuffer = function() { + this.arrayBuffer = function () { if (this._bodyArrayBuffer) { - return consumed(this) || Promise.resolve(this._bodyArrayBuffer) + var isConsumed = consumed(this); + + if (isConsumed) { + return isConsumed; + } + + if (ArrayBuffer.isView(this._bodyArrayBuffer)) { + return Promise.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset, this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength)); + } else { + return Promise.resolve(this._bodyArrayBuffer); + } } else { - return this.blob().then(readBlobAsArrayBuffer) + return this.blob().then(readBlobAsArrayBuffer); } }; } - this.text = function() { + this.text = function () { var rejected = consumed(this); + if (rejected) { - return rejected + return rejected; } if (this._bodyBlob) { - return readBlobAsText(this._bodyBlob) + return readBlobAsText(this._bodyBlob); } else if (this._bodyArrayBuffer) { - return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer)) + return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer)); } else if (this._bodyFormData) { - throw new Error('could not read FormData body as text') + throw new Error('could not read FormData body as text'); } else { - return Promise.resolve(this._bodyText) + return Promise.resolve(this._bodyText); } }; if (support.formData) { - this.formData = function() { - return this.text().then(decode) + this.formData = function () { + return this.text().then(decode); }; } - this.json = function() { - return this.text().then(JSON.parse) + this.json = function () { + return this.text().then(JSON.parse); }; - return this - } + return this; + } // HTTP methods whose capitalization should be normalized + - // HTTP methods whose capitalization should be normalized var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']; function normalizeMethod(method) { var upcased = method.toUpperCase(); - return methods.indexOf(upcased) > -1 ? upcased : method + return methods.indexOf(upcased) > -1 ? upcased : method; } function Request(input, options) { + if (!(this instanceof Request)) { + throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.'); + } + options = options || {}; var body = options.body; if (input instanceof Request) { if (input.bodyUsed) { - throw new TypeError('Already read') + throw new TypeError('Already read'); } + this.url = input.url; this.credentials = input.credentials; + if (!options.headers) { this.headers = new Headers(input.headers); } + this.method = input.method; this.mode = input.mode; this.signal = input.signal; + if (!body && input._bodyInit != null) { body = input._bodyInit; input.bodyUsed = true; @@ -5181,23 +6925,27 @@ } this.credentials = options.credentials || this.credentials || 'same-origin'; + if (options.headers || !this.headers) { this.headers = new Headers(options.headers); } + this.method = normalizeMethod(options.method || this.method || 'GET'); this.mode = options.mode || this.mode || null; this.signal = options.signal || this.signal; this.referrer = null; if ((this.method === 'GET' || this.method === 'HEAD') && body) { - throw new TypeError('Body not allowed for GET or HEAD requests') + throw new TypeError('Body not allowed for GET or HEAD requests'); } + this._initBody(body); if (this.method === 'GET' || this.method === 'HEAD') { if (options.cache === 'no-store' || options.cache === 'no-cache') { // Search for a '_' parameter in the query string var reParamSearch = /([?&])_=[^&]*/; + if (reParamSearch.test(this.url)) { // If it already exists then set the value with the current time this.url = this.url.replace(reParamSearch, '$1_=' + new Date().getTime()); @@ -5210,45 +6958,53 @@ } } - Request.prototype.clone = function() { - return new Request(this, {body: this._bodyInit}) + Request.prototype.clone = function () { + return new Request(this, { + body: this._bodyInit + }); }; function decode(body) { var form = new FormData(); - body - .trim() - .split('&') - .forEach(function(bytes) { - if (bytes) { - var split = bytes.split('='); - var name = split.shift().replace(/\+/g, ' '); - var value = split.join('=').replace(/\+/g, ' '); - form.append(decodeURIComponent(name), decodeURIComponent(value)); - } - }); - return form + body.trim().split('&').forEach(function (bytes) { + if (bytes) { + var split = bytes.split('='); + var name = split.shift().replace(/\+/g, ' '); + var value = split.join('=').replace(/\+/g, ' '); + form.append(decodeURIComponent(name), decodeURIComponent(value)); + } + }); + return form; } function parseHeaders(rawHeaders) { - var headers = new Headers(); - // Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space + var headers = new Headers(); // Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space // https://tools.ietf.org/html/rfc7230#section-3.2 - var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' '); - preProcessedHeaders.split(/\r?\n/).forEach(function(line) { + + var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' '); // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill + // https://github.com/github/fetch/issues/748 + // https://github.com/zloirock/core-js/issues/751 + + preProcessedHeaders.split('\r').map(function (header) { + return header.indexOf('\n') === 0 ? header.substr(1, header.length) : header; + }).forEach(function (line) { var parts = line.split(':'); var key = parts.shift().trim(); + if (key) { var value = parts.join(':').trim(); headers.append(key, value); } }); - return headers + return headers; } Body.call(Request.prototype); - function Response(bodyInit, options) { + if (!(this instanceof Response)) { + throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.'); + } + if (!options) { options = {}; } @@ -5256,58 +7012,69 @@ this.type = 'default'; this.status = options.status === undefined ? 200 : options.status; this.ok = this.status >= 200 && this.status < 300; - this.statusText = 'statusText' in options ? options.statusText : ''; + this.statusText = options.statusText === undefined ? '' : '' + options.statusText; this.headers = new Headers(options.headers); this.url = options.url || ''; + this._initBody(bodyInit); } - Body.call(Response.prototype); - Response.prototype.clone = function() { + Response.prototype.clone = function () { return new Response(this._bodyInit, { status: this.status, statusText: this.statusText, headers: new Headers(this.headers), url: this.url - }) + }); }; - Response.error = function() { - var response = new Response(null, {status: 0, statusText: ''}); + Response.error = function () { + var response = new Response(null, { + status: 0, + statusText: '' + }); response.type = 'error'; - return response + return response; }; var redirectStatuses = [301, 302, 303, 307, 308]; - Response.redirect = function(url, status) { + Response.redirect = function (url, status) { if (redirectStatuses.indexOf(status) === -1) { - throw new RangeError('Invalid status code') + throw new RangeError('Invalid status code'); } - return new Response(null, {status: status, headers: {location: url}}) + return new Response(null, { + status: status, + headers: { + location: url + } + }); }; - var DOMException$1 = global$1.DOMException; + var DOMException$1 = global$k.DOMException; - if (typeof DOMException$1 !== 'function') { - DOMException$1 = function(message, name) { + try { + new DOMException$1(); + } catch (err) { + DOMException$1 = function DOMException(message, name) { this.message = message; this.name = name; var error = Error(message); this.stack = error.stack; }; + DOMException$1.prototype = Object.create(Error.prototype); DOMException$1.prototype.constructor = DOMException$1; } function fetch$1(input, init) { - return new Promise(function(resolve, reject) { + return new Promise(function (resolve, reject) { var request = new Request(input, init); if (request.signal && request.signal.aborted) { - return reject(new DOMException$1('Aborted', 'AbortError')) + return reject(new DOMException$1('Aborted', 'AbortError')); } var xhr = new XMLHttpRequest(); @@ -5316,7 +7083,7 @@ xhr.abort(); } - xhr.onload = function() { + xhr.onload = function () { var options = { status: xhr.status, statusText: xhr.statusText, @@ -5324,34 +7091,34 @@ }; options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL'); var body = 'response' in xhr ? xhr.response : xhr.responseText; - setTimeout(function() { + setTimeout(function () { resolve(new Response(body, options)); }, 0); }; - xhr.onerror = function() { - setTimeout(function() { + xhr.onerror = function () { + setTimeout(function () { reject(new TypeError('Network request failed')); }, 0); }; - xhr.ontimeout = function() { - setTimeout(function() { + xhr.ontimeout = function () { + setTimeout(function () { reject(new TypeError('Network request failed')); }, 0); }; - xhr.onabort = function() { - setTimeout(function() { + xhr.onabort = function () { + setTimeout(function () { reject(new DOMException$1('Aborted', 'AbortError')); }, 0); }; function fixUrl(url) { try { - return url === '' && global$1.location.href ? global$1.location.href : url + return url === '' && global$k.location.href ? global$k.location.href : url; } catch (e) { - return url + return url; } } @@ -5366,23 +7133,25 @@ if ('responseType' in xhr) { if (support.blob) { xhr.responseType = 'blob'; - } else if ( - support.arrayBuffer && - request.headers.get('Content-Type') && - request.headers.get('Content-Type').indexOf('application/octet-stream') !== -1 - ) { + } else if (support.arrayBuffer && request.headers.get('Content-Type') && request.headers.get('Content-Type').indexOf('application/octet-stream') !== -1) { xhr.responseType = 'arraybuffer'; } } - request.headers.forEach(function(value, name) { - xhr.setRequestHeader(name, value); - }); + if (init && _typeof(init.headers) === 'object' && !(init.headers instanceof Headers)) { + Object.getOwnPropertyNames(init.headers).forEach(function (name) { + xhr.setRequestHeader(name, normalizeValue(init.headers[name])); + }); + } else { + request.headers.forEach(function (value, name) { + xhr.setRequestHeader(name, value); + }); + } if (request.signal) { request.signal.addEventListener('abort', abortXhr); - xhr.onreadystatechange = function() { + xhr.onreadystatechange = function () { // DONE (success or failure) if (xhr.readyState === 4) { request.signal.removeEventListener('abort', abortXhr); @@ -5391,153 +7160,285 @@ } xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit); - }) + }); } - fetch$1.polyfill = true; - if (!global$1.fetch) { - global$1.fetch = fetch$1; - global$1.Headers = Headers; - global$1.Request = Request; - global$1.Response = Response; + if (!global$k.fetch) { + global$k.fetch = fetch$1; + global$k.Headers = Headers; + global$k.Request = Request; + global$k.Response = Response; } - var lib = createCommonjsModule(function (module, exports) { - Object.defineProperty(exports, "__esModule", { value: true }); - - + var $$T = _export; + var DESCRIPTORS$9 = descriptors; + var defineProperty$5 = objectDefineProperty.f; + // `Object.defineProperty` method + // https://tc39.es/ecma262/#sec-object.defineproperty + // eslint-disable-next-line es/no-object-defineproperty -- safe + $$T({ target: 'Object', stat: true, forced: Object.defineProperty !== defineProperty$5, sham: !DESCRIPTORS$9 }, { + defineProperty: defineProperty$5 + }); + var $$S = _export; + var setPrototypeOf = objectSetPrototypeOf; + // `Object.setPrototypeOf` method + // https://tc39.es/ecma262/#sec-object.setprototypeof + $$S({ target: 'Object', stat: true }, { + setPrototypeOf: setPrototypeOf + }); + var $$R = _export; + var fails$n = fails$V; + var toObject$8 = toObject$i; + var nativeGetPrototypeOf = objectGetPrototypeOf; + var CORRECT_PROTOTYPE_GETTER = correctPrototypeGetter; + var FAILS_ON_PRIMITIVES$4 = fails$n(function () { nativeGetPrototypeOf(1); }); + // `Object.getPrototypeOf` method + // https://tc39.es/ecma262/#sec-object.getprototypeof + $$R({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES$4, sham: !CORRECT_PROTOTYPE_GETTER }, { + getPrototypeOf: function getPrototypeOf(it) { + return nativeGetPrototypeOf(toObject$8(it)); + } + }); + var global$j = global$1o; + var uncurryThis$m = functionUncurryThis; + var aCallable$2 = aCallable$a; + var isObject$b = isObject$s; + var hasOwn$5 = hasOwnProperty_1; + var arraySlice$2 = arraySlice$b; + var NATIVE_BIND = functionBindNative; + + var Function$1 = global$j.Function; + var concat$1 = uncurryThis$m([].concat); + var join$3 = uncurryThis$m([].join); + var factories = {}; + + var construct = function (C, argsLength, args) { + if (!hasOwn$5(factories, argsLength)) { + for (var list = [], i = 0; i < argsLength; i++) list[i] = 'a[' + i + ']'; + factories[argsLength] = Function$1('C,a', 'return new C(' + join$3(list, ',') + ')'); + } return factories[argsLength](C, args); + }; + + // `Function.prototype.bind` method implementation + // https://tc39.es/ecma262/#sec-function.prototype.bind + var functionBind = NATIVE_BIND ? Function$1.bind : function bind(that /* , ...args */) { + var F = aCallable$2(this); + var Prototype = F.prototype; + var partArgs = arraySlice$2(arguments, 1); + var boundFunction = function bound(/* args... */) { + var args = concat$1(partArgs, arraySlice$2(arguments)); + return this instanceof boundFunction ? construct(F, args.length, args) : F.apply(that, args); + }; + if (isObject$b(Prototype)) boundFunction.prototype = Prototype; + return boundFunction; + }; + + var $$Q = _export; + var getBuiltIn$1 = getBuiltIn$b; + var apply = functionApply; + var bind$7 = functionBind; + var aConstructor = aConstructor$3; + var anObject$4 = anObject$n; + var isObject$a = isObject$s; + var create$4 = objectCreate; + var fails$m = fails$V; + + var nativeConstruct = getBuiltIn$1('Reflect', 'construct'); + var ObjectPrototype = Object.prototype; + var push$4 = [].push; + + // `Reflect.construct` method + // https://tc39.es/ecma262/#sec-reflect.construct + // MS Edge supports only 2 arguments and argumentsList argument is optional + // FF Nightly sets third argument as `new.target`, but does not create `this` from it + var NEW_TARGET_BUG = fails$m(function () { + function F() { /* empty */ } + return !(nativeConstruct(function () { /* empty */ }, [], F) instanceof F); + }); - if (!window.Set) { - window.Set = es6Set; - } - if (!window.Map) { - window.Map = es6Map; - } - if (!window.Promise) { - window.Promise = polyfill$e; - window.Promise._immediateFn = setAsap; - } - if (!Array.prototype.find) { - array_prototype_find.shim(); - } - if (!Array.prototype.findIndex) { - array_prototype_findindex.shim(); - } - if (!Array.from) { - array_from.shim(); - } - if (!Object.values) { - object_values.shim(); - } - if (!Object.assign) { - object_assign.shim(); - } - if (!window.requestAnimationFrame || !window.cancelAnimationFrame) { - window.requestAnimationFrame = raf_1; - window.cancelAnimationFrame = raf_1.cancel; - } + var ARGS_BUG = !fails$m(function () { + nativeConstruct(function () { /* empty */ }); + }); - var finalFetch = window.fetch; - var finalPromise = window.Promise; - window.fetch = function (input, init) { - try { - return finalFetch(input, init); - } - catch (error) { - return new finalPromise(function (_, reject) { return reject(error); }); + var FORCED$c = NEW_TARGET_BUG || ARGS_BUG; + + $$Q({ target: 'Reflect', stat: true, forced: FORCED$c, sham: FORCED$c }, { + construct: function construct(Target, args /* , newTarget */) { + aConstructor(Target); + anObject$4(args); + var newTarget = arguments.length < 3 ? Target : aConstructor(arguments[2]); + if (ARGS_BUG && !NEW_TARGET_BUG) return nativeConstruct(Target, args, newTarget); + if (Target == newTarget) { + // w/o altered newTarget, optimization for 0-4 arguments + switch (args.length) { + case 0: return new Target(); + case 1: return new Target(args[0]); + case 2: return new Target(args[0], args[1]); + case 3: return new Target(args[0], args[1], args[2]); + case 4: return new Target(args[0], args[1], args[2], args[3]); + } + // w/o altered newTarget, lot of arguments case + var $args = [null]; + apply(push$4, $args, args); + return new (apply(bind$7, Target, $args))(); } - }; + // with altered newTarget, not support built-in constructors + var proto = newTarget.prototype; + var instance = create$4(isObject$a(proto) ? proto : ObjectPrototype); + var result = apply(Target, instance, args); + return isObject$a(result) ? result : instance; + } }); - var $Math$2 = GetIntrinsic('%Math%'); + var hasOwn$4 = hasOwnProperty_1; - var $floor$1 = $Math$2.floor; - var $abs$1 = $Math$2.abs; + var isDataDescriptor$1 = function (descriptor) { + return descriptor !== undefined && (hasOwn$4(descriptor, 'value') || hasOwn$4(descriptor, 'writable')); + }; + var $$P = _export; + var call$5 = functionCall; + var isObject$9 = isObject$s; + var anObject$3 = anObject$n; + var isDataDescriptor = isDataDescriptor$1; + var getOwnPropertyDescriptorModule = objectGetOwnPropertyDescriptor; + var getPrototypeOf = objectGetPrototypeOf; + // `Reflect.get` method + // https://tc39.es/ecma262/#sec-reflect.get + function get$3(target, propertyKey /* , receiver */) { + var receiver = arguments.length < 3 ? target : arguments[2]; + var descriptor, prototype; + if (anObject$3(target) === receiver) return target[propertyKey]; + descriptor = getOwnPropertyDescriptorModule.f(target, propertyKey); + if (descriptor) return isDataDescriptor(descriptor) + ? descriptor.value + : descriptor.get === undefined ? undefined : call$5(descriptor.get, receiver); + if (isObject$9(prototype = getPrototypeOf(target))) return get$3(prototype, propertyKey, receiver); + } + $$P({ target: 'Reflect', stat: true }, { + get: get$3 + }); - // https://www.ecma-international.org/ecma-262/6.0/#sec-isinteger + var $$O = _export; + var fails$l = fails$V; + var toIndexedObject$1 = toIndexedObject$d; + var nativeGetOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f; + var DESCRIPTORS$8 = descriptors; - var IsInteger = function IsInteger(argument) { - if (typeof argument !== 'number' || _isNaN(argument) || !_isFinite(argument)) { - return false; - } - var abs = $abs$1(argument); - return $floor$1(abs) === abs; - }; + var FAILS_ON_PRIMITIVES$3 = fails$l(function () { nativeGetOwnPropertyDescriptor(1); }); + var FORCED$b = !DESCRIPTORS$8 || FAILS_ON_PRIMITIVES$3; - var ArrayPush = callBound('Array.prototype.push'); - var StringFromCharCodeSpread = callBind.apply(String.fromCharCode, null); - - var implementation$8 = function fromCodePoint(_ /* fromCodePoint.length is 1 */) { - var arguments$1 = arguments; - - var MAX_SIZE = 0x4000; - var codeUnits = []; - var highSurrogate; - var lowSurrogate; - var index = -1; - var length = arguments.length; - if (!length) { - return ''; - } - var result = ''; - while (++index < length) { - var codePoint = ToNumber$1(arguments$1[index]); - if ( - !IsInteger(codePoint) || - codePoint < 0 || codePoint > 0x10FFFF // not a valid Unicode code point - ) { - throw RangeError('Invalid code point: ' + codePoint); - } - if (codePoint <= 0xFFFF) { // BMP code point - ArrayPush(codeUnits, codePoint); - } else { // Astral code point; split in surrogate halves - // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae - codePoint -= 0x10000; - highSurrogate = (codePoint >> 10) + 0xD800; - lowSurrogate = (codePoint % 0x400) + 0xDC00; - ArrayPush(codeUnits, highSurrogate, lowSurrogate); - } - if (index + 1 == length || codeUnits.length > MAX_SIZE) { - result += StringFromCharCodeSpread(codeUnits); - codeUnits.length = 0; - } - } - return result; - }; + // `Object.getOwnPropertyDescriptor` method + // https://tc39.es/ecma262/#sec-object.getownpropertydescriptor + $$O({ target: 'Object', stat: true, forced: FORCED$b, sham: !DESCRIPTORS$8 }, { + getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) { + return nativeGetOwnPropertyDescriptor(toIndexedObject$1(it), key); + } + }); - var polyfill$g = function getPolyfill() { - return String.fromCodePoint || implementation$8; - }; + var $$N = _export; + var global$i = global$1o; + var toAbsoluteIndex$1 = toAbsoluteIndex$9; + var toIntegerOrInfinity$2 = toIntegerOrInfinity$b; + var lengthOfArrayLike$5 = lengthOfArrayLike$i; + var toObject$7 = toObject$i; + var arraySpeciesCreate$2 = arraySpeciesCreate$4; + var createProperty$2 = createProperty$5; + var arrayMethodHasSpeciesSupport$2 = arrayMethodHasSpeciesSupport$5; + + var HAS_SPECIES_SUPPORT$1 = arrayMethodHasSpeciesSupport$2('splice'); + + var TypeError$6 = global$i.TypeError; + var max$1 = Math.max; + var min$3 = Math.min; + var MAX_SAFE_INTEGER$1 = 0x1FFFFFFFFFFFFF; + var MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded'; + + // `Array.prototype.splice` method + // https://tc39.es/ecma262/#sec-array.prototype.splice + // with adding support of @@species + $$N({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$1 }, { + splice: function splice(start, deleteCount /* , ...items */) { + var O = toObject$7(this); + var len = lengthOfArrayLike$5(O); + var actualStart = toAbsoluteIndex$1(start, len); + var argumentsLength = arguments.length; + var insertCount, actualDeleteCount, A, k, from, to; + if (argumentsLength === 0) { + insertCount = actualDeleteCount = 0; + } else if (argumentsLength === 1) { + insertCount = 0; + actualDeleteCount = len - actualStart; + } else { + insertCount = argumentsLength - 2; + actualDeleteCount = min$3(max$1(toIntegerOrInfinity$2(deleteCount), 0), len - actualStart); + } + if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER$1) { + throw TypeError$6(MAXIMUM_ALLOWED_LENGTH_EXCEEDED); + } + A = arraySpeciesCreate$2(O, actualDeleteCount); + for (k = 0; k < actualDeleteCount; k++) { + from = actualStart + k; + if (from in O) createProperty$2(A, k, O[from]); + } + A.length = actualDeleteCount; + if (insertCount < actualDeleteCount) { + for (k = actualStart; k < len - actualDeleteCount; k++) { + from = k + actualDeleteCount; + to = k + insertCount; + if (from in O) O[to] = O[from]; + else delete O[to]; + } + for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1]; + } else if (insertCount > actualDeleteCount) { + for (k = len - actualDeleteCount; k > actualStart; k--) { + from = k + actualDeleteCount - 1; + to = k + insertCount - 1; + if (from in O) O[to] = O[from]; + else delete O[to]; + } + } + for (k = 0; k < insertCount; k++) { + O[k + actualStart] = arguments[k + 2]; + } + O.length = len - actualDeleteCount + insertCount; + return A; + } + }); - var shim$d = function shimFromCodePoint() { - var polyfill = polyfill$g(); + var defineWellKnownSymbol$1 = defineWellKnownSymbol$4; - if (String.fromCodePoint !== polyfill) { - defineProperties_1(String, { fromCodePoint: polyfill }); - } + // `Symbol.toStringTag` well-known symbol + // https://tc39.es/ecma262/#sec-symbol.tostringtag + defineWellKnownSymbol$1('toStringTag'); - return polyfill; - }; + var global$h = global$1o; + var setToStringTag$3 = setToStringTag$a; + + // JSON[@@toStringTag] property + // https://tc39.es/ecma262/#sec-json-@@tostringtag + setToStringTag$3(global$h.JSON, 'JSON', true); - /*! https://mths.be/fromcodepoint v1.0.0 by @mathias */ + var setToStringTag$2 = setToStringTag$a; - shim$d(); + // Math[@@toStringTag] property + // https://tc39.es/ecma262/#sec-math-@@tostringtag + setToStringTag$2(Math, 'Math', true); (function (factory) { - factory(); - }((function () { + })(function () { + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); @@ -5549,14 +7450,14 @@ var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; - if ("value" in descriptor) { descriptor.writable = true; } + if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) { _defineProperties(Constructor.prototype, protoProps); } - if (staticProps) { _defineProperties(Constructor, staticProps); } + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } @@ -5572,7 +7473,7 @@ configurable: true } }); - if (superClass) { _setPrototypeOf(subClass, superClass); } + if (superClass) _setPrototypeOf(subClass, superClass); } function _getPrototypeOf(o) { @@ -5591,6 +7492,19 @@ return _setPrototypeOf(o, p); } + function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); @@ -5600,17 +7514,36 @@ } function _possibleConstructorReturn(self, call) { - if (call && (typeof call === "object" || typeof call === "function")) { + if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + function _createSuper(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct(); + + return function _createSuperInternal() { + var Super = _getPrototypeOf(Derived), + result; + + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf(this).constructor; + + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + + return _possibleConstructorReturn(this, result); + }; + } + function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); - if (object === null) { break; } + if (object === null) break; } return object; @@ -5623,7 +7556,7 @@ _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); - if (!base) { return; } + if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { @@ -5637,9 +7570,7 @@ return _get(target, property, receiver || target); } - var Emitter = - /*#__PURE__*/ - function () { + var Emitter = /*#__PURE__*/function () { function Emitter() { _classCallCheck(this, Emitter); @@ -5652,12 +7583,15 @@ _createClass(Emitter, [{ key: "addEventListener", - value: function addEventListener(type, callback) { + value: function addEventListener(type, callback, options) { if (!(type in this.listeners)) { this.listeners[type] = []; } - this.listeners[type].push(callback); + this.listeners[type].push({ + callback: callback, + options: options + }); } }, { key: "removeEventListener", @@ -5669,7 +7603,7 @@ var stack = this.listeners[type]; for (var i = 0, l = stack.length; i < l; i++) { - if (stack[i] === callback) { + if (stack[i].callback === callback) { stack.splice(i, 1); return; } @@ -5678,22 +7612,27 @@ }, { key: "dispatchEvent", value: function dispatchEvent(event) { - var _this = this; - if (!(event.type in this.listeners)) { return; } - var debounce = function debounce(callback) { - setTimeout(function () { - return callback.call(_this, event); - }); - }; - var stack = this.listeners[event.type]; + var stackToCall = stack.slice(); - for (var i = 0, l = stack.length; i < l; i++) { - debounce(stack[i]); + for (var i = 0, l = stackToCall.length; i < l; i++) { + var listener = stackToCall[i]; + + try { + listener.callback.call(this, event); + } catch (e) { + Promise.resolve().then(function () { + throw e; + }); + } + + if (listener.options && listener.options.once) { + this.removeEventListener(event.type, listener.callback); + } } return !event.defaultPrevented; @@ -5703,40 +7642,40 @@ return Emitter; }(); - var AbortSignal = - /*#__PURE__*/ - function (_Emitter) { + var AbortSignal = /*#__PURE__*/function (_Emitter) { _inherits(AbortSignal, _Emitter); + var _super = _createSuper(AbortSignal); + function AbortSignal() { - var _this2; + var _this; _classCallCheck(this, AbortSignal); - _this2 = _possibleConstructorReturn(this, _getPrototypeOf(AbortSignal).call(this)); // Some versions of babel does not transpile super() correctly for IE <= 10, if the parent + _this = _super.call(this); // Some versions of babel does not transpile super() correctly for IE <= 10, if the parent // constructor has failed to run, then "this.listeners" will still be undefined and then we call // the parent constructor directly instead as a workaround. For general details, see babel bug: // https://github.com/babel/babel/issues/3041 // This hack was added as a fix for the issue described here: // https://github.com/Financial-Times/polyfill-library/pull/59#issuecomment-477558042 - if (!_this2.listeners) { - Emitter.call(_assertThisInitialized(_this2)); + if (!_this.listeners) { + Emitter.call(_assertThisInitialized(_this)); } // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and // we want Object.keys(new AbortController().signal) to be [] for compat with the native impl - Object.defineProperty(_assertThisInitialized(_this2), 'aborted', { + Object.defineProperty(_assertThisInitialized(_this), 'aborted', { value: false, writable: true, configurable: true }); - Object.defineProperty(_assertThisInitialized(_this2), 'onabort', { + Object.defineProperty(_assertThisInitialized(_this), 'onabort', { value: null, writable: true, configurable: true }); - return _this2; + return _this; } _createClass(AbortSignal, [{ @@ -5761,14 +7700,13 @@ return AbortSignal; }(Emitter); - var AbortController = - /*#__PURE__*/ - function () { - function AbortController() { - _classCallCheck(this, AbortController); - // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and + var AbortController = /*#__PURE__*/function () { + function AbortController() { + _classCallCheck(this, AbortController); // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and // we want Object.keys(new AbortController()) to be [] for compat with the native impl + + Object.defineProperty(this, 'signal', { value: new AbortSignal(), writable: true, @@ -5838,7 +7776,6 @@ return typeof self.Request === 'function' && !self.Request.prototype.hasOwnProperty('signal') || !self.AbortController; } - /** * Note: the "fetch.Request" default value is available for fetch imported from * the "node-fetch" package and not in browsers. This is OK since browsers @@ -5853,6 +7790,7 @@ * @returns {fetch: abortableFetch, Request: AbortableRequest} */ + function abortableFetchDecorator(patchTargets) { if ('function' === typeof patchTargets) { patchTargets = { @@ -5979,7 +7917,6 @@ } (function (self) { - if (!polyfillNeeded(self)) { return; } @@ -6008,14 +7945,224 @@ value: AbortSignal }); })(typeof self !== 'undefined' ? self : commonjsGlobal); - - }))); + }); function actionAddEntity(way) { - return function(graph) { - return graph.replace(way); - }; - } + return function (graph) { + return graph.replace(way); + }; + } + + var $$M = _export; + var global$g = global$1o; + var fails$k = fails$V; + var isArray$3 = isArray$8; + var isObject$8 = isObject$s; + var toObject$6 = toObject$i; + var lengthOfArrayLike$4 = lengthOfArrayLike$i; + var createProperty$1 = createProperty$5; + var arraySpeciesCreate$1 = arraySpeciesCreate$4; + var arrayMethodHasSpeciesSupport$1 = arrayMethodHasSpeciesSupport$5; + var wellKnownSymbol$2 = wellKnownSymbol$t; + var V8_VERSION = engineV8Version; + + var IS_CONCAT_SPREADABLE = wellKnownSymbol$2('isConcatSpreadable'); + var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; + var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded'; + var TypeError$5 = global$g.TypeError; + + // We can't use this feature detection in V8 since it causes + // deoptimization and serious performance degradation + // https://github.com/zloirock/core-js/issues/679 + var IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails$k(function () { + var array = []; + array[IS_CONCAT_SPREADABLE] = false; + return array.concat()[0] !== array; + }); + + var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport$1('concat'); + + var isConcatSpreadable = function (O) { + if (!isObject$8(O)) return false; + var spreadable = O[IS_CONCAT_SPREADABLE]; + return spreadable !== undefined ? !!spreadable : isArray$3(O); + }; + + var FORCED$a = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT; + + // `Array.prototype.concat` method + // https://tc39.es/ecma262/#sec-array.prototype.concat + // with adding support of @@isConcatSpreadable and @@species + $$M({ target: 'Array', proto: true, forced: FORCED$a }, { + // eslint-disable-next-line no-unused-vars -- required for `.length` + concat: function concat(arg) { + var O = toObject$6(this); + var A = arraySpeciesCreate$1(O, 0); + var n = 0; + var i, k, length, len, E; + for (i = -1, length = arguments.length; i < length; i++) { + E = i === -1 ? O : arguments[i]; + if (isConcatSpreadable(E)) { + len = lengthOfArrayLike$4(E); + if (n + len > MAX_SAFE_INTEGER) throw TypeError$5(MAXIMUM_ALLOWED_INDEX_EXCEEDED); + for (k = 0; k < len; k++, n++) if (k in E) createProperty$1(A, n, E[k]); + } else { + if (n >= MAX_SAFE_INTEGER) throw TypeError$5(MAXIMUM_ALLOWED_INDEX_EXCEEDED); + createProperty$1(A, n++, E); + } + } + A.length = n; + return A; + } + }); + + var DESCRIPTORS$7 = descriptors; + var uncurryThis$l = functionUncurryThis; + var call$4 = functionCall; + var fails$j = fails$V; + var objectKeys$1 = objectKeys$4; + var getOwnPropertySymbolsModule = objectGetOwnPropertySymbols; + var propertyIsEnumerableModule = objectPropertyIsEnumerable; + var toObject$5 = toObject$i; + var IndexedObject = indexedObject; + + // eslint-disable-next-line es/no-object-assign -- safe + var $assign = Object.assign; + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + var defineProperty$4 = Object.defineProperty; + var concat = uncurryThis$l([].concat); + + // `Object.assign` method + // https://tc39.es/ecma262/#sec-object.assign + var objectAssign = !$assign || fails$j(function () { + // should have correct order of operations (Edge bug) + if (DESCRIPTORS$7 && $assign({ b: 1 }, $assign(defineProperty$4({}, 'a', { + enumerable: true, + get: function () { + defineProperty$4(this, 'b', { + value: 3, + enumerable: false + }); + } + }), { b: 2 })).b !== 1) return true; + // should work with symbols and should have deterministic property order (V8 bug) + var A = {}; + var B = {}; + // eslint-disable-next-line es/no-symbol -- safe + var symbol = Symbol(); + var alphabet = 'abcdefghijklmnopqrst'; + A[symbol] = 7; + alphabet.split('').forEach(function (chr) { B[chr] = chr; }); + return $assign({}, A)[symbol] != 7 || objectKeys$1($assign({}, B)).join('') != alphabet; + }) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length` + var T = toObject$5(target); + var argumentsLength = arguments.length; + var index = 1; + var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; + var propertyIsEnumerable = propertyIsEnumerableModule.f; + while (argumentsLength > index) { + var S = IndexedObject(arguments[index++]); + var keys = getOwnPropertySymbols ? concat(objectKeys$1(S), getOwnPropertySymbols(S)) : objectKeys$1(S); + var length = keys.length; + var j = 0; + var key; + while (length > j) { + key = keys[j++]; + if (!DESCRIPTORS$7 || call$4(propertyIsEnumerable, S, key)) T[key] = S[key]; + } + } return T; + } : $assign; + + var $$L = _export; + var assign$2 = objectAssign; + + // `Object.assign` method + // https://tc39.es/ecma262/#sec-object.assign + // eslint-disable-next-line es/no-object-assign -- required for testing + $$L({ target: 'Object', stat: true, forced: Object.assign !== assign$2 }, { + assign: assign$2 + }); + + var $$K = _export; + var $filter = arrayIteration.filter; + var arrayMethodHasSpeciesSupport = arrayMethodHasSpeciesSupport$5; + + var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter'); + + // `Array.prototype.filter` method + // https://tc39.es/ecma262/#sec-array.prototype.filter + // with adding support of @@species + $$K({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, { + filter: function filter(callbackfn /* , thisArg */) { + return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } + }); + + var $$J = _export; + var toObject$4 = toObject$i; + var nativeKeys = objectKeys$4; + var fails$i = fails$V; + + var FAILS_ON_PRIMITIVES$2 = fails$i(function () { nativeKeys(1); }); + + // `Object.keys` method + // https://tc39.es/ecma262/#sec-object.keys + $$J({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES$2 }, { + keys: function keys(it) { + return nativeKeys(toObject$4(it)); + } + }); + + var $$I = _export; + var uncurryThis$k = functionUncurryThis; + var isArray$2 = isArray$8; + + var un$Reverse = uncurryThis$k([].reverse); + var test$1 = [1, 2]; + + // `Array.prototype.reverse` method + // https://tc39.es/ecma262/#sec-array.prototype.reverse + // fix for Safari 12.0 bug + // https://bugs.webkit.org/show_bug.cgi?id=188794 + $$I({ target: 'Array', proto: true, forced: String(test$1) === String(test$1.reverse()) }, { + reverse: function reverse() { + // eslint-disable-next-line no-self-assign -- dirty hack + if (isArray$2(this)) this.length = this.length; + return un$Reverse(this); + } + }); + + var global$f = global$1o; + var fails$h = fails$V; + var uncurryThis$j = functionUncurryThis; + var toString$c = toString$k; + var trim$4 = stringTrim.trim; + var whitespaces$1 = whitespaces$4; + + var charAt$2 = uncurryThis$j(''.charAt); + var n$ParseFloat = global$f.parseFloat; + var Symbol$2 = global$f.Symbol; + var ITERATOR$1 = Symbol$2 && Symbol$2.iterator; + var FORCED$9 = 1 / n$ParseFloat(whitespaces$1 + '-0') !== -Infinity + // MS Edge 18- broken with boxed symbols + || (ITERATOR$1 && !fails$h(function () { n$ParseFloat(Object(ITERATOR$1)); })); + + // `parseFloat` method + // https://tc39.es/ecma262/#sec-parsefloat-string + var numberParseFloat = FORCED$9 ? function parseFloat(string) { + var trimmedString = trim$4(toString$c(string)); + var result = n$ParseFloat(trimmedString); + return result === 0 && charAt$2(trimmedString, 0) == '-' ? -0 : result; + } : n$ParseFloat; + + var $$H = _export; + var $parseFloat = numberParseFloat; + + // `parseFloat` method + // https://tc39.es/ecma262/#sec-parsefloat-string + $$H({ global: true, forced: parseFloat != $parseFloat }, { + parseFloat: $parseFloat + }); /* Order the nodes of a way in reverse order and reverse any direction dependent tags @@ -6037,2098 +8184,2586 @@ http://wiki.openstreetmap.org/wiki/Key:traffic_sign#On_a_way_or_area */ function actionReverse(entityID, options) { - var ignoreKey = /^.*(_|:)?(description|name|note|website|ref|source|comment|watch|attribution)(_|:)?/; - var numeric = /^([+\-]?)(?=[\d.])/; - var directionKey = /direction$/; - var turn_lanes = /^turn:lanes:?/; - var keyReplacements = [ - [/:right$/, ':left'], - [/:left$/, ':right'], - [/:forward$/, ':backward'], - [/:backward$/, ':forward'], - [/:right:/, ':left:'], - [/:left:/, ':right:'], - [/:forward:/, ':backward:'], - [/:backward:/, ':forward:'] - ]; - var valueReplacements = { - left: 'right', - right: 'left', - up: 'down', - down: 'up', - forward: 'backward', - backward: 'forward', - forwards: 'backward', - backwards: 'forward', - }; - var roleReplacements = { - forward: 'backward', - backward: 'forward', - forwards: 'backward', - backwards: 'forward' - }; - var onewayReplacements = { - yes: '-1', - '1': '-1', - '-1': 'yes' - }; + var ignoreKey = /^.*(_|:)?(description|name|note|website|ref|source|comment|watch|attribution)(_|:)?/; + var numeric = /^([+\-]?)(?=[\d.])/; + var directionKey = /direction$/; + var turn_lanes = /^turn:lanes:?/; + var keyReplacements = [[/:right$/, ':left'], [/:left$/, ':right'], [/:forward$/, ':backward'], [/:backward$/, ':forward'], [/:right:/, ':left:'], [/:left:/, ':right:'], [/:forward:/, ':backward:'], [/:backward:/, ':forward:']]; + var valueReplacements = { + left: 'right', + right: 'left', + up: 'down', + down: 'up', + forward: 'backward', + backward: 'forward', + forwards: 'backward', + backwards: 'forward' + }; + var roleReplacements = { + forward: 'backward', + backward: 'forward', + forwards: 'backward', + backwards: 'forward' + }; + var onewayReplacements = { + yes: '-1', + '1': '-1', + '-1': 'yes' + }; + var compassReplacements = { + N: 'S', + NNE: 'SSW', + NE: 'SW', + ENE: 'WSW', + E: 'W', + ESE: 'WNW', + SE: 'NW', + SSE: 'NNW', + S: 'N', + SSW: 'NNE', + SW: 'NE', + WSW: 'ENE', + W: 'E', + WNW: 'ESE', + NW: 'SE', + NNW: 'SSE' + }; + + function reverseKey(key) { + for (var i = 0; i < keyReplacements.length; ++i) { + var replacement = keyReplacements[i]; + + if (replacement[0].test(key)) { + return key.replace(replacement[0], replacement[1]); + } + } - var compassReplacements = { - N: 'S', - NNE: 'SSW', - NE: 'SW', - ENE: 'WSW', - E: 'W', - ESE: 'WNW', - SE: 'NW', - SSE: 'NNW', - S: 'N', - SSW: 'NNE', - SW: 'NE', - WSW: 'ENE', - W: 'E', - WNW: 'ESE', - NW: 'SE', - NNW: 'SSE' - }; + return key; + } + function reverseValue(key, value, includeAbsolute) { + if (ignoreKey.test(key)) return value; // Turn lanes are left/right to key (not way) direction - #5674 - function reverseKey(key) { - for (var i = 0; i < keyReplacements.length; ++i) { - var replacement = keyReplacements[i]; - if (replacement[0].test(key)) { - return key.replace(replacement[0], replacement[1]); - } + if (turn_lanes.test(key)) { + return value; + } else if (key === 'incline' && numeric.test(value)) { + return value.replace(numeric, function (_, sign) { + return sign === '-' ? '' : '-'; + }); + } else if (options && options.reverseOneway && key === 'oneway') { + return onewayReplacements[value] || value; + } else if (includeAbsolute && directionKey.test(key)) { + if (compassReplacements[value]) return compassReplacements[value]; + var degrees = parseFloat(value); + + if (typeof degrees === 'number' && !isNaN(degrees)) { + if (degrees < 180) { + degrees += 180; + } else { + degrees -= 180; } - return key; - } - - - function reverseValue(key, value, includeAbsolute) { - if (ignoreKey.test(key)) { return value; } - // Turn lanes are left/right to key (not way) direction - #5674 - if (turn_lanes.test(key)) { - return value; + return degrees.toString(); + } + } - } else if (key === 'incline' && numeric.test(value)) { - return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; }); + return valueReplacements[value] || value; + } // Reverse the direction of tags attached to the nodes - #3076 - } else if (options && options.reverseOneway && key === 'oneway') { - return onewayReplacements[value] || value; - } else if (includeAbsolute && directionKey.test(key)) { - if (compassReplacements[value]) { return compassReplacements[value]; } + function reverseNodeTags(graph, nodeIDs) { + for (var i = 0; i < nodeIDs.length; i++) { + var node = graph.hasEntity(nodeIDs[i]); + if (!node || !Object.keys(node.tags).length) continue; + var tags = {}; - var degrees = parseFloat(value); - if (typeof degrees === 'number' && !isNaN(degrees)) { - if (degrees < 180) { - degrees += 180; - } else { - degrees -= 180; - } - return degrees.toString(); - } - } + for (var key in node.tags) { + tags[reverseKey(key)] = reverseValue(key, node.tags[key], node.id === entityID); + } - return valueReplacements[value] || value; + graph = graph.replace(node.update({ + tags: tags + })); } + return graph; + } - // Reverse the direction of tags attached to the nodes - #3076 - function reverseNodeTags(graph, nodeIDs) { - for (var i = 0; i < nodeIDs.length; i++) { - var node = graph.hasEntity(nodeIDs[i]); - if (!node || !Object.keys(node.tags).length) { continue; } + function reverseWay(graph, way) { + var nodes = way.nodes.slice().reverse(); + var tags = {}; + var role; - var tags = {}; - for (var key in node.tags) { - tags[reverseKey(key)] = reverseValue(key, node.tags[key], node.id === entityID); - } - graph = graph.replace(node.update({tags: tags})); - } - return graph; + for (var key in way.tags) { + tags[reverseKey(key)] = reverseValue(key, way.tags[key]); } - - function reverseWay(graph, way) { - var nodes = way.nodes.slice().reverse(); - var tags = {}; - var role; - - for (var key in way.tags) { - tags[reverseKey(key)] = reverseValue(key, way.tags[key]); + graph.parentRelations(way).forEach(function (relation) { + relation.members.forEach(function (member, index) { + if (member.id === way.id && (role = roleReplacements[member.role])) { + relation = relation.updateMember({ + role: role + }, index); + graph = graph.replace(relation); } + }); + }); // Reverse any associated directions on nodes on the way and then replace + // the way itself with the reversed node ids and updated way tags - graph.parentRelations(way).forEach(function(relation) { - relation.members.forEach(function(member, index) { - if (member.id === way.id && (role = roleReplacements[member.role])) { - relation = relation.updateMember({role: role}, index); - graph = graph.replace(relation); - } - }); - }); + return reverseNodeTags(graph, nodes).replace(way.update({ + nodes: nodes, + tags: tags + })); + } + + var action = function action(graph) { + var entity = graph.entity(entityID); - // Reverse any associated directions on nodes on the way and then replace - // the way itself with the reversed node ids and updated way tags - return reverseNodeTags(graph, nodes) - .replace(way.update({nodes: nodes, tags: tags})); + if (entity.type === 'way') { + return reverseWay(graph, entity); } + return reverseNodeTags(graph, [entityID]); + }; - var action = function(graph) { - var entity = graph.entity(entityID); - if (entity.type === 'way') { - return reverseWay(graph, entity); - } - return reverseNodeTags(graph, [entityID]); - }; + action.disabled = function (graph) { + var entity = graph.hasEntity(entityID); + if (!entity || entity.type === 'way') return false; - action.disabled = function(graph) { - var entity = graph.hasEntity(entityID); - if (!entity || entity.type === 'way') { return false; } + for (var key in entity.tags) { + var value = entity.tags[key]; - for (var key in entity.tags) { - var value = entity.tags[key]; - if (reverseKey(key) !== key || reverseValue(key, value, true) !== value) { - return false; - } - } - return 'nondirectional_node'; - }; + if (reverseKey(key) !== key || reverseValue(key, value, true) !== value) { + return false; + } + } - action.entityID = function() { - return entityID; - }; + return 'nondirectional_node'; + }; - return action; + action.entityID = function () { + return entityID; + }; + + return action; } function osmIsInterestingTag(key) { - return key !== 'attribution' && - key !== 'created_by' && - key !== 'source' && - key !== 'odbl' && - key.indexOf('source:') !== 0 && - key.indexOf('source_ref') !== 0 && // purposely exclude colon - key.indexOf('tiger:') !== 0; + return key !== 'attribution' && key !== 'created_by' && key !== 'source' && key !== 'odbl' && key.indexOf('source:') !== 0 && key.indexOf('source_ref') !== 0 && // purposely exclude colon + key.indexOf('tiger:') !== 0; } - var osmAreaKeys = {}; function osmSetAreaKeys(value) { - osmAreaKeys = value; - } + osmAreaKeys = value; + } // returns an object with the tag from `tags` that implies an area geometry, if any - // returns an object with the tag from `tags` that implies an area geometry, if any function osmTagSuggestingArea(tags) { - if (tags.area === 'yes') { return { area: 'yes' }; } - if (tags.area === 'no') { return null; } - - // `highway` and `railway` are typically linear features, but there - // are a few exceptions that should be treated as areas, even in the - // absence of a proper `area=yes` or `areaKeys` tag.. see #4194 - var lineKeys = { - highway: { - rest_area: true, - services: true - }, - railway: { - roundhouse: true, - station: true, - traverser: true, - turntable: true, - wash: true - } - }; - var returnTags = {}; - for (var key in tags) { - if (key in osmAreaKeys && !(tags[key] in osmAreaKeys[key])) { - returnTags[key] = tags[key]; - return returnTags; - } - if (key in lineKeys && tags[key] in lineKeys[key]) { - returnTags[key] = tags[key]; - return returnTags; - } + if (tags.area === 'yes') return { + area: 'yes' + }; + if (tags.area === 'no') return null; // `highway` and `railway` are typically linear features, but there + // are a few exceptions that should be treated as areas, even in the + // absence of a proper `area=yes` or `areaKeys` tag.. see #4194 + + var lineKeys = { + highway: { + rest_area: true, + services: true + }, + railway: { + roundhouse: true, + station: true, + traverser: true, + turntable: true, + wash: true } - return null; - } + }; + var returnTags = {}; + + for (var key in tags) { + if (key in osmAreaKeys && !(tags[key] in osmAreaKeys[key])) { + returnTags[key] = tags[key]; + return returnTags; + } + + if (key in lineKeys && tags[key] in lineKeys[key]) { + returnTags[key] = tags[key]; + return returnTags; + } + } - // Tags that indicate a node can be a standalone point + return null; + } // Tags that indicate a node can be a standalone point // e.g. { amenity: { bar: true, parking: true, ... } ... } + var osmPointTags = {}; function osmSetPointTags(value) { - osmPointTags = value; - } - // Tags that indicate a node can be part of a way + osmPointTags = value; + } // Tags that indicate a node can be part of a way // e.g. { amenity: { parking: true, ... }, highway: { stop: true ... } ... } + var osmVertexTags = {}; function osmSetVertexTags(value) { - osmVertexTags = value; + osmVertexTags = value; } - function osmNodeGeometriesForTags(nodeTags) { - var geometries = {}; - for (var key in nodeTags) { - if (osmPointTags[key] && - (osmPointTags[key]['*'] || osmPointTags[key][nodeTags[key]])) { - geometries.point = true; - } - if (osmVertexTags[key] && - (osmVertexTags[key]['*'] || osmVertexTags[key][nodeTags[key]])) { - geometries.vertex = true; - } - // break early if both are already supported - if (geometries.point && geometries.vertex) { break; } + var geometries = {}; + + for (var key in nodeTags) { + if (osmPointTags[key] && (osmPointTags[key]['*'] || osmPointTags[key][nodeTags[key]])) { + geometries.point = true; } - return geometries; - } + if (osmVertexTags[key] && (osmVertexTags[key]['*'] || osmVertexTags[key][nodeTags[key]])) { + geometries.vertex = true; + } // break early if both are already supported + + + if (geometries.point && geometries.vertex) break; + } + + return geometries; + } var osmOneWayTags = { - 'aerialway': { - 'chair_lift': true, - 'drag_lift': true, - 'j-bar': true, - 'magic_carpet': true, - 'mixed_lift': true, - 'platter': true, - 'rope_tow': true, - 't-bar': true, - 'zip_line': true - }, - 'highway': { - 'motorway': true - }, - 'junction': { - 'circular': true, - 'roundabout': true - }, - 'man_made': { - 'goods_conveyor': true, - 'piste:halfpipe': true - }, - 'piste:type': { - 'downhill': true, - 'sled': true, - 'yes': true - }, - 'waterway': { - 'canal': true, - 'ditch': true, - 'drain': true, - 'fish_pass': true, - 'river': true, - 'stream': true, - 'tidal_channel': true - } - }; + 'aerialway': { + 'chair_lift': true, + 'drag_lift': true, + 'j-bar': true, + 'magic_carpet': true, + 'mixed_lift': true, + 'platter': true, + 'rope_tow': true, + 't-bar': true, + 'zip_line': true + }, + 'highway': { + 'motorway': true + }, + 'junction': { + 'circular': true, + 'roundabout': true + }, + 'man_made': { + 'goods_conveyor': true, + 'piste:halfpipe': true + }, + 'piste:type': { + 'downhill': true, + 'sled': true, + 'yes': true + }, + 'seamark:type': { + 'separation_lane': true, + 'separation_roundabout': true + }, + 'waterway': { + 'canal': true, + 'ditch': true, + 'drain': true, + 'fish_pass': true, + 'river': true, + 'stream': true, + 'tidal_channel': true + } + }; // solid and smooth surfaces akin to the assumed default road surface in OSM - // solid and smooth surfaces akin to the assumed default road surface in OSM var osmPavedTags = { - 'surface': { - 'paved': true, - 'asphalt': true, - 'concrete': true, - 'concrete:lanes': true, - 'concrete:plates': true - }, - 'tracktype': { - 'grade1': true - } - }; + 'surface': { + 'paved': true, + 'asphalt': true, + 'concrete': true, + 'concrete:lanes': true, + 'concrete:plates': true + }, + 'tracktype': { + 'grade1': true + } + }; // solid, if somewhat uncommon surfaces with a high range of smoothness - // solid, if somewhat uncommon surfaces with a high range of smoothness var osmSemipavedTags = { - 'surface': { - 'cobblestone': true, - 'cobblestone:flattened': true, - 'unhewn_cobblestone': true, - 'sett': true, - 'paving_stones': true, - 'metal': true, - 'wood': true - } + 'surface': { + 'cobblestone': true, + 'cobblestone:flattened': true, + 'unhewn_cobblestone': true, + 'sett': true, + 'paving_stones': true, + 'metal': true, + 'wood': true + } }; - var osmRightSideIsInsideTags = { - 'natural': { - 'cliff': true, - 'coastline': 'coastline', - }, - 'barrier': { - 'retaining_wall': true, - 'kerb': true, - 'guard_rail': true, - 'city_wall': true, - }, - 'man_made': { - 'embankment': true - }, - 'waterway': { - 'weir': true - } - }; - - // "highway" tag values for pedestrian or vehicle right-of-ways that make up the routable network + 'natural': { + 'cliff': true, + 'coastline': 'coastline' + }, + 'barrier': { + 'retaining_wall': true, + 'kerb': true, + 'guard_rail': true, + 'city_wall': true + }, + 'man_made': { + 'embankment': true + }, + 'waterway': { + 'weir': true + } + }; // "highway" tag values for pedestrian or vehicle right-of-ways that make up the routable network // (does not include `raceway`) + var osmRoutableHighwayTagValues = { - motorway: true, trunk: true, primary: true, secondary: true, tertiary: true, residential: true, - motorway_link: true, trunk_link: true, primary_link: true, secondary_link: true, tertiary_link: true, - unclassified: true, road: true, service: true, track: true, living_street: true, bus_guideway: true, - path: true, footway: true, cycleway: true, bridleway: true, pedestrian: true, corridor: true, steps: true - }; - // "highway" tag values that generally do not allow motor vehicles + motorway: true, + trunk: true, + primary: true, + secondary: true, + tertiary: true, + residential: true, + motorway_link: true, + trunk_link: true, + primary_link: true, + secondary_link: true, + tertiary_link: true, + unclassified: true, + road: true, + service: true, + track: true, + living_street: true, + bus_guideway: true, + path: true, + footway: true, + cycleway: true, + bridleway: true, + pedestrian: true, + corridor: true, + steps: true + }; // "highway" tag values that generally do not allow motor vehicles + var osmPathHighwayTagValues = { - path: true, footway: true, cycleway: true, bridleway: true, pedestrian: true, corridor: true, steps: true - }; + path: true, + footway: true, + cycleway: true, + bridleway: true, + pedestrian: true, + corridor: true, + steps: true + }; // "railway" tag values representing existing railroad tracks (purposely does not include 'abandoned') - // "railway" tag values representing existing railroad tracks (purposely does not include 'abandoned') var osmRailwayTrackTagValues = { - rail: true, light_rail: true, tram: true, subway: true, - monorail: true, funicular: true, miniature: true, narrow_gauge: true, - disused: true, preserved: true - }; + rail: true, + light_rail: true, + tram: true, + subway: true, + monorail: true, + funicular: true, + miniature: true, + narrow_gauge: true, + disused: true, + preserved: true + }; // "waterway" tag values for line features representing water flow - // "waterway" tag values for line features representing water flow var osmFlowingWaterwayTagValues = { - canal: true, ditch: true, drain: true, fish_pass: true, river: true, stream: true, tidal_channel: true - }; - - // Adds floating point numbers with twice the normal precision. - // Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and - // Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3) - // 305–363 (1997). - // Code adapted from GeographicLib by Charles F. F. Karney, - // http://geographiclib.sourceforge.net/ + canal: true, + ditch: true, + drain: true, + fish_pass: true, + river: true, + stream: true, + tidal_channel: true + }; + + var global$e = global$1o; + var fails$g = fails$V; + var uncurryThis$i = functionUncurryThis; + var toString$b = toString$k; + var trim$3 = stringTrim.trim; + var whitespaces = whitespaces$4; + + var $parseInt$1 = global$e.parseInt; + var Symbol$1 = global$e.Symbol; + var ITERATOR = Symbol$1 && Symbol$1.iterator; + var hex$2 = /^[+-]?0x/i; + var exec$3 = uncurryThis$i(hex$2.exec); + var FORCED$8 = $parseInt$1(whitespaces + '08') !== 8 || $parseInt$1(whitespaces + '0x16') !== 22 + // MS Edge 18- broken with boxed symbols + || (ITERATOR && !fails$g(function () { $parseInt$1(Object(ITERATOR)); })); + + // `parseInt` method + // https://tc39.es/ecma262/#sec-parseint-string-radix + var numberParseInt = FORCED$8 ? function parseInt(string, radix) { + var S = trim$3(toString$b(string)); + return $parseInt$1(S, (radix >>> 0) || (exec$3(hex$2, S) ? 16 : 10)); + } : $parseInt$1; + + var $$G = _export; + var $parseInt = numberParseInt; + + // `parseInt` method + // https://tc39.es/ecma262/#sec-parseint-string-radix + $$G({ global: true, forced: parseInt != $parseInt }, { + parseInt: $parseInt + }); - function adder() { - return new Adder; - } + var internalMetadata = {exports: {}}; - function Adder() { - this.reset(); - } + // FF26- bug: ArrayBuffers are non-extensible, but Object.isExtensible does not report it + var fails$f = fails$V; - Adder.prototype = { - constructor: Adder, - reset: function() { - this.s = // rounded value - this.t = 0; // exact error - }, - add: function(y) { - add(temp, y, this.t); - add(this, temp.s, this.s); - if (this.s) { this.t += temp.t; } - else { this.s = temp.t; } - }, - valueOf: function() { - return this.s; + var arrayBufferNonExtensible = fails$f(function () { + if (typeof ArrayBuffer == 'function') { + var buffer = new ArrayBuffer(8); + // eslint-disable-next-line es/no-object-isextensible, es/no-object-defineproperty -- safe + if (Object.isExtensible(buffer)) Object.defineProperty(buffer, 'a', { value: 8 }); } - }; + }); - var temp = new Adder; + var fails$e = fails$V; + var isObject$7 = isObject$s; + var classof = classofRaw$1; + var ARRAY_BUFFER_NON_EXTENSIBLE = arrayBufferNonExtensible; - function add(adder, a, b) { - var x = adder.s = a + b, - bv = x - a, - av = x - bv; - adder.t = (a - av) + (b - bv); - } + // eslint-disable-next-line es/no-object-isextensible -- safe + var $isExtensible = Object.isExtensible; + var FAILS_ON_PRIMITIVES$1 = fails$e(function () { $isExtensible(1); }); - var epsilon = 1e-6; - var epsilon2 = 1e-12; - var pi = Math.PI; - var halfPi = pi / 2; - var quarterPi = pi / 4; - var tau = pi * 2; + // `Object.isExtensible` method + // https://tc39.es/ecma262/#sec-object.isextensible + var objectIsExtensible = (FAILS_ON_PRIMITIVES$1 || ARRAY_BUFFER_NON_EXTENSIBLE) ? function isExtensible(it) { + if (!isObject$7(it)) return false; + if (ARRAY_BUFFER_NON_EXTENSIBLE && classof(it) == 'ArrayBuffer') return false; + return $isExtensible ? $isExtensible(it) : true; + } : $isExtensible; - var degrees = 180 / pi; - var radians = pi / 180; + var fails$d = fails$V; - var abs$2 = Math.abs; - var atan = Math.atan; - var atan2 = Math.atan2; - var cos = Math.cos; - var exp = Math.exp; - var log = Math.log; - var sin = Math.sin; - var sign$2 = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }; - var sqrt = Math.sqrt; - var tan = Math.tan; + var freezing = !fails$d(function () { + // eslint-disable-next-line es/no-object-isextensible, es/no-object-preventextensions -- required for testing + return Object.isExtensible(Object.preventExtensions({})); + }); - function acos(x) { - return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); - } + var $$F = _export; + var uncurryThis$h = functionUncurryThis; + var hiddenKeys = hiddenKeys$6; + var isObject$6 = isObject$s; + var hasOwn$3 = hasOwnProperty_1; + var defineProperty$3 = objectDefineProperty.f; + var getOwnPropertyNamesModule = objectGetOwnPropertyNames; + var getOwnPropertyNamesExternalModule = objectGetOwnPropertyNamesExternal; + var isExtensible = objectIsExtensible; + var uid = uid$5; + var FREEZING$1 = freezing; + + var REQUIRED = false; + var METADATA = uid('meta'); + var id$1 = 0; + + var setMetadata = function (it) { + defineProperty$3(it, METADATA, { value: { + objectID: 'O' + id$1++, // object ID + weakData: {} // weak collections IDs + } }); + }; + + var fastKey$1 = function (it, create) { + // return a primitive with prefix + if (!isObject$6(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; + if (!hasOwn$3(it, METADATA)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return 'F'; + // not necessary to add metadata + if (!create) return 'E'; + // add missing metadata + setMetadata(it); + // return object ID + } return it[METADATA].objectID; + }; + + var getWeakData = function (it, create) { + if (!hasOwn$3(it, METADATA)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return true; + // not necessary to add metadata + if (!create) return false; + // add missing metadata + setMetadata(it); + // return the store of weak collections IDs + } return it[METADATA].weakData; + }; + + // add metadata on freeze-family methods calling + var onFreeze$1 = function (it) { + if (FREEZING$1 && REQUIRED && isExtensible(it) && !hasOwn$3(it, METADATA)) setMetadata(it); + return it; + }; + + var enable = function () { + meta.enable = function () { /* empty */ }; + REQUIRED = true; + var getOwnPropertyNames = getOwnPropertyNamesModule.f; + var splice = uncurryThis$h([].splice); + var test = {}; + test[METADATA] = 1; + + // prevent exposing of metadata key + if (getOwnPropertyNames(test).length) { + getOwnPropertyNamesModule.f = function (it) { + var result = getOwnPropertyNames(it); + for (var i = 0, length = result.length; i < length; i++) { + if (result[i] === METADATA) { + splice(result, i, 1); + break; + } + } return result; + }; - function asin(x) { - return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x); - } + $$F({ target: 'Object', stat: true, forced: true }, { + getOwnPropertyNames: getOwnPropertyNamesExternalModule.f + }); + } + }; - function noop$2() {} + var meta = internalMetadata.exports = { + enable: enable, + fastKey: fastKey$1, + getWeakData: getWeakData, + onFreeze: onFreeze$1 + }; + + hiddenKeys[METADATA] = true; + + var $$E = _export; + var global$d = global$1o; + var uncurryThis$g = functionUncurryThis; + var isForced$2 = isForced_1; + var redefine$4 = redefine$h.exports; + var InternalMetadataModule = internalMetadata.exports; + var iterate$1 = iterate$3; + var anInstance$2 = anInstance$7; + var isCallable$1 = isCallable$r; + var isObject$5 = isObject$s; + var fails$c = fails$V; + var checkCorrectnessOfIteration$1 = checkCorrectnessOfIteration$4; + var setToStringTag$1 = setToStringTag$a; + var inheritIfRequired$2 = inheritIfRequired$4; + + var collection$2 = function (CONSTRUCTOR_NAME, wrapper, common) { + var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1; + var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1; + var ADDER = IS_MAP ? 'set' : 'add'; + var NativeConstructor = global$d[CONSTRUCTOR_NAME]; + var NativePrototype = NativeConstructor && NativeConstructor.prototype; + var Constructor = NativeConstructor; + var exported = {}; + + var fixMethod = function (KEY) { + var uncurriedNativeMethod = uncurryThis$g(NativePrototype[KEY]); + redefine$4(NativePrototype, KEY, + KEY == 'add' ? function add(value) { + uncurriedNativeMethod(this, value === 0 ? 0 : value); + return this; + } : KEY == 'delete' ? function (key) { + return IS_WEAK && !isObject$5(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key); + } : KEY == 'get' ? function get(key) { + return IS_WEAK && !isObject$5(key) ? undefined : uncurriedNativeMethod(this, key === 0 ? 0 : key); + } : KEY == 'has' ? function has(key) { + return IS_WEAK && !isObject$5(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key); + } : function set(key, value) { + uncurriedNativeMethod(this, key === 0 ? 0 : key, value); + return this; + } + ); + }; - function streamGeometry(geometry, stream) { - if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) { - streamGeometryType[geometry.type](geometry, stream); - } - } + var REPLACE = isForced$2( + CONSTRUCTOR_NAME, + !isCallable$1(NativeConstructor) || !(IS_WEAK || NativePrototype.forEach && !fails$c(function () { + new NativeConstructor().entries().next(); + })) + ); - var streamObjectType = { - Feature: function(object, stream) { - streamGeometry(object.geometry, stream); - }, - FeatureCollection: function(object, stream) { - var features = object.features, i = -1, n = features.length; - while (++i < n) { streamGeometry(features[i].geometry, stream); } - } - }; + if (REPLACE) { + // create collection constructor + Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER); + InternalMetadataModule.enable(); + } else if (isForced$2(CONSTRUCTOR_NAME, true)) { + var instance = new Constructor(); + // early implementations not supports chaining + var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; + // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false + var THROWS_ON_PRIMITIVES = fails$c(function () { instance.has(1); }); + // most early implementations doesn't supports iterables, most modern - not close it correctly + // eslint-disable-next-line no-new -- required for testing + var ACCEPT_ITERABLES = checkCorrectnessOfIteration$1(function (iterable) { new NativeConstructor(iterable); }); + // for early implementations -0 and +0 not the same + var BUGGY_ZERO = !IS_WEAK && fails$c(function () { + // V8 ~ Chromium 42- fails only with 5+ elements + var $instance = new NativeConstructor(); + var index = 5; + while (index--) $instance[ADDER](index, index); + return !$instance.has(-0); + }); - var streamGeometryType = { - Sphere: function(object, stream) { - stream.sphere(); - }, - Point: function(object, stream) { - object = object.coordinates; - stream.point(object[0], object[1], object[2]); - }, - MultiPoint: function(object, stream) { - var coordinates = object.coordinates, i = -1, n = coordinates.length; - while (++i < n) { object = coordinates[i], stream.point(object[0], object[1], object[2]); } - }, - LineString: function(object, stream) { - streamLine(object.coordinates, stream, 0); - }, - MultiLineString: function(object, stream) { - var coordinates = object.coordinates, i = -1, n = coordinates.length; - while (++i < n) { streamLine(coordinates[i], stream, 0); } - }, - Polygon: function(object, stream) { - streamPolygon(object.coordinates, stream); - }, - MultiPolygon: function(object, stream) { - var coordinates = object.coordinates, i = -1, n = coordinates.length; - while (++i < n) { streamPolygon(coordinates[i], stream); } - }, - GeometryCollection: function(object, stream) { - var geometries = object.geometries, i = -1, n = geometries.length; - while (++i < n) { streamGeometry(geometries[i], stream); } - } - }; + if (!ACCEPT_ITERABLES) { + Constructor = wrapper(function (dummy, iterable) { + anInstance$2(dummy, NativePrototype); + var that = inheritIfRequired$2(new NativeConstructor(), dummy, Constructor); + if (iterable != undefined) iterate$1(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP }); + return that; + }); + Constructor.prototype = NativePrototype; + NativePrototype.constructor = Constructor; + } - function streamLine(coordinates, stream, closed) { - var i = -1, n = coordinates.length - closed, coordinate; - stream.lineStart(); - while (++i < n) { coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]); } - stream.lineEnd(); - } + if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) { + fixMethod('delete'); + fixMethod('has'); + IS_MAP && fixMethod('get'); + } - function streamPolygon(coordinates, stream) { - var i = -1, n = coordinates.length; - stream.polygonStart(); - while (++i < n) { streamLine(coordinates[i], stream, 1); } - stream.polygonEnd(); - } + if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER); - function d3_geoStream(object, stream) { - if (object && streamObjectType.hasOwnProperty(object.type)) { - streamObjectType[object.type](object, stream); - } else { - streamGeometry(object, stream); + // weak collections should not contains .clear method + if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear; } - } - var areaRingSum = adder(); + exported[CONSTRUCTOR_NAME] = Constructor; + $$E({ global: true, forced: Constructor != NativeConstructor }, exported); - var areaSum = adder(), - lambda00, - phi00, - lambda0, - cosPhi0, - sinPhi0; + setToStringTag$1(Constructor, CONSTRUCTOR_NAME); - var areaStream = { - point: noop$2, - lineStart: noop$2, - lineEnd: noop$2, - polygonStart: function() { - areaRingSum.reset(); - areaStream.lineStart = areaRingStart; - areaStream.lineEnd = areaRingEnd; - }, - polygonEnd: function() { - var areaRing = +areaRingSum; - areaSum.add(areaRing < 0 ? tau + areaRing : areaRing); - this.lineStart = this.lineEnd = this.point = noop$2; - }, - sphere: function() { - areaSum.add(tau); - } - }; + if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP); - function areaRingStart() { - areaStream.point = areaPointFirst; - } + return Constructor; + }; - function areaRingEnd() { - areaPoint(lambda00, phi00); - } + var defineProperty$2 = objectDefineProperty.f; + var create$3 = objectCreate; + var redefineAll = redefineAll$4; + var bind$6 = functionBindContext; + var anInstance$1 = anInstance$7; + var iterate = iterate$3; + var defineIterator = defineIterator$3; + var setSpecies$1 = setSpecies$5; + var DESCRIPTORS$6 = descriptors; + var fastKey = internalMetadata.exports.fastKey; + var InternalStateModule$1 = internalState; - function areaPointFirst(lambda, phi) { - areaStream.point = areaPoint; - lambda00 = lambda, phi00 = phi; - lambda *= radians, phi *= radians; - lambda0 = lambda, cosPhi0 = cos(phi = phi / 2 + quarterPi), sinPhi0 = sin(phi); - } + var setInternalState$1 = InternalStateModule$1.set; + var internalStateGetterFor = InternalStateModule$1.getterFor; - function areaPoint(lambda, phi) { - lambda *= radians, phi *= radians; - phi = phi / 2 + quarterPi; // half the angular distance from south pole + var collectionStrong$2 = { + getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) { + var Constructor = wrapper(function (that, iterable) { + anInstance$1(that, Prototype); + setInternalState$1(that, { + type: CONSTRUCTOR_NAME, + index: create$3(null), + first: undefined, + last: undefined, + size: 0 + }); + if (!DESCRIPTORS$6) that.size = 0; + if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP }); + }); - // Spherical excess E for a spherical triangle with vertices: south pole, - // previous point, current point. Uses a formula derived from Cagnoli’s - // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2). - var dLambda = lambda - lambda0, - sdLambda = dLambda >= 0 ? 1 : -1, - adLambda = sdLambda * dLambda, - cosPhi = cos(phi), - sinPhi = sin(phi), - k = sinPhi0 * sinPhi, - u = cosPhi0 * cosPhi + k * cos(adLambda), - v = k * sdLambda * sin(adLambda); - areaRingSum.add(atan2(v, u)); + var Prototype = Constructor.prototype; - // Advance the previous points. - lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi; - } + var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME); - function d3_geoArea(object) { - areaSum.reset(); - d3_geoStream(object, areaStream); - return areaSum * 2; - } + var define = function (that, key, value) { + var state = getInternalState(that); + var entry = getEntry(that, key); + var previous, index; + // change existing entry + if (entry) { + entry.value = value; + // create new entry + } else { + state.last = entry = { + index: index = fastKey(key, true), + key: key, + value: value, + previous: previous = state.last, + next: undefined, + removed: false + }; + if (!state.first) state.first = entry; + if (previous) previous.next = entry; + if (DESCRIPTORS$6) state.size++; + else that.size++; + // add to index + if (index !== 'F') state.index[index] = entry; + } return that; + }; + + var getEntry = function (that, key) { + var state = getInternalState(that); + // fast case + var index = fastKey(key); + var entry; + if (index !== 'F') return state.index[index]; + // frozen object case + for (entry = state.first; entry; entry = entry.next) { + if (entry.key == key) return entry; + } + }; - function spherical(cartesian) { - return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])]; - } + redefineAll(Prototype, { + // `{ Map, Set }.prototype.clear()` methods + // https://tc39.es/ecma262/#sec-map.prototype.clear + // https://tc39.es/ecma262/#sec-set.prototype.clear + clear: function clear() { + var that = this; + var state = getInternalState(that); + var data = state.index; + var entry = state.first; + while (entry) { + entry.removed = true; + if (entry.previous) entry.previous = entry.previous.next = undefined; + delete data[entry.index]; + entry = entry.next; + } + state.first = state.last = undefined; + if (DESCRIPTORS$6) state.size = 0; + else that.size = 0; + }, + // `{ Map, Set }.prototype.delete(key)` methods + // https://tc39.es/ecma262/#sec-map.prototype.delete + // https://tc39.es/ecma262/#sec-set.prototype.delete + 'delete': function (key) { + var that = this; + var state = getInternalState(that); + var entry = getEntry(that, key); + if (entry) { + var next = entry.next; + var prev = entry.previous; + delete state.index[entry.index]; + entry.removed = true; + if (prev) prev.next = next; + if (next) next.previous = prev; + if (state.first == entry) state.first = next; + if (state.last == entry) state.last = prev; + if (DESCRIPTORS$6) state.size--; + else that.size--; + } return !!entry; + }, + // `{ Map, Set }.prototype.forEach(callbackfn, thisArg = undefined)` methods + // https://tc39.es/ecma262/#sec-map.prototype.foreach + // https://tc39.es/ecma262/#sec-set.prototype.foreach + forEach: function forEach(callbackfn /* , that = undefined */) { + var state = getInternalState(this); + var boundFunction = bind$6(callbackfn, arguments.length > 1 ? arguments[1] : undefined); + var entry; + while (entry = entry ? entry.next : state.first) { + boundFunction(entry.value, entry.key, this); + // revert to the last existing entry + while (entry && entry.removed) entry = entry.previous; + } + }, + // `{ Map, Set}.prototype.has(key)` methods + // https://tc39.es/ecma262/#sec-map.prototype.has + // https://tc39.es/ecma262/#sec-set.prototype.has + has: function has(key) { + return !!getEntry(this, key); + } + }); - function cartesian(spherical) { - var lambda = spherical[0], phi = spherical[1], cosPhi = cos(phi); - return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)]; - } + redefineAll(Prototype, IS_MAP ? { + // `Map.prototype.get(key)` method + // https://tc39.es/ecma262/#sec-map.prototype.get + get: function get(key) { + var entry = getEntry(this, key); + return entry && entry.value; + }, + // `Map.prototype.set(key, value)` method + // https://tc39.es/ecma262/#sec-map.prototype.set + set: function set(key, value) { + return define(this, key === 0 ? 0 : key, value); + } + } : { + // `Set.prototype.add(value)` method + // https://tc39.es/ecma262/#sec-set.prototype.add + add: function add(value) { + return define(this, value = value === 0 ? 0 : value, value); + } + }); + if (DESCRIPTORS$6) defineProperty$2(Prototype, 'size', { + get: function () { + return getInternalState(this).size; + } + }); + return Constructor; + }, + setStrong: function (Constructor, CONSTRUCTOR_NAME, IS_MAP) { + var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator'; + var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME); + var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME); + // `{ Map, Set }.prototype.{ keys, values, entries, @@iterator }()` methods + // https://tc39.es/ecma262/#sec-map.prototype.entries + // https://tc39.es/ecma262/#sec-map.prototype.keys + // https://tc39.es/ecma262/#sec-map.prototype.values + // https://tc39.es/ecma262/#sec-map.prototype-@@iterator + // https://tc39.es/ecma262/#sec-set.prototype.entries + // https://tc39.es/ecma262/#sec-set.prototype.keys + // https://tc39.es/ecma262/#sec-set.prototype.values + // https://tc39.es/ecma262/#sec-set.prototype-@@iterator + defineIterator(Constructor, CONSTRUCTOR_NAME, function (iterated, kind) { + setInternalState$1(this, { + type: ITERATOR_NAME, + target: iterated, + state: getInternalCollectionState(iterated), + kind: kind, + last: undefined + }); + }, function () { + var state = getInternalIteratorState(this); + var kind = state.kind; + var entry = state.last; + // revert to the last existing entry + while (entry && entry.removed) entry = entry.previous; + // get next entry + if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) { + // or finish the iteration + state.target = undefined; + return { value: undefined, done: true }; + } + // return step by kind + if (kind == 'keys') return { value: entry.key, done: false }; + if (kind == 'values') return { value: entry.value, done: false }; + return { value: [entry.key, entry.value], done: false }; + }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); - function cartesianDot(a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; - } + // `{ Map, Set }.prototype[@@species]` accessors + // https://tc39.es/ecma262/#sec-get-map-@@species + // https://tc39.es/ecma262/#sec-get-set-@@species + setSpecies$1(CONSTRUCTOR_NAME); + } + }; - function cartesianCross(a, b) { - 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]]; - } + var collection$1 = collection$2; + var collectionStrong$1 = collectionStrong$2; - // TODO return a - function cartesianAddInPlace(a, b) { - a[0] += b[0], a[1] += b[1], a[2] += b[2]; - } + // `Set` constructor + // https://tc39.es/ecma262/#sec-set-objects + collection$1('Set', function (init) { + return function Set() { return init(this, arguments.length ? arguments[0] : undefined); }; + }, collectionStrong$1); - function cartesianScale(vector, k) { - return [vector[0] * k, vector[1] * k, vector[2] * k]; + function d3_ascending (a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; } - // TODO return d - function cartesianNormalizeInPlace(d) { - var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); - d[0] /= l, d[1] /= l, d[2] /= l; - } + function d3_bisector (f) { + var delta = f; + var compare = f; - var lambda0$1, phi0, lambda1, phi1, // bounds - lambda2, // previous lambda-coordinate - lambda00$1, phi00$1, // first point - p0, // previous 3D point - deltaSum = adder(), - ranges, - range; + if (f.length === 1) { + delta = function delta(d, x) { + return f(d) - x; + }; - var boundsStream = { - point: boundsPoint, - lineStart: boundsLineStart, - lineEnd: boundsLineEnd, - polygonStart: function() { - boundsStream.point = boundsRingPoint; - boundsStream.lineStart = boundsRingStart; - boundsStream.lineEnd = boundsRingEnd; - deltaSum.reset(); - areaStream.polygonStart(); - }, - polygonEnd: function() { - areaStream.polygonEnd(); - boundsStream.point = boundsPoint; - boundsStream.lineStart = boundsLineStart; - boundsStream.lineEnd = boundsLineEnd; - if (areaRingSum < 0) { lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); } - else if (deltaSum > epsilon) { phi1 = 90; } - else if (deltaSum < -epsilon) { phi0 = -90; } - range[0] = lambda0$1, range[1] = lambda1; - }, - sphere: function() { - lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + compare = ascendingComparator(f); } - }; - function boundsPoint(lambda, phi) { - ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); - if (phi < phi0) { phi0 = phi; } - if (phi > phi1) { phi1 = phi; } - } + function left(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; - function linePoint(lambda, phi) { - var p = cartesian([lambda * radians, phi * radians]); - if (p0) { - var normal = cartesianCross(p0, p), - equatorial = [normal[1], -normal[0], 0], - inflection = cartesianCross(equatorial, normal); - cartesianNormalizeInPlace(inflection); - inflection = spherical(inflection); - var delta = lambda - lambda2, - sign = delta > 0 ? 1 : -1, - lambdai = inflection[0] * degrees * sign, - phii, - antimeridian = abs$2(delta) > 180; - if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { - phii = inflection[1] * degrees; - if (phii > phi1) { phi1 = phii; } - } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { - phii = -inflection[1] * degrees; - if (phii < phi0) { phi0 = phii; } - } else { - if (phi < phi0) { phi0 = phi; } - if (phi > phi1) { phi1 = phi; } - } - if (antimeridian) { - if (lambda < lambda2) { - if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) { lambda1 = lambda; } - } else { - if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) { lambda0$1 = lambda; } - } - } else { - if (lambda1 >= lambda0$1) { - if (lambda < lambda0$1) { lambda0$1 = lambda; } - if (lambda > lambda1) { lambda1 = lambda; } - } else { - if (lambda > lambda2) { - if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) { lambda1 = lambda; } - } else { - if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) { lambda0$1 = lambda; } - } - } + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) < 0) lo = mid + 1;else hi = mid; } - } else { - ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); + + return lo; } - if (phi < phi0) { phi0 = phi; } - if (phi > phi1) { phi1 = phi; } - p0 = p, lambda2 = lambda; - } - function boundsLineStart() { - boundsStream.point = linePoint; - } + function right(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; - function boundsLineEnd() { - range[0] = lambda0$1, range[1] = lambda1; - boundsStream.point = boundsPoint; - p0 = null; - } + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) > 0) hi = mid;else lo = mid + 1; + } - function boundsRingPoint(lambda, phi) { - if (p0) { - var delta = lambda - lambda2; - deltaSum.add(abs$2(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta); - } else { - lambda00$1 = lambda, phi00$1 = phi; + return lo; } - areaStream.point(lambda, phi); - linePoint(lambda, phi); - } - function boundsRingStart() { - areaStream.lineStart(); - } + function center(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + var i = left(a, x, lo, hi - 1); + return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i; + } - function boundsRingEnd() { - boundsRingPoint(lambda00$1, phi00$1); - areaStream.lineEnd(); - if (abs$2(deltaSum) > epsilon) { lambda0$1 = -(lambda1 = 180); } - range[0] = lambda0$1, range[1] = lambda1; - p0 = null; + return { + left: left, + center: center, + right: right + }; } - // Finds the left-right distance between two longitudes. - // This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want - // the distance between ±180° to be 360°. - function angle(lambda0, lambda1) { - return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1; + function ascendingComparator(f) { + return function (d, x) { + return d3_ascending(f(d), x); + }; } - function rangeCompare(a, b) { - return a[0] - b[0]; - } + var defineWellKnownSymbol = defineWellKnownSymbol$4; - function rangeContains(range, x) { - return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x; - } + // `Symbol.asyncIterator` well-known symbol + // https://tc39.es/ecma262/#sec-symbol.asynciterator + defineWellKnownSymbol('asyncIterator'); - function d3_geoBounds(feature) { - var i, n, a, b, merged, deltaMax, delta; + var runtime = {exports: {}}; - phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity); - ranges = []; - d3_geoStream(feature, boundsStream); + (function (module) { + var runtime = function (exports) { - // First, sort ranges by their minimum longitudes. - if (n = ranges.length) { - ranges.sort(rangeCompare); + var Op = Object.prototype; + var hasOwn = Op.hasOwnProperty; + var undefined$1; // More compressible than void 0. - // Then, merge any ranges that overlap. - for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) { - b = ranges[i]; - if (rangeContains(a, b[0]) || rangeContains(a, b[1])) { - if (angle(a[0], b[1]) > angle(a[0], a[1])) { a[1] = b[1]; } - if (angle(b[0], a[1]) > angle(a[0], a[1])) { a[0] = b[0]; } - } else { - merged.push(a = b); - } + var $Symbol = typeof Symbol === "function" ? Symbol : {}; + var iteratorSymbol = $Symbol.iterator || "@@iterator"; + var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; + var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; + + function define(obj, key, value) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + return obj[key]; } - // Finally, find the largest gap between the merged ranges. - // The final bounding box will be the inverse of this gap. - for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) { - b = merged[i]; - if ((delta = angle(a[1], b[0])) > deltaMax) { deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1]; } + try { + // IE 8 has a broken Object.defineProperty that only works on DOM objects. + define({}, ""); + } catch (err) { + define = function define(obj, key, value) { + return obj[key] = value; + }; } - } - ranges = range = null; + function wrap(innerFn, outerFn, self, tryLocsList) { + // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. + var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; + var generator = Object.create(protoGenerator.prototype); + var context = new Context(tryLocsList || []); // The ._invoke method unifies the implementations of the .next, + // .throw, and .return methods. - return lambda0$1 === Infinity || phi0 === Infinity - ? [[NaN, NaN], [NaN, NaN]] - : [[lambda0$1, phi0], [lambda1, phi1]]; - } + generator._invoke = makeInvokeMethod(innerFn, self, context); + return generator; + } - var W0, W1, - X0, Y0, Z0, - X1, Y1, Z1, - X2, Y2, Z2, - lambda00$2, phi00$2, // first point - x0, y0, z0; // previous point + exports.wrap = wrap; // Try/catch helper to minimize deoptimizations. Returns a completion + // record like context.tryEntries[i].completion. This interface could + // have been (and was previously) designed to take a closure to be + // invoked without arguments, but in all the cases we care about we + // already have an existing method we want to call, so there's no need + // to create a new function object. We can even get away with assuming + // the method takes exactly one argument, since that happens to be true + // in every case, so we don't have to touch the arguments object. The + // only additional allocation required is the completion record, which + // has a stable shape and so hopefully should be cheap to allocate. - var centroidStream = { - sphere: noop$2, - point: centroidPoint, - lineStart: centroidLineStart, - lineEnd: centroidLineEnd, - polygonStart: function() { - centroidStream.lineStart = centroidRingStart; - centroidStream.lineEnd = centroidRingEnd; - }, - polygonEnd: function() { - centroidStream.lineStart = centroidLineStart; - centroidStream.lineEnd = centroidLineEnd; - } - }; + function tryCatch(fn, obj, arg) { + try { + return { + type: "normal", + arg: fn.call(obj, arg) + }; + } catch (err) { + return { + type: "throw", + arg: err + }; + } + } - // Arithmetic mean of Cartesian vectors. - function centroidPoint(lambda, phi) { - lambda *= radians, phi *= radians; - var cosPhi = cos(phi); - centroidPointCartesian(cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)); - } + var GenStateSuspendedStart = "suspendedStart"; + var GenStateSuspendedYield = "suspendedYield"; + var GenStateExecuting = "executing"; + var GenStateCompleted = "completed"; // Returning this object from the innerFn has the same effect as + // breaking out of the dispatch switch statement. - function centroidPointCartesian(x, y, z) { - ++W0; - X0 += (x - X0) / W0; - Y0 += (y - Y0) / W0; - Z0 += (z - Z0) / W0; - } + var ContinueSentinel = {}; // Dummy constructor functions that we use as the .constructor and + // .constructor.prototype properties for functions that return Generator + // objects. For full spec compliance, you may wish to configure your + // minifier not to mangle the names of these two functions. - function centroidLineStart() { - centroidStream.point = centroidLinePointFirst; - } + function Generator() {} - function centroidLinePointFirst(lambda, phi) { - lambda *= radians, phi *= radians; - var cosPhi = cos(phi); - x0 = cosPhi * cos(lambda); - y0 = cosPhi * sin(lambda); - z0 = sin(phi); - centroidStream.point = centroidLinePoint; - centroidPointCartesian(x0, y0, z0); - } + function GeneratorFunction() {} - function centroidLinePoint(lambda, phi) { - lambda *= radians, phi *= radians; - var cosPhi = cos(phi), - x = cosPhi * cos(lambda), - y = cosPhi * sin(lambda), - z = sin(phi), - 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); - W1 += w; - X1 += w * (x0 + (x0 = x)); - Y1 += w * (y0 + (y0 = y)); - Z1 += w * (z0 + (z0 = z)); - centroidPointCartesian(x0, y0, z0); - } + function GeneratorFunctionPrototype() {} // This is a polyfill for %IteratorPrototype% for environments that + // don't natively support it. - function centroidLineEnd() { - centroidStream.point = centroidPoint; - } - // See J. E. Brock, The Inertia Tensor for a Spherical Triangle, - // J. Applied Mechanics 42, 239 (1975). - function centroidRingStart() { - centroidStream.point = centroidRingPointFirst; - } + var IteratorPrototype = {}; + define(IteratorPrototype, iteratorSymbol, function () { + return this; + }); + var getProto = Object.getPrototypeOf; + var NativeIteratorPrototype = getProto && getProto(getProto(values([]))); + + if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) { + // This environment has a native %IteratorPrototype%; use it instead + // of the polyfill. + IteratorPrototype = NativeIteratorPrototype; + } + + var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); + GeneratorFunction.prototype = GeneratorFunctionPrototype; + define(Gp, "constructor", GeneratorFunctionPrototype); + define(GeneratorFunctionPrototype, "constructor", GeneratorFunction); + GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"); // Helper for defining the .next, .throw, and .return methods of the + // Iterator interface in terms of a single ._invoke method. + + function defineIteratorMethods(prototype) { + ["next", "throw", "return"].forEach(function (method) { + define(prototype, method, function (arg) { + return this._invoke(method, arg); + }); + }); + } - function centroidRingEnd() { - centroidRingPoint(lambda00$2, phi00$2); - centroidStream.point = centroidPoint; - } + exports.isGeneratorFunction = function (genFun) { + var ctor = typeof genFun === "function" && genFun.constructor; + return ctor ? ctor === GeneratorFunction || // For the native GeneratorFunction constructor, the best we can + // do is to check its .name property. + (ctor.displayName || ctor.name) === "GeneratorFunction" : false; + }; - function centroidRingPointFirst(lambda, phi) { - lambda00$2 = lambda, phi00$2 = phi; - lambda *= radians, phi *= radians; - centroidStream.point = centroidRingPoint; - var cosPhi = cos(phi); - x0 = cosPhi * cos(lambda); - y0 = cosPhi * sin(lambda); - z0 = sin(phi); - centroidPointCartesian(x0, y0, z0); - } + exports.mark = function (genFun) { + if (Object.setPrototypeOf) { + Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); + } else { + genFun.__proto__ = GeneratorFunctionPrototype; + define(genFun, toStringTagSymbol, "GeneratorFunction"); + } - function centroidRingPoint(lambda, phi) { - lambda *= radians, phi *= radians; - var cosPhi = cos(phi), - x = cosPhi * cos(lambda), - y = cosPhi * sin(lambda), - z = sin(phi), - cx = y0 * z - z0 * y, - cy = z0 * x - x0 * z, - cz = x0 * y - y0 * x, - m = sqrt(cx * cx + cy * cy + cz * cz), - w = asin(m), // line weight = angle - v = m && -w / m; // area weight multiplier - X2 += v * cx; - Y2 += v * cy; - Z2 += v * cz; - W1 += w; - X1 += w * (x0 + (x0 = x)); - Y1 += w * (y0 + (y0 = y)); - Z1 += w * (z0 + (z0 = z)); - centroidPointCartesian(x0, y0, z0); - } - - function d3_geoCentroid(object) { - W0 = W1 = - X0 = Y0 = Z0 = - X1 = Y1 = Z1 = - X2 = Y2 = Z2 = 0; - d3_geoStream(object, centroidStream); - - var x = X2, - y = Y2, - z = Z2, - m = x * x + y * y + z * z; - - // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid. - if (m < epsilon2) { - x = X1, y = Y1, z = Z1; - // If the feature has zero length, fall back to arithmetic mean of point vectors. - if (W1 < epsilon) { x = X0, y = Y0, z = Z0; } - m = x * x + y * y + z * z; - // If the feature still has an undefined ccentroid, then return. - if (m < epsilon2) { return [NaN, NaN]; } - } - - return [atan2(y, x) * degrees, asin(z / sqrt(m)) * degrees]; - } - - function compose(a, b) { + genFun.prototype = Object.create(Gp); + return genFun; + }; // Within the body of any async function, `await x` is transformed to + // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test + // `hasOwn.call(value, "__await")` to determine if the yielded value is + // meant to be awaited. - function compose(x, y) { - return x = a(x, y), b(x[0], x[1]); - } - if (a.invert && b.invert) { compose.invert = function(x, y) { - return x = b.invert(x, y), x && a.invert(x[0], x[1]); - }; } + exports.awrap = function (arg) { + return { + __await: arg + }; + }; - return compose; - } + function AsyncIterator(generator, PromiseImpl) { + function invoke(method, arg, resolve, reject) { + var record = tryCatch(generator[method], generator, arg); - function rotationIdentity(lambda, phi) { - return [abs$2(lambda) > pi ? lambda + Math.round(-lambda / tau) * tau : lambda, phi]; - } + if (record.type === "throw") { + reject(record.arg); + } else { + var result = record.arg; + var value = result.value; + + if (value && _typeof(value) === "object" && hasOwn.call(value, "__await")) { + return PromiseImpl.resolve(value.__await).then(function (value) { + invoke("next", value, resolve, reject); + }, function (err) { + invoke("throw", err, resolve, reject); + }); + } - rotationIdentity.invert = rotationIdentity; + return PromiseImpl.resolve(value).then(function (unwrapped) { + // When a yielded Promise is resolved, its final value becomes + // the .value of the Promise<{value,done}> result for the + // current iteration. + result.value = unwrapped; + resolve(result); + }, function (error) { + // If a rejected Promise was yielded, throw the rejection back + // into the async generator function so it can be handled there. + return invoke("throw", error, resolve, reject); + }); + } + } - function rotateRadians(deltaLambda, deltaPhi, deltaGamma) { - return (deltaLambda %= tau) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) - : rotationLambda(deltaLambda)) - : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) - : rotationIdentity); - } + var previousPromise; - function forwardRotationLambda(deltaLambda) { - return function(lambda, phi) { - return lambda += deltaLambda, [lambda > pi ? lambda - tau : lambda < -pi ? lambda + tau : lambda, phi]; - }; - } + function enqueue(method, arg) { + function callInvokeWithMethodAndArg() { + return new PromiseImpl(function (resolve, reject) { + invoke(method, arg, resolve, reject); + }); + } - function rotationLambda(deltaLambda) { - var rotation = forwardRotationLambda(deltaLambda); - rotation.invert = forwardRotationLambda(-deltaLambda); - return rotation; - } + return previousPromise = // If enqueue has been called before, then we want to wait until + // all previous Promises have been resolved before calling invoke, + // so that results are always delivered in the correct order. If + // enqueue has not been called before, then it is important to + // call invoke immediately, without waiting on a callback to fire, + // so that the async generator function has the opportunity to do + // any necessary setup in a predictable way. This predictability + // is why the Promise constructor synchronously invokes its + // executor callback, and why async functions synchronously + // execute code before the first await. Since we implement simple + // async functions in terms of async generators, it is especially + // important to get this right, even though it requires care. + previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, // Avoid propagating failures to Promises returned by later + // invocations of the iterator. + callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); + } // Define the unified helper method that is used to implement .next, + // .throw, and .return (see defineIteratorMethods). - function rotationPhiGamma(deltaPhi, deltaGamma) { - var cosDeltaPhi = cos(deltaPhi), - sinDeltaPhi = sin(deltaPhi), - cosDeltaGamma = cos(deltaGamma), - sinDeltaGamma = sin(deltaGamma); - function rotation(lambda, phi) { - var cosPhi = cos(phi), - x = cos(lambda) * cosPhi, - y = sin(lambda) * cosPhi, - z = sin(phi), - k = z * cosDeltaPhi + x * sinDeltaPhi; - return [ - atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi), - asin(k * cosDeltaGamma + y * sinDeltaGamma) - ]; - } + this._invoke = enqueue; + } - rotation.invert = function(lambda, phi) { - var cosPhi = cos(phi), - x = cos(lambda) * cosPhi, - y = sin(lambda) * cosPhi, - z = sin(phi), - k = z * cosDeltaGamma - y * sinDeltaGamma; - return [ - atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi), - asin(k * cosDeltaPhi - x * sinDeltaPhi) - ]; - }; + defineIteratorMethods(AsyncIterator.prototype); + define(AsyncIterator.prototype, asyncIteratorSymbol, function () { + return this; + }); + exports.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of + // AsyncIterator objects; they just return a Promise for the value of + // the final result produced by the iterator. + + exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { + if (PromiseImpl === void 0) PromiseImpl = Promise; + var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); + return exports.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator. + : iter.next().then(function (result) { + return result.done ? result.value : iter.next(); + }); + }; - return rotation; - } + function makeInvokeMethod(innerFn, self, context) { + var state = GenStateSuspendedStart; + return function invoke(method, arg) { + if (state === GenStateExecuting) { + throw new Error("Generator is already running"); + } - function rotation(rotate) { - rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0); + if (state === GenStateCompleted) { + if (method === "throw") { + throw arg; + } // Be forgiving, per 25.3.3.3.3 of the spec: + // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume - function forward(coordinates) { - coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians); - return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates; - } - forward.invert = function(coordinates) { - coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians); - return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates; - }; + return doneResult(); + } - return forward; - } + context.method = method; + context.arg = arg; - // Generates a circle centered at [0°, 0°], with a given radius and precision. - function circleStream(stream, radius, delta, direction, t0, t1) { - if (!delta) { return; } - var cosRadius = cos(radius), - sinRadius = sin(radius), - step = direction * delta; - if (t0 == null) { - t0 = radius + direction * tau; - t1 = radius - step / 2; - } else { - t0 = circleRadius(cosRadius, t0); - t1 = circleRadius(cosRadius, t1); - if (direction > 0 ? t0 < t1 : t0 > t1) { t0 += direction * tau; } - } - for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) { - point = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]); - stream.point(point[0], point[1]); - } - } + while (true) { + var delegate = context.delegate; - // Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0]. - function circleRadius(cosRadius, point) { - point = cartesian(point), point[0] -= cosRadius; - cartesianNormalizeInPlace(point); - var radius = acos(-point[1]); - return ((-point[2] < 0 ? -radius : radius) + tau - epsilon) % tau; - } + if (delegate) { + var delegateResult = maybeInvokeDelegate(delegate, context); - function clipBuffer() { - var lines = [], - line; - return { - point: function(x, y, m) { - line.push([x, y, m]); - }, - lineStart: function() { - lines.push(line = []); - }, - lineEnd: noop$2, - rejoin: function() { - if (lines.length > 1) { lines.push(lines.pop().concat(lines.shift())); } - }, - result: function() { - var result = lines; - lines = []; - line = null; - return result; - } - }; - } + if (delegateResult) { + if (delegateResult === ContinueSentinel) continue; + return delegateResult; + } + } - function pointEqual(a, b) { - return abs$2(a[0] - b[0]) < epsilon && abs$2(a[1] - b[1]) < epsilon; - } + if (context.method === "next") { + // Setting context._sent for legacy support of Babel's + // function.sent implementation. + context.sent = context._sent = context.arg; + } else if (context.method === "throw") { + if (state === GenStateSuspendedStart) { + state = GenStateCompleted; + throw context.arg; + } - function Intersection(point, points, other, entry) { - this.x = point; - this.z = points; - this.o = other; // another intersection - this.e = entry; // is an entry? - this.v = false; // visited - this.n = this.p = null; // next & previous - } + context.dispatchException(context.arg); + } else if (context.method === "return") { + context.abrupt("return", context.arg); + } - // A generalized polygon clipping algorithm: given a polygon that has been cut - // into its visible line segments, and rejoins the segments by interpolating - // along the clip edge. - function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) { - var subject = [], - clip = [], - i, - n; + state = GenStateExecuting; + var record = tryCatch(innerFn, self, context); - segments.forEach(function(segment) { - if ((n = segment.length - 1) <= 0) { return; } - var n, p0 = segment[0], p1 = segment[n], x; + if (record.type === "normal") { + // If an exception is thrown from innerFn, we leave state === + // GenStateExecuting and loop back for another invocation. + state = context.done ? GenStateCompleted : GenStateSuspendedYield; - if (pointEqual(p0, p1)) { - if (!p0[2] && !p1[2]) { - stream.lineStart(); - for (i = 0; i < n; ++i) { stream.point((p0 = segment[i])[0], p0[1]); } - stream.lineEnd(); - return; - } - // handle degenerate cases by moving the point - p1[0] += 2 * epsilon; - } + if (record.arg === ContinueSentinel) { + continue; + } - subject.push(x = new Intersection(p0, segment, null, true)); - clip.push(x.o = new Intersection(p0, null, x, false)); - subject.push(x = new Intersection(p1, segment, null, false)); - clip.push(x.o = new Intersection(p1, null, x, true)); - }); + return { + value: record.arg, + done: context.done + }; + } else if (record.type === "throw") { + state = GenStateCompleted; // Dispatch the exception by looping back around to the + // context.dispatchException(context.arg) call above. - if (!subject.length) { return; } + context.method = "throw"; + context.arg = record.arg; + } + } + }; + } // Call delegate.iterator[context.method](context.arg) and handle the + // result, either by returning a { value, done } result from the + // delegate iterator, or by modifying context.method and context.arg, + // setting context.delegate to null, and returning the ContinueSentinel. + + + function maybeInvokeDelegate(delegate, context) { + var method = delegate.iterator[context.method]; + + if (method === undefined$1) { + // A .throw or .return when the delegate iterator has no .throw + // method always terminates the yield* loop. + context.delegate = null; + + if (context.method === "throw") { + // Note: ["return"] must be used for ES3 parsing compatibility. + if (delegate.iterator["return"]) { + // If the delegate iterator has a return method, give it a + // chance to clean up. + context.method = "return"; + context.arg = undefined$1; + maybeInvokeDelegate(delegate, context); + + if (context.method === "throw") { + // If maybeInvokeDelegate(context) changed context.method from + // "return" to "throw", let that override the TypeError below. + return ContinueSentinel; + } + } - clip.sort(compareIntersection); - link(subject); - link(clip); + context.method = "throw"; + context.arg = new TypeError("The iterator does not provide a 'throw' method"); + } - for (i = 0, n = clip.length; i < n; ++i) { - clip[i].e = startInside = !startInside; - } + return ContinueSentinel; + } - var start = subject[0], - points, - point; + var record = tryCatch(method, delegate.iterator, context.arg); - while (1) { - // Find first unvisited intersection. - var current = start, - isSubject = true; - while (current.v) { if ((current = current.n) === start) { return; } } - points = current.z; - stream.lineStart(); - do { - current.v = current.o.v = true; - if (current.e) { - if (isSubject) { - for (i = 0, n = points.length; i < n; ++i) { stream.point((point = points[i])[0], point[1]); } - } else { - interpolate(current.x, current.n.x, 1, stream); + if (record.type === "throw") { + context.method = "throw"; + context.arg = record.arg; + context.delegate = null; + return ContinueSentinel; + } + + var info = record.arg; + + if (!info) { + context.method = "throw"; + context.arg = new TypeError("iterator result is not an object"); + context.delegate = null; + return ContinueSentinel; + } + + if (info.done) { + // Assign the result of the finished delegate to the temporary + // variable specified by delegate.resultName (see delegateYield). + context[delegate.resultName] = info.value; // Resume execution at the desired location (see delegateYield). + + context.next = delegate.nextLoc; // If context.method was "throw" but the delegate handled the + // exception, let the outer generator proceed normally. If + // context.method was "next", forget context.arg since it has been + // "consumed" by the delegate iterator. If context.method was + // "return", allow the original .return call to continue in the + // outer generator. + + if (context.method !== "return") { + context.method = "next"; + context.arg = undefined$1; } - current = current.n; } else { - if (isSubject) { - points = current.p.z; - for (i = points.length - 1; i >= 0; --i) { stream.point((point = points[i])[0], point[1]); } - } else { - interpolate(current.x, current.p.x, -1, stream); - } - current = current.p; + // Re-yield the result returned by the delegate method. + return info; + } // The delegate iterator is finished, so forget it and continue with + // the outer generator. + + + context.delegate = null; + return ContinueSentinel; + } // Define Generator.prototype.{next,throw,return} in terms of the + // unified ._invoke helper method. + + + defineIteratorMethods(Gp); + define(Gp, toStringTagSymbol, "Generator"); // A Generator should always return itself as the iterator object when the + // @@iterator function is called on it. Some browsers' implementations of the + // iterator prototype chain incorrectly implement this, causing the Generator + // object to not be returned from this call. This ensures that doesn't happen. + // See https://github.com/facebook/regenerator/issues/274 for more details. + + define(Gp, iteratorSymbol, function () { + return this; + }); + define(Gp, "toString", function () { + return "[object Generator]"; + }); + + function pushTryEntry(locs) { + var entry = { + tryLoc: locs[0] + }; + + if (1 in locs) { + entry.catchLoc = locs[1]; } - current = current.o; - points = current.z; - isSubject = !isSubject; - } while (!current.v); - stream.lineEnd(); - } - } - function link(array) { - if (!(n = array.length)) { return; } - var n, - i = 0, - a = array[0], - b; - while (++i < n) { - a.n = b = array[i]; - b.p = a; - a = b; - } - a.n = b = array[0]; - b.p = a; - } + if (2 in locs) { + entry.finallyLoc = locs[2]; + entry.afterLoc = locs[3]; + } - var sum = adder(); + this.tryEntries.push(entry); + } - function longitude(point) { - if (abs$2(point[0]) <= pi) - { return point[0]; } - else - { return sign$2(point[0]) * ((abs$2(point[0]) + pi) % tau - pi); } - } + function resetTryEntry(entry) { + var record = entry.completion || {}; + record.type = "normal"; + delete record.arg; + entry.completion = record; + } - function polygonContains(polygon, point) { - var lambda = longitude(point), - phi = point[1], - sinPhi = sin(phi), - normal = [sin(lambda), -cos(lambda), 0], - angle = 0, - winding = 0; + function Context(tryLocsList) { + // The root entry object (effectively a try statement without a catch + // or a finally block) gives us a place to store values thrown from + // locations where there is no enclosing try statement. + this.tryEntries = [{ + tryLoc: "root" + }]; + tryLocsList.forEach(pushTryEntry, this); + this.reset(true); + } - sum.reset(); + exports.keys = function (object) { + var keys = []; - if (sinPhi === 1) { phi = halfPi + epsilon; } - else if (sinPhi === -1) { phi = -halfPi - epsilon; } + for (var key in object) { + keys.push(key); + } - for (var i = 0, n = polygon.length; i < n; ++i) { - if (!(m = (ring = polygon[i]).length)) { continue; } - var ring, - m, - point0 = ring[m - 1], - lambda0 = longitude(point0), - phi0 = point0[1] / 2 + quarterPi, - sinPhi0 = sin(phi0), - cosPhi0 = cos(phi0); + keys.reverse(); // Rather than returning an object with a next method, we keep + // things simple and return the next function itself. - for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) { - var point1 = ring[j], - lambda1 = longitude(point1), - phi1 = point1[1] / 2 + quarterPi, - sinPhi1 = sin(phi1), - cosPhi1 = cos(phi1), - delta = lambda1 - lambda0, - sign = delta >= 0 ? 1 : -1, - absDelta = sign * delta, - antimeridian = absDelta > pi, - k = sinPhi0 * sinPhi1; + return function next() { + while (keys.length) { + var key = keys.pop(); - sum.add(atan2(k * sign * sin(absDelta), cosPhi0 * cosPhi1 + k * cos(absDelta))); - angle += antimeridian ? delta + sign * tau : delta; + if (key in object) { + next.value = key; + next.done = false; + return next; + } + } // To avoid creating an additional object, we just hang the .value + // and .done properties off the next function object itself. This + // also ensures that the minifier will not anonymize the function. - // Are the longitudes either side of the point’s meridian (lambda), - // and are the latitudes smaller than the parallel (phi)? - if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) { - var arc = cartesianCross(cartesian(point0), cartesian(point1)); - cartesianNormalizeInPlace(arc); - var intersection = cartesianCross(normal, arc); - cartesianNormalizeInPlace(intersection); - var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]); - if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) { - winding += antimeridian ^ delta >= 0 ? 1 : -1; + + next.done = true; + return next; + }; + }; + + function values(iterable) { + if (iterable) { + var iteratorMethod = iterable[iteratorSymbol]; + + if (iteratorMethod) { + return iteratorMethod.call(iterable); + } + + if (typeof iterable.next === "function") { + return iterable; + } + + if (!isNaN(iterable.length)) { + var i = -1, + next = function next() { + while (++i < iterable.length) { + if (hasOwn.call(iterable, i)) { + next.value = iterable[i]; + next.done = false; + return next; + } + } + + next.value = undefined$1; + next.done = true; + return next; + }; + + return next.next = next; + } + } // Return an iterator with no values. + + + return { + next: doneResult + }; + } + + exports.values = values; + + function doneResult() { + return { + value: undefined$1, + done: true + }; + } + + Context.prototype = { + constructor: Context, + reset: function reset(skipTempReset) { + this.prev = 0; + this.next = 0; // Resetting context._sent for legacy support of Babel's + // function.sent implementation. + + this.sent = this._sent = undefined$1; + this.done = false; + this.delegate = null; + this.method = "next"; + this.arg = undefined$1; + this.tryEntries.forEach(resetTryEntry); + + if (!skipTempReset) { + for (var name in this) { + // Not sure about the optimal order of these conditions: + if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) { + this[name] = undefined$1; + } + } + } + }, + stop: function stop() { + this.done = true; + var rootEntry = this.tryEntries[0]; + var rootRecord = rootEntry.completion; + + if (rootRecord.type === "throw") { + throw rootRecord.arg; + } + + return this.rval; + }, + dispatchException: function dispatchException(exception) { + if (this.done) { + throw exception; + } + + var context = this; + + function handle(loc, caught) { + record.type = "throw"; + record.arg = exception; + context.next = loc; + + if (caught) { + // If the dispatched exception was caught by a catch block, + // then let that catch block handle the exception normally. + context.method = "next"; + context.arg = undefined$1; + } + + return !!caught; + } + + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + var record = entry.completion; + + if (entry.tryLoc === "root") { + // Exception thrown outside of any try block that could handle + // it, so set the completion value of the entire function to + // throw the exception. + return handle("end"); + } + + if (entry.tryLoc <= this.prev) { + var hasCatch = hasOwn.call(entry, "catchLoc"); + var hasFinally = hasOwn.call(entry, "finallyLoc"); + + if (hasCatch && hasFinally) { + if (this.prev < entry.catchLoc) { + return handle(entry.catchLoc, true); + } else if (this.prev < entry.finallyLoc) { + return handle(entry.finallyLoc); + } + } else if (hasCatch) { + if (this.prev < entry.catchLoc) { + return handle(entry.catchLoc, true); + } + } else if (hasFinally) { + if (this.prev < entry.finallyLoc) { + return handle(entry.finallyLoc); + } + } else { + throw new Error("try statement without catch or finally"); + } + } + } + }, + abrupt: function abrupt(type, arg) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + + if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { + var finallyEntry = entry; + break; + } + } + + if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) { + // Ignore the finally entry if control is not jumping to a + // location outside the try/catch block. + finallyEntry = null; + } + + var record = finallyEntry ? finallyEntry.completion : {}; + record.type = type; + record.arg = arg; + + if (finallyEntry) { + this.method = "next"; + this.next = finallyEntry.finallyLoc; + return ContinueSentinel; + } + + return this.complete(record); + }, + complete: function complete(record, afterLoc) { + if (record.type === "throw") { + throw record.arg; + } + + if (record.type === "break" || record.type === "continue") { + this.next = record.arg; + } else if (record.type === "return") { + this.rval = this.arg = record.arg; + this.method = "return"; + this.next = "end"; + } else if (record.type === "normal" && afterLoc) { + this.next = afterLoc; + } + + return ContinueSentinel; + }, + finish: function finish(finallyLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + + if (entry.finallyLoc === finallyLoc) { + this.complete(entry.completion, entry.afterLoc); + resetTryEntry(entry); + return ContinueSentinel; + } + } + }, + "catch": function _catch(tryLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + + if (entry.tryLoc === tryLoc) { + var record = entry.completion; + + if (record.type === "throw") { + var thrown = record.arg; + resetTryEntry(entry); + } + + return thrown; + } + } // The context.catch method must only be called with a location + // argument that corresponds to a known catch block. + + + throw new Error("illegal catch attempt"); + }, + delegateYield: function delegateYield(iterable, resultName, nextLoc) { + this.delegate = { + iterator: values(iterable), + resultName: resultName, + nextLoc: nextLoc + }; + + if (this.method === "next") { + // Deliberately forget the last sent value so that we don't + // accidentally pass it on to the delegate. + this.arg = undefined$1; } + + return ContinueSentinel; } + }; // Regardless of whether this script is executing as a CommonJS module + // or not, return the runtime object so that we can declare the variable + // regeneratorRuntime in the outer scope, which allows this module to be + // injected easily by `bin/regenerator --include-runtime script.js`. + + return exports; + }( // If this script is executing as a CommonJS module, use module.exports + // as the regeneratorRuntime namespace. Otherwise create a new empty + // object. Either way, the resulting object will be used to initialize + // the regeneratorRuntime variable at the top of this file. + module.exports ); + + try { + regeneratorRuntime = runtime; + } catch (accidentalStrictMode) { + // This module should not be running in strict mode, so the above + // assignment should always work unless something is misconfigured. Just + // in case runtime.js accidentally runs in strict mode, in modern engines + // we can explicitly access globalThis. In older engines we can escape + // strict mode using a global Function call. This could conceivably fail + // if a Content Security Policy forbids using Function, but in that case + // the proper solution is to fix the accidental strict mode problem. If + // you've misconfigured your bundler to force strict mode and applied a + // CSP to forbid Function, and you're not willing to fix either of those + // problems, please detail your unique predicament in a GitHub issue. + if ((typeof globalThis === "undefined" ? "undefined" : _typeof(globalThis)) === "object") { + globalThis.regeneratorRuntime = runtime; + } else { + Function("r", "regeneratorRuntime = r")(runtime); } } + })(runtime); - // First, determine whether the South pole is inside or outside: - // - // It is inside if: - // * the polygon winds around it in a clockwise direction. - // * the polygon does not (cumulatively) wind around it, but has a negative - // (counter-clockwise) area. - // - // Second, count the (signed) number of times a segment crosses a lambda - // from the point to the South pole. If it is zero, then the point is the - // same side as the South pole. + var _marked$3 = /*#__PURE__*/regeneratorRuntime.mark(numbers); - return (angle < -epsilon || angle < epsilon && sum < -epsilon) ^ (winding & 1); + function number$1 (x) { + return x === null ? NaN : +x; } + function numbers(values, valueof) { + var _iterator, _step, value, index, _iterator2, _step2, _value; - function d3_ascending(a, b) { - return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; - } + return regeneratorRuntime.wrap(function numbers$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + if (!(valueof === undefined)) { + _context.next = 21; + break; + } - function d3_bisector(compare) { - if (compare.length === 1) { compare = ascendingComparator(compare); } - return { - left: function(a, x, lo, hi) { - if (lo == null) { lo = 0; } - if (hi == null) { hi = a.length; } - while (lo < hi) { - var mid = lo + hi >>> 1; - if (compare(a[mid], x) < 0) { lo = mid + 1; } - else { hi = mid; } - } - return lo; - }, - right: function(a, x, lo, hi) { - if (lo == null) { lo = 0; } - if (hi == null) { hi = a.length; } - while (lo < hi) { - var mid = lo + hi >>> 1; - if (compare(a[mid], x) > 0) { hi = mid; } - else { lo = mid + 1; } + _iterator = _createForOfIteratorHelper(values); + _context.prev = 2; + + _iterator.s(); + + case 4: + if ((_step = _iterator.n()).done) { + _context.next = 11; + break; + } + + value = _step.value; + + if (!(value != null && (value = +value) >= value)) { + _context.next = 9; + break; + } + + _context.next = 9; + return value; + + case 9: + _context.next = 4; + break; + + case 11: + _context.next = 16; + break; + + case 13: + _context.prev = 13; + _context.t0 = _context["catch"](2); + + _iterator.e(_context.t0); + + case 16: + _context.prev = 16; + + _iterator.f(); + + return _context.finish(16); + + case 19: + _context.next = 40; + break; + + case 21: + index = -1; + _iterator2 = _createForOfIteratorHelper(values); + _context.prev = 23; + + _iterator2.s(); + + case 25: + if ((_step2 = _iterator2.n()).done) { + _context.next = 32; + break; + } + + _value = _step2.value; + + if (!((_value = valueof(_value, ++index, values)) != null && (_value = +_value) >= _value)) { + _context.next = 30; + break; + } + + _context.next = 30; + return _value; + + case 30: + _context.next = 25; + break; + + case 32: + _context.next = 37; + break; + + case 34: + _context.prev = 34; + _context.t1 = _context["catch"](23); + + _iterator2.e(_context.t1); + + case 37: + _context.prev = 37; + + _iterator2.f(); + + return _context.finish(37); + + case 40: + case "end": + return _context.stop(); } - return lo; } - }; - } - - function ascendingComparator(f) { - return function(d, x) { - return d3_ascending(f(d), x); - }; + }, _marked$3, null, [[2, 13, 16, 19], [23, 34, 37, 40]]); } var ascendingBisect = d3_bisector(d3_ascending); var bisectRight = ascendingBisect.right; + d3_bisector(number$1).center; + + var anObject$2 = anObject$n; + var iteratorClose = iteratorClose$2; + + // call something on iterator step with safe closing on error + var callWithSafeIterationClosing$1 = function (iterator, fn, value, ENTRIES) { + try { + return ENTRIES ? fn(anObject$2(value)[0], value[1]) : fn(value); + } catch (error) { + iteratorClose(iterator, 'throw', error); + } + }; + + var global$c = global$1o; + var bind$5 = functionBindContext; + var call$3 = functionCall; + var toObject$3 = toObject$i; + var callWithSafeIterationClosing = callWithSafeIterationClosing$1; + var isArrayIteratorMethod = isArrayIteratorMethod$3; + var isConstructor = isConstructor$4; + var lengthOfArrayLike$3 = lengthOfArrayLike$i; + var createProperty = createProperty$5; + var getIterator = getIterator$4; + var getIteratorMethod = getIteratorMethod$5; + + var Array$1 = global$c.Array; + + // `Array.from` method implementation + // https://tc39.es/ecma262/#sec-array.from + var arrayFrom$1 = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) { + var O = toObject$3(arrayLike); + var IS_CONSTRUCTOR = isConstructor(this); + var argumentsLength = arguments.length; + var mapfn = argumentsLength > 1 ? arguments[1] : undefined; + var mapping = mapfn !== undefined; + if (mapping) mapfn = bind$5(mapfn, argumentsLength > 2 ? arguments[2] : undefined); + var iteratorMethod = getIteratorMethod(O); + var index = 0; + var length, result, step, iterator, next, value; + // if the target is not iterable or it's an array with the default iterator - use a simple case + if (iteratorMethod && !(this == Array$1 && isArrayIteratorMethod(iteratorMethod))) { + iterator = getIterator(O, iteratorMethod); + next = iterator.next; + result = IS_CONSTRUCTOR ? new this() : []; + for (;!(step = call$3(next, iterator)).done; index++) { + value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value; + createProperty(result, index, value); + } + } else { + length = lengthOfArrayLike$3(O); + result = IS_CONSTRUCTOR ? new this(length) : Array$1(length); + for (;length > index; index++) { + value = mapping ? mapfn(O[index], index) : O[index]; + createProperty(result, index, value); + } + } + result.length = index; + return result; + }; + + var $$D = _export; + var from = arrayFrom$1; + var checkCorrectnessOfIteration = checkCorrectnessOfIteration$4; + + var INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) { + // eslint-disable-next-line es/no-array-from -- required for testing + Array.from(iterable); + }); + + // `Array.from` method + // https://tc39.es/ecma262/#sec-array.from + $$D({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, { + from: from + }); + + var $$C = _export; + var fill = arrayFill$1; + var addToUnscopables$4 = addToUnscopables$6; + + // `Array.prototype.fill` method + // https://tc39.es/ecma262/#sec-array.prototype.fill + $$C({ target: 'Array', proto: true }, { + fill: fill + }); + + // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables + addToUnscopables$4('fill'); + + var $$B = _export; + var $some = arrayIteration.some; + var arrayMethodIsStrict$4 = arrayMethodIsStrict$9; + + var STRICT_METHOD$4 = arrayMethodIsStrict$4('some'); - function d3_descending(a, b) { + // `Array.prototype.some` method + // https://tc39.es/ecma262/#sec-array.prototype.some + $$B({ target: 'Array', proto: true, forced: !STRICT_METHOD$4 }, { + some: function some(callbackfn /* , thisArg */) { + return $some(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } + }); + + var TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = typedArrayConstructorsRequireWrappers; + var exportTypedArrayStaticMethod = arrayBufferViewCore.exportTypedArrayStaticMethod; + var typedArrayFrom = typedArrayFrom$2; + + // `%TypedArray%.from` method + // https://tc39.es/ecma262/#sec-%typedarray%.from + exportTypedArrayStaticMethod('from', typedArrayFrom, TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS); + + var createTypedArrayConstructor = typedArrayConstructor.exports; + + // `Float64Array` constructor + // https://tc39.es/ecma262/#sec-typedarray-objects + createTypedArrayConstructor('Float64', function (init) { + return function Float64Array(data, byteOffset, length) { + return init(this, data, byteOffset, length); + }; + }); + + function d3_descending (a, b) { return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; } - function number(x) { - return x === null ? NaN : +x; - } + // https://github.com/python/cpython/blob/a74eea238f5baba15797e2e8b570d153bc8690a7/Modules/mathmodule.c#L1423 + var Adder = /*#__PURE__*/function () { + function Adder() { + _classCallCheck$1(this, Adder); - function range$1(start, stop, step) { - start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step; + this._partials = new Float64Array(32); + this._n = 0; + } - var i = -1, - n = Math.max(0, Math.ceil((stop - start) / step)) | 0, - range = new Array(n); + _createClass$1(Adder, [{ + key: "add", + value: function add(x) { + var p = this._partials; + var i = 0; - while (++i < n) { - range[i] = start + i * step; + for (var j = 0; j < this._n && j < 32; j++) { + var y = p[j], + hi = x + y, + lo = Math.abs(x) < Math.abs(y) ? x - (hi - y) : y - (hi - x); + if (lo) p[i++] = lo; + x = hi; + } + + p[i] = x; + this._n = i + 1; + return this; + } + }, { + key: "valueOf", + value: function valueOf() { + var p = this._partials; + var n = this._n, + x, + y, + lo, + hi = 0; + + if (n > 0) { + hi = p[--n]; + + while (n > 0) { + x = hi; + y = p[--n]; + hi = x + y; + lo = y - (hi - x); + if (lo) break; + } + + if (n > 0 && (lo < 0 && p[n - 1] < 0 || lo > 0 && p[n - 1] > 0)) { + y = lo * 2; + x = hi + y; + if (y == x - hi) hi = x; + } + } + + return hi; + } + }]); + + return Adder; + }(); + + var $$A = _export; + var DESCRIPTORS$5 = descriptors; + var defineProperties$1 = objectDefineProperties.f; + + // `Object.defineProperties` method + // https://tc39.es/ecma262/#sec-object.defineproperties + // eslint-disable-next-line es/no-object-defineproperties -- safe + $$A({ target: 'Object', stat: true, forced: Object.defineProperties !== defineProperties$1, sham: !DESCRIPTORS$5 }, { + defineProperties: defineProperties$1 + }); + + var collection = collection$2; + var collectionStrong = collectionStrong$2; + + // `Map` constructor + // https://tc39.es/ecma262/#sec-map-objects + collection('Map', function (init) { + return function Map() { return init(this, arguments.length ? arguments[0] : undefined); }; + }, collectionStrong); + + var $$z = _export; + var uncurryThis$f = functionUncurryThis; + var aCallable$1 = aCallable$a; + var toObject$2 = toObject$i; + var lengthOfArrayLike$2 = lengthOfArrayLike$i; + var toString$a = toString$k; + var fails$b = fails$V; + var internalSort = arraySort$1; + var arrayMethodIsStrict$3 = arrayMethodIsStrict$9; + var FF = engineFfVersion; + var IE_OR_EDGE = engineIsIeOrEdge; + var V8 = engineV8Version; + var WEBKIT = engineWebkitVersion; + + var test = []; + var un$Sort = uncurryThis$f(test.sort); + var push$3 = uncurryThis$f(test.push); + + // IE8- + var FAILS_ON_UNDEFINED = fails$b(function () { + test.sort(undefined); + }); + // V8 bug + var FAILS_ON_NULL = fails$b(function () { + test.sort(null); + }); + // Old WebKit + var STRICT_METHOD$3 = arrayMethodIsStrict$3('sort'); + + var STABLE_SORT = !fails$b(function () { + // feature detection can be too slow, so check engines versions + if (V8) return V8 < 70; + if (FF && FF > 3) return; + if (IE_OR_EDGE) return true; + if (WEBKIT) return WEBKIT < 603; + + var result = ''; + var code, chr, value, index; + + // generate an array with more 512 elements (Chakra and old V8 fails only in this case) + for (code = 65; code < 76; code++) { + chr = String.fromCharCode(code); + + switch (code) { + case 66: case 69: case 70: case 72: value = 3; break; + case 68: case 71: value = 4; break; + default: value = 2; + } + + for (index = 0; index < 47; index++) { + test.push({ k: chr + index, v: value }); + } } - return range; - } + test.sort(function (a, b) { return b.v - a.v; }); + + for (index = 0; index < test.length; index++) { + chr = test[index].k.charAt(0); + if (result.charAt(result.length - 1) !== chr) result += chr; + } + + return result !== 'DGBEFHACIJK'; + }); + + var FORCED$7 = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || !STRICT_METHOD$3 || !STABLE_SORT; + + var getSortCompare = function (comparefn) { + return function (x, y) { + if (y === undefined) return -1; + if (x === undefined) return 1; + if (comparefn !== undefined) return +comparefn(x, y) || 0; + return toString$a(x) > toString$a(y) ? 1 : -1; + }; + }; + + // `Array.prototype.sort` method + // https://tc39.es/ecma262/#sec-array.prototype.sort + $$z({ target: 'Array', proto: true, forced: FORCED$7 }, { + sort: function sort(comparefn) { + if (comparefn !== undefined) aCallable$1(comparefn); + + var array = toObject$2(this); + + if (STABLE_SORT) return comparefn === undefined ? un$Sort(array) : un$Sort(array, comparefn); + + var items = []; + var arrayLength = lengthOfArrayLike$2(array); + var itemsLength, index; + + for (index = 0; index < arrayLength; index++) { + if (index in array) push$3(items, array[index]); + } + + internalSort(items, getSortCompare(comparefn)); + + itemsLength = items.length; + index = 0; + + while (index < itemsLength) array[index] = items[index++]; + while (index < arrayLength) delete array[index++]; + + return array; + } + }); var e10 = Math.sqrt(50), e5 = Math.sqrt(10), e2 = Math.sqrt(2); - - function ticks(start, stop, count) { + function ticks (start, stop, count) { var reverse, i = -1, n, ticks, step; - stop = +stop, start = +start, count = +count; - if (start === stop && count > 0) { return [start]; } - if (reverse = stop < start) { n = start, start = stop, stop = n; } - if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) { return []; } + if (start === stop && count > 0) return [start]; + if (reverse = stop < start) n = start, start = stop, stop = n; + if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return []; if (step > 0) { - start = Math.ceil(start / step); - stop = Math.floor(stop / step); - ticks = new Array(n = Math.ceil(stop - start + 1)); - while (++i < n) { ticks[i] = (start + i) * step; } + var r0 = Math.round(start / step), + r1 = Math.round(stop / step); + if (r0 * step < start) ++r0; + if (r1 * step > stop) --r1; + ticks = new Array(n = r1 - r0 + 1); + + while (++i < n) { + ticks[i] = (r0 + i) * step; + } } else { - start = Math.floor(start * step); - stop = Math.ceil(stop * step); - ticks = new Array(n = Math.ceil(start - stop + 1)); - while (++i < n) { ticks[i] = (start - i) / step; } - } + step = -step; + + var _r = Math.round(start * step), + _r2 = Math.round(stop * step); - if (reverse) { ticks.reverse(); } + if (_r / step < start) ++_r; + if (_r2 / step > stop) --_r2; + ticks = new Array(n = _r2 - _r + 1); + while (++i < n) { + ticks[i] = (_r + i) / step; + } + } + + if (reverse) ticks.reverse(); return ticks; } - function tickIncrement(start, stop, count) { var step = (stop - start) / Math.max(0, count), power = Math.floor(Math.log(step) / Math.LN10), error = step / Math.pow(10, power); - return power >= 0 - ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) - : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1); + return power >= 0 ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1); } - function tickStep(start, stop, count) { var step0 = Math.abs(stop - start) / Math.max(0, count), step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), error = step0 / step1; - if (error >= e10) { step1 *= 10; } - else if (error >= e5) { step1 *= 5; } - else if (error >= e2) { step1 *= 2; } + if (error >= e10) step1 *= 10;else if (error >= e5) step1 *= 5;else if (error >= e2) step1 *= 2; return stop < start ? -step1 : step1; } - function threshold(values, p, valueof) { - if (valueof == null) { valueof = number; } - if (!(n = values.length)) { return; } - if ((p = +p) <= 0 || n < 2) { return +valueof(values[0], 0, values); } - if (p >= 1) { return +valueof(values[n - 1], n - 1, values); } - var n, - i = (n - 1) * p, - i0 = Math.floor(i), - value0 = +valueof(values[i0], i0, values), - value1 = +valueof(values[i0 + 1], i0 + 1, values); - return value0 + (value1 - value0) * (i - i0); - } + function max(values, valueof) { + var max; - function d3_median(values, valueof) { - var n = values.length, - i = -1, - value, - numbers = []; + if (valueof === undefined) { + var _iterator = _createForOfIteratorHelper(values), + _step; - if (valueof == null) { - while (++i < n) { - if (!isNaN(value = number(values[i]))) { - numbers.push(value); + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var value = _step.value; + + if (value != null && (max < value || max === undefined && value >= value)) { + max = value; + } } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); } - } + } else { + var index = -1; - else { - while (++i < n) { - if (!isNaN(value = number(valueof(values[i], i, values)))) { - numbers.push(value); + var _iterator2 = _createForOfIteratorHelper(values), + _step2; + + try { + for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { + var _value = _step2.value; + + if ((_value = valueof(_value, ++index, values)) != null && (max < _value || max === undefined && _value >= _value)) { + max = _value; + } } + } catch (err) { + _iterator2.e(err); + } finally { + _iterator2.f(); } } - return threshold(numbers.sort(d3_ascending), 0.5); + return max; } - function merge(arrays) { - var n = arrays.length, - m, - i = -1, - j = 0, - merged, - array; + function min$2(values, valueof) { + var min; + + if (valueof === undefined) { + var _iterator = _createForOfIteratorHelper(values), + _step; - while (++i < n) { j += arrays[i].length; } - merged = new Array(j); + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var value = _step.value; - while (--n >= 0) { - array = arrays[n]; - m = array.length; - while (--m >= 0) { - merged[--j] = array[m]; + if (value != null && (min > value || min === undefined && value >= value)) { + min = value; + } + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); } - } + } else { + var index = -1; - return merged; - } + var _iterator2 = _createForOfIteratorHelper(values), + _step2; - function clip(pointVisible, clipLine, interpolate, start) { - return function(sink) { - var line = clipLine(sink), - ringBuffer = clipBuffer(), - ringSink = clipLine(ringBuffer), - polygonStarted = false, - polygon, - segments, - ring; + try { + for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { + var _value = _step2.value; - var clip = { - point: point, - lineStart: lineStart, - lineEnd: lineEnd, - polygonStart: function() { - clip.point = pointRing; - clip.lineStart = ringStart; - clip.lineEnd = ringEnd; - segments = []; - polygon = []; - }, - polygonEnd: function() { - clip.point = point; - clip.lineStart = lineStart; - clip.lineEnd = lineEnd; - segments = merge(segments); - var startInside = polygonContains(polygon, start); - if (segments.length) { - if (!polygonStarted) { sink.polygonStart(), polygonStarted = true; } - clipRejoin(segments, compareIntersection, startInside, interpolate, sink); - } else if (startInside) { - if (!polygonStarted) { sink.polygonStart(), polygonStarted = true; } - sink.lineStart(); - interpolate(null, null, 1, sink); - sink.lineEnd(); + if ((_value = valueof(_value, ++index, values)) != null && (min > _value || min === undefined && _value >= _value)) { + min = _value; } - if (polygonStarted) { sink.polygonEnd(), polygonStarted = false; } - segments = polygon = null; - }, - sphere: function() { - sink.polygonStart(); - sink.lineStart(); - interpolate(null, null, 1, sink); - sink.lineEnd(); - sink.polygonEnd(); } - }; - - function point(lambda, phi) { - if (pointVisible(lambda, phi)) { sink.point(lambda, phi); } - } - - function pointLine(lambda, phi) { - line.point(lambda, phi); + } catch (err) { + _iterator2.e(err); + } finally { + _iterator2.f(); } + } - function lineStart() { - clip.point = pointLine; - line.lineStart(); - } + return min; + } - function lineEnd() { - clip.point = point; - line.lineEnd(); - } + // ISC license, Copyright 2018 Vladimir Agafonkin. - function pointRing(lambda, phi) { - ring.push([lambda, phi]); - ringSink.point(lambda, phi); - } + function quickselect$3(array, k) { + var left = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + var right = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : array.length - 1; + var compare = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : d3_ascending; - function ringStart() { - ringSink.lineStart(); - ring = []; + while (right > left) { + if (right - left > 600) { + var n = right - left + 1; + var m = k - left + 1; + var z = Math.log(n); + var s = 0.5 * Math.exp(2 * z / 3); + var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); + var newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); + var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); + quickselect$3(array, k, newLeft, newRight, compare); } - function ringEnd() { - pointRing(ring[0][0], ring[0][1]); - ringSink.lineEnd(); - - var clean = ringSink.clean(), - ringSegments = ringBuffer.result(), - i, n = ringSegments.length, m, - segment, - point; + var t = array[k]; + var i = left; + var j = right; + swap$1(array, left, k); + if (compare(array[right], t) > 0) swap$1(array, left, right); - ring.pop(); - polygon.push(ring); - ring = null; + while (i < j) { + swap$1(array, i, j), ++i, --j; - if (!n) { return; } + while (compare(array[i], t) < 0) { + ++i; + } - // No intersections. - if (clean & 1) { - segment = ringSegments[0]; - if ((m = segment.length - 1) > 0) { - if (!polygonStarted) { sink.polygonStart(), polygonStarted = true; } - sink.lineStart(); - for (i = 0; i < m; ++i) { sink.point((point = segment[i])[0], point[1]); } - sink.lineEnd(); - } - return; + while (compare(array[j], t) > 0) { + --j; } + } - // Rejoin connected segments. - // TODO reuse ringBuffer.rejoin()? - if (n > 1 && clean & 2) { ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); } + if (compare(array[left], t) === 0) swap$1(array, left, j);else ++j, swap$1(array, j, right); + if (j <= k) left = j + 1; + if (k <= j) right = j - 1; + } - segments.push(ringSegments.filter(validSegment)); - } + return array; + } - return clip; - }; + function swap$1(array, i, j) { + var t = array[i]; + array[i] = array[j]; + array[j] = t; } - function validSegment(segment) { - return segment.length > 1; + function quantile(values, p, valueof) { + values = Float64Array.from(numbers(values, valueof)); + if (!(n = values.length)) return; + if ((p = +p) <= 0 || n < 2) return min$2(values); + if (p >= 1) return max(values); + var n, + i = (n - 1) * p, + i0 = Math.floor(i), + value0 = max(quickselect$3(values, i0).subarray(0, i0 + 1)), + value1 = min$2(values.subarray(i0 + 1)); + return value0 + (value1 - value0) * (i - i0); } - // Intersections are sorted along the clip edge. For both antimeridian cutting - // and circle clipping, the same comparison is used. - function compareIntersection(a, b) { - return ((a = a.x)[0] < 0 ? a[1] - halfPi - epsilon : halfPi - a[1]) - - ((b = b.x)[0] < 0 ? b[1] - halfPi - epsilon : halfPi - b[1]); + function d3_median (values, valueof) { + return quantile(values, 0.5, valueof); } - var clipAntimeridian = clip( - function() { return true; }, - clipAntimeridianLine, - clipAntimeridianInterpolate, - [-pi, -halfPi] - ); + var _marked$2 = /*#__PURE__*/regeneratorRuntime.mark(flatten); - // Takes a line and cuts into visible segments. Return values: 0 - there were - // intersections or the line was empty; 1 - no intersections; 2 - there were - // intersections, and the first and last segments should be rejoined. - function clipAntimeridianLine(stream) { - var lambda0 = NaN, - phi0 = NaN, - sign0 = NaN, - clean; // no intersections + function flatten(arrays) { + var _iterator, _step, array; - return { - lineStart: function() { - stream.lineStart(); - clean = 1; - }, - point: function(lambda1, phi1) { - var sign1 = lambda1 > 0 ? pi : -pi, - delta = abs$2(lambda1 - lambda0); - if (abs$2(delta - pi) < epsilon) { // line crosses a pole - stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi : -halfPi); - stream.point(sign0, phi0); - stream.lineEnd(); - stream.lineStart(); - stream.point(sign1, phi0); - stream.point(lambda1, phi0); - clean = 0; - } else if (sign0 !== sign1 && delta >= pi) { // line crosses antimeridian - if (abs$2(lambda0 - sign0) < epsilon) { lambda0 -= sign0 * epsilon; } // handle degeneracies - if (abs$2(lambda1 - sign1) < epsilon) { lambda1 -= sign1 * epsilon; } - phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1); - stream.point(sign0, phi0); - stream.lineEnd(); - stream.lineStart(); - stream.point(sign1, phi0); - clean = 0; - } - stream.point(lambda0 = lambda1, phi0 = phi1); - sign0 = sign1; - }, - lineEnd: function() { - stream.lineEnd(); - lambda0 = phi0 = NaN; - }, - clean: function() { - return 2 - clean; // if intersections, rejoin first and last segments - } - }; - } + return regeneratorRuntime.wrap(function flatten$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _iterator = _createForOfIteratorHelper(arrays); + _context.prev = 1; - function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) { - var cosPhi0, - cosPhi1, - sinLambda0Lambda1 = sin(lambda0 - lambda1); - return abs$2(sinLambda0Lambda1) > epsilon - ? atan((sin(phi0) * (cosPhi1 = cos(phi1)) * sin(lambda1) - - sin(phi1) * (cosPhi0 = cos(phi0)) * sin(lambda0)) - / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) - : (phi0 + phi1) / 2; - } + _iterator.s(); - function clipAntimeridianInterpolate(from, to, direction, stream) { - var phi; - if (from == null) { - phi = direction * halfPi; - stream.point(-pi, phi); - stream.point(0, phi); - stream.point(pi, phi); - stream.point(pi, 0); - stream.point(pi, -phi); - stream.point(0, -phi); - stream.point(-pi, -phi); - stream.point(-pi, 0); - stream.point(-pi, phi); - } else if (abs$2(from[0] - to[0]) > epsilon) { - var lambda = from[0] < to[0] ? pi : -pi; - phi = direction * lambda / 2; - stream.point(-lambda, phi); - stream.point(0, phi); - stream.point(lambda, phi); - } else { - stream.point(to[0], to[1]); - } - } - - function clipCircle(radius) { - var cr = cos(radius), - delta = 6 * radians, - smallRadius = cr > 0, - notHemisphere = abs$2(cr) > epsilon; // TODO optimise for this common case - - function interpolate(from, to, direction, stream) { - circleStream(stream, radius, delta, direction, from, to); - } - - function visible(lambda, phi) { - return cos(lambda) * cos(phi) > cr; - } - - // Takes a line and cuts into visible segments. Return values used for polygon - // clipping: 0 - there were intersections or the line was empty; 1 - no - // intersections 2 - there were intersections, and the first and last segments - // should be rejoined. - function clipLine(stream) { - var point0, // previous point - c0, // code for previous point - v0, // visibility of previous point - v00, // visibility of first point - clean; // no intersections - return { - lineStart: function() { - v00 = v0 = false; - clean = 1; - }, - point: function(lambda, phi) { - var point1 = [lambda, phi], - point2, - v = visible(lambda, phi), - c = smallRadius - ? v ? 0 : code(lambda, phi) - : v ? code(lambda + (lambda < 0 ? pi : -pi), phi) : 0; - if (!point0 && (v00 = v0 = v)) { stream.lineStart(); } - if (v !== v0) { - point2 = intersect(point0, point1); - if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) - { point1[2] = 1; } - } - if (v !== v0) { - clean = 0; - if (v) { - // outside going in - stream.lineStart(); - point2 = intersect(point1, point0); - stream.point(point2[0], point2[1]); - } else { - // inside going out - point2 = intersect(point0, point1); - stream.point(point2[0], point2[1], 2); - stream.lineEnd(); - } - point0 = point2; - } else if (notHemisphere && point0 && smallRadius ^ v) { - var t; - // If the codes for two points are different, or are both zero, - // and there this segment intersects with the small circle. - if (!(c & c0) && (t = intersect(point1, point0, true))) { - clean = 0; - if (smallRadius) { - stream.lineStart(); - stream.point(t[0][0], t[0][1]); - stream.point(t[1][0], t[1][1]); - stream.lineEnd(); - } else { - stream.point(t[1][0], t[1][1]); - stream.lineEnd(); - stream.lineStart(); - stream.point(t[0][0], t[0][1], 3); - } + case 3: + if ((_step = _iterator.n()).done) { + _context.next = 8; + break; } - } - if (v && (!point0 || !pointEqual(point0, point1))) { - stream.point(point1[0], point1[1]); - } - point0 = point1, v0 = v, c0 = c; - }, - lineEnd: function() { - if (v0) { stream.lineEnd(); } - point0 = null; - }, - // Rejoin first and last segments if there were intersections and the first - // and last points were visible. - clean: function() { - return clean | ((v00 && v0) << 1); - } - }; - } - - // Intersects the great circle between a and b with the clip circle. - function intersect(a, b, two) { - var pa = cartesian(a), - pb = cartesian(b); - - // We have two planes, n1.p = d1 and n2.p = d2. - // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2). - var n1 = [1, 0, 0], // normal - n2 = cartesianCross(pa, pb), - n2n2 = cartesianDot(n2, n2), - n1n2 = n2[0], // cartesianDot(n1, n2), - determinant = n2n2 - n1n2 * n1n2; - - // Two polar points. - if (!determinant) { return !two && a; } - var c1 = cr * n2n2 / determinant, - c2 = -cr * n1n2 / determinant, - n1xn2 = cartesianCross(n1, n2), - A = cartesianScale(n1, c1), - B = cartesianScale(n2, c2); - cartesianAddInPlace(A, B); - - // Solve |p(t)|^2 = 1. - var u = n1xn2, - w = cartesianDot(A, u), - uu = cartesianDot(u, u), - t2 = w * w - uu * (cartesianDot(A, A) - 1); + array = _step.value; + return _context.delegateYield(array, "t0", 6); - if (t2 < 0) { return; } + case 6: + _context.next = 3; + break; - var t = sqrt(t2), - q = cartesianScale(u, (-w - t) / uu); - cartesianAddInPlace(q, A); - q = spherical(q); + case 8: + _context.next = 13; + break; - if (!two) { return q; } + case 10: + _context.prev = 10; + _context.t1 = _context["catch"](1); - // Two intersection points. - var lambda0 = a[0], - lambda1 = b[0], - phi0 = a[1], - phi1 = b[1], - z; + _iterator.e(_context.t1); - if (lambda1 < lambda0) { z = lambda0, lambda0 = lambda1, lambda1 = z; } + case 13: + _context.prev = 13; - var delta = lambda1 - lambda0, - polar = abs$2(delta - pi) < epsilon, - meridian = polar || delta < epsilon; + _iterator.f(); - if (!polar && phi1 < phi0) { z = phi0, phi0 = phi1, phi1 = z; } + return _context.finish(13); - // Check that the first point is between a and b. - if (meridian - ? polar - ? phi0 + phi1 > 0 ^ q[1] < (abs$2(q[0] - lambda0) < epsilon ? phi0 : phi1) - : phi0 <= q[1] && q[1] <= phi1 - : delta > pi ^ (lambda0 <= q[0] && q[0] <= lambda1)) { - var q1 = cartesianScale(u, (-w + t) / uu); - cartesianAddInPlace(q1, A); - return [q, spherical(q1)]; + case 16: + case "end": + return _context.stop(); + } } - } - - // Generates a 4-bit vector representing the location of a point relative to - // the small circle's bounding box. - function code(lambda, phi) { - var r = smallRadius ? radius : pi - radius, - code = 0; - if (lambda < -r) { code |= 1; } // left - else if (lambda > r) { code |= 2; } // right - if (phi < -r) { code |= 4; } // below - else if (phi > r) { code |= 8; } // above - return code; - } - - return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi, radius - pi]); + }, _marked$2, null, [[1, 10, 13, 16]]); } - function clipLine(a, b, x0, y0, x1, y1) { - var ax = a[0], - ay = a[1], - bx = b[0], - by = b[1], - t0 = 0, - t1 = 1, - dx = bx - ax, - dy = by - ay, - r; - - r = x0 - ax; - if (!dx && r > 0) { return; } - r /= dx; - if (dx < 0) { - if (r < t0) { return; } - if (r < t1) { t1 = r; } - } else if (dx > 0) { - if (r > t1) { return; } - if (r > t0) { t0 = r; } - } - - r = x1 - ax; - if (!dx && r < 0) { return; } - r /= dx; - if (dx < 0) { - if (r > t1) { return; } - if (r > t0) { t0 = r; } - } else if (dx > 0) { - if (r < t0) { return; } - if (r < t1) { t1 = r; } - } + function merge$4(arrays) { + return Array.from(flatten(arrays)); + } - r = y0 - ay; - if (!dy && r > 0) { return; } - r /= dy; - if (dy < 0) { - if (r < t0) { return; } - if (r < t1) { t1 = r; } - } else if (dy > 0) { - if (r > t1) { return; } - if (r > t0) { t0 = r; } - } + function range$1 (start, stop, step) { + start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step; + var i = -1, + n = Math.max(0, Math.ceil((stop - start) / step)) | 0, + range = new Array(n); - r = y1 - ay; - if (!dy && r < 0) { return; } - r /= dy; - if (dy < 0) { - if (r > t1) { return; } - if (r > t0) { t0 = r; } - } else if (dy > 0) { - if (r < t0) { return; } - if (r < t1) { t1 = r; } + while (++i < n) { + range[i] = start + i * step; } - if (t0 > 0) { a[0] = ax + t0 * dx, a[1] = ay + t0 * dy; } - if (t1 < 1) { b[0] = ax + t1 * dx, b[1] = ay + t1 * dy; } - return true; + return range; } - var clipMax = 1e9, clipMin = -clipMax; - - // TODO Use d3-polygon’s polygonContains here for the ring check? - // TODO Eliminate duplicate buffering in clipBuffer and polygon.push? - - function clipRectangle(x0, y0, x1, y1) { + // `SameValue` abstract operation + // https://tc39.es/ecma262/#sec-samevalue + // eslint-disable-next-line es/no-object-is -- safe + var sameValue$1 = Object.is || function is(x, y) { + // eslint-disable-next-line no-self-compare -- NaN check + return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y; + }; - function visible(x, y) { - return x0 <= x && x <= x1 && y0 <= y && y <= y1; - } + var $$y = _export; - function interpolate(from, to, direction, stream) { - var a = 0, a1 = 0; - if (from == null - || (a = corner(from, direction)) !== (a1 = corner(to, direction)) - || comparePoint(from, to) < 0 ^ direction > 0) { - do { stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0); } - while ((a = (a + direction + 4) % 4) !== a1); - } else { - stream.point(to[0], to[1]); - } - } + // eslint-disable-next-line es/no-math-hypot -- required for testing + var $hypot = Math.hypot; + var abs$3 = Math.abs; + var sqrt$1 = Math.sqrt; - function corner(p, direction) { - return abs$2(p[0] - x0) < epsilon ? direction > 0 ? 0 : 3 - : abs$2(p[0] - x1) < epsilon ? direction > 0 ? 2 : 1 - : abs$2(p[1] - y0) < epsilon ? direction > 0 ? 1 : 0 - : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon - } + // Chrome 77 bug + // https://bugs.chromium.org/p/v8/issues/detail?id=9546 + var BUGGY = !!$hypot && $hypot(Infinity, NaN) !== Infinity; - function compareIntersection(a, b) { - return comparePoint(a.x, b.x); + // `Math.hypot` method + // https://tc39.es/ecma262/#sec-math.hypot + $$y({ target: 'Math', stat: true, forced: BUGGY }, { + // eslint-disable-next-line no-unused-vars -- required for `.length` + hypot: function hypot(value1, value2) { + var sum = 0; + var i = 0; + var aLen = arguments.length; + var larg = 0; + var arg, div; + while (i < aLen) { + arg = abs$3(arguments[i++]); + if (larg < arg) { + div = larg / arg; + sum = sum * div * div + 1; + larg = arg; + } else if (arg > 0) { + div = arg / larg; + sum += div * div; + } else sum += arg; + } + return larg === Infinity ? Infinity : larg * sqrt$1(sum); } + }); - function comparePoint(a, b) { - var ca = corner(a, 1), - cb = corner(b, 1); - return ca !== cb ? ca - cb - : ca === 0 ? b[1] - a[1] - : ca === 1 ? a[0] - b[0] - : ca === 2 ? a[1] - b[1] - : b[0] - a[0]; - } + // `Math.sign` method implementation + // https://tc39.es/ecma262/#sec-math.sign + // eslint-disable-next-line es/no-math-sign -- safe + var mathSign = Math.sign || function sign(x) { + // eslint-disable-next-line no-self-compare -- NaN check + return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1; + }; - return function(stream) { - var activeStream = stream, - bufferStream = clipBuffer(), - segments, - polygon, - ring, - x__, y__, v__, // first point - x_, y_, v_, // previous point - first, - clean; + var $$x = _export; + var sign$1 = mathSign; - var clipStream = { - point: point, - lineStart: lineStart, - lineEnd: lineEnd, - polygonStart: polygonStart, - polygonEnd: polygonEnd - }; + // `Math.sign` method + // https://tc39.es/ecma262/#sec-math.sign + $$x({ target: 'Math', stat: true }, { + sign: sign$1 + }); - function point(x, y) { - if (visible(x, y)) { activeStream.point(x, y); } - } + var epsilon$1 = 1e-6; + var epsilon2$1 = 1e-12; + var pi = Math.PI; + var halfPi = pi / 2; + var quarterPi = pi / 4; + var tau = pi * 2; + var degrees$1 = 180 / pi; + var radians = pi / 180; + var abs$2 = Math.abs; + var atan = Math.atan; + var atan2 = Math.atan2; + var cos = Math.cos; + var exp$2 = Math.exp; + var log$1 = Math.log; + var sin = Math.sin; + var sign = Math.sign || function (x) { + return x > 0 ? 1 : x < 0 ? -1 : 0; + }; + var sqrt = Math.sqrt; + var tan = Math.tan; + function acos(x) { + return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); + } + function asin(x) { + return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x); + } - function polygonInside() { - var winding = 0; + function noop$1() {} - for (var i = 0, n = polygon.length; i < n; ++i) { - for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) { - a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1]; - if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) { ++winding; } } - else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) { --winding; } } - } - } + function streamGeometry(geometry, stream) { + if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) { + streamGeometryType[geometry.type](geometry, stream); + } + } - return winding; - } + var streamObjectType = { + Feature: function Feature(object, stream) { + streamGeometry(object.geometry, stream); + }, + FeatureCollection: function FeatureCollection(object, stream) { + var features = object.features, + i = -1, + n = features.length; - // Buffer geometry within a polygon and then clip it en masse. - function polygonStart() { - activeStream = bufferStream, segments = [], polygon = [], clean = true; + while (++i < n) { + streamGeometry(features[i].geometry, stream); } + } + }; + var streamGeometryType = { + Sphere: function Sphere(object, stream) { + stream.sphere(); + }, + Point: function Point(object, stream) { + object = object.coordinates; + stream.point(object[0], object[1], object[2]); + }, + MultiPoint: function MultiPoint(object, stream) { + var coordinates = object.coordinates, + i = -1, + n = coordinates.length; - function polygonEnd() { - var startInside = polygonInside(), - cleanInside = clean && startInside, - visible = (segments = merge(segments)).length; - if (cleanInside || visible) { - stream.polygonStart(); - if (cleanInside) { - stream.lineStart(); - interpolate(null, null, 1, stream); - stream.lineEnd(); - } - if (visible) { - clipRejoin(segments, compareIntersection, startInside, interpolate, stream); - } - stream.polygonEnd(); - } - activeStream = stream, segments = polygon = ring = null; + while (++i < n) { + object = coordinates[i], stream.point(object[0], object[1], object[2]); } + }, + LineString: function LineString(object, stream) { + streamLine(object.coordinates, stream, 0); + }, + MultiLineString: function MultiLineString(object, stream) { + var coordinates = object.coordinates, + i = -1, + n = coordinates.length; - function lineStart() { - clipStream.point = linePoint; - if (polygon) { polygon.push(ring = []); } - first = true; - v_ = false; - x_ = y_ = NaN; + while (++i < n) { + streamLine(coordinates[i], stream, 0); } + }, + Polygon: function Polygon(object, stream) { + streamPolygon(object.coordinates, stream); + }, + MultiPolygon: function MultiPolygon(object, stream) { + var coordinates = object.coordinates, + i = -1, + n = coordinates.length; - // TODO rather than special-case polygons, simply handle them separately. - // Ideally, coincident intersection points should be jittered to avoid - // clipping issues. - function lineEnd() { - if (segments) { - linePoint(x__, y__); - if (v__ && v_) { bufferStream.rejoin(); } - segments.push(bufferStream.result()); - } - clipStream.point = point; - if (v_) { activeStream.lineEnd(); } + while (++i < n) { + streamPolygon(coordinates[i], stream); } + }, + GeometryCollection: function GeometryCollection(object, stream) { + var geometries = object.geometries, + i = -1, + n = geometries.length; - function linePoint(x, y) { - var v = visible(x, y); - if (polygon) { ring.push([x, y]); } - if (first) { - x__ = x, y__ = y, v__ = v; - first = false; - if (v) { - activeStream.lineStart(); - activeStream.point(x, y); - } - } else { - if (v && v_) { activeStream.point(x, y); } - else { - var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], - b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))]; - if (clipLine(a, b, x0, y0, x1, y1)) { - if (!v_) { - activeStream.lineStart(); - activeStream.point(a[0], a[1]); - } - activeStream.point(b[0], b[1]); - if (!v) { activeStream.lineEnd(); } - clean = false; - } else if (v) { - activeStream.lineStart(); - activeStream.point(x, y); - clean = false; - } - } - } - x_ = x, y_ = y, v_ = v; + while (++i < n) { + streamGeometry(geometries[i], stream); } - - return clipStream; - }; - } - - var lengthSum = adder(), - lambda0$2, - sinPhi0$1, - cosPhi0$1; - - var lengthStream = { - sphere: noop$2, - point: noop$2, - lineStart: lengthLineStart, - lineEnd: noop$2, - polygonStart: noop$2, - polygonEnd: noop$2 + } }; - function lengthLineStart() { - lengthStream.point = lengthPointFirst; - lengthStream.lineEnd = lengthLineEnd; - } + function streamLine(coordinates, stream, closed) { + var i = -1, + n = coordinates.length - closed, + coordinate; + stream.lineStart(); - function lengthLineEnd() { - lengthStream.point = lengthStream.lineEnd = noop$2; - } + while (++i < n) { + coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]); + } - function lengthPointFirst(lambda, phi) { - lambda *= radians, phi *= radians; - lambda0$2 = lambda, sinPhi0$1 = sin(phi), cosPhi0$1 = cos(phi); - lengthStream.point = lengthPoint; + stream.lineEnd(); } - function lengthPoint(lambda, phi) { - lambda *= radians, phi *= radians; - var sinPhi = sin(phi), - cosPhi = cos(phi), - delta = abs$2(lambda - lambda0$2), - cosDelta = cos(delta), - sinDelta = sin(delta), - x = cosPhi * sinDelta, - y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta, - z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta; - lengthSum.add(atan2(sqrt(x * x + y * y), z)); - lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi; - } + function streamPolygon(coordinates, stream) { + var i = -1, + n = coordinates.length; + stream.polygonStart(); - function d3_geoLength(object) { - lengthSum.reset(); - d3_geoStream(object, lengthStream); - return +lengthSum; + while (++i < n) { + streamLine(coordinates[i], stream, 1); + } + + stream.polygonEnd(); } - function identity(x) { - return x; + function d3_geoStream (object, stream) { + if (object && streamObjectType.hasOwnProperty(object.type)) { + streamObjectType[object.type](object, stream); + } else { + streamGeometry(object, stream); + } } - var areaSum$1 = adder(), - areaRingSum$1 = adder(), - x00, - y00, - x0$1, - y0$1; + var areaRingSum$1 = new Adder(); // hello? + var areaSum$1 = new Adder(), + lambda00$1, + phi00$1, + lambda0$2, + cosPhi0$1, + sinPhi0$1; var areaStream$1 = { - point: noop$2, - lineStart: noop$2, - lineEnd: noop$2, - polygonStart: function() { + point: noop$1, + lineStart: noop$1, + lineEnd: noop$1, + polygonStart: function polygonStart() { + areaRingSum$1 = new Adder(); areaStream$1.lineStart = areaRingStart$1; areaStream$1.lineEnd = areaRingEnd$1; }, - polygonEnd: function() { - areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop$2; - areaSum$1.add(abs$2(areaRingSum$1)); - areaRingSum$1.reset(); + polygonEnd: function polygonEnd() { + var areaRing = +areaRingSum$1; + areaSum$1.add(areaRing < 0 ? tau + areaRing : areaRing); + this.lineStart = this.lineEnd = this.point = noop$1; }, - result: function() { - var area = areaSum$1 / 2; - areaSum$1.reset(); - return area; + sphere: function sphere() { + areaSum$1.add(tau); } }; @@ -8136,52625 +10771,66375 @@ areaStream$1.point = areaPointFirst$1; } - function areaPointFirst$1(x, y) { + function areaRingEnd$1() { + areaPoint$1(lambda00$1, phi00$1); + } + + function areaPointFirst$1(lambda, phi) { areaStream$1.point = areaPoint$1; - x00 = x0$1 = x, y00 = y0$1 = y; + lambda00$1 = lambda, phi00$1 = phi; + lambda *= radians, phi *= radians; + lambda0$2 = lambda, cosPhi0$1 = cos(phi = phi / 2 + quarterPi), sinPhi0$1 = sin(phi); } - function areaPoint$1(x, y) { - areaRingSum$1.add(y0$1 * x - x0$1 * y); - x0$1 = x, y0$1 = y; + function areaPoint$1(lambda, phi) { + lambda *= radians, phi *= radians; + phi = phi / 2 + quarterPi; // half the angular distance from south pole + // Spherical excess E for a spherical triangle with vertices: south pole, + // previous point, current point. Uses a formula derived from Cagnoli’s + // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2). + + var dLambda = lambda - lambda0$2, + sdLambda = dLambda >= 0 ? 1 : -1, + adLambda = sdLambda * dLambda, + cosPhi = cos(phi), + sinPhi = sin(phi), + k = sinPhi0$1 * sinPhi, + u = cosPhi0$1 * cosPhi + k * cos(adLambda), + v = k * sdLambda * sin(adLambda); + areaRingSum$1.add(atan2(v, u)); // Advance the previous points. + + lambda0$2 = lambda, cosPhi0$1 = cosPhi, sinPhi0$1 = sinPhi; } - function areaRingEnd$1() { - areaPoint$1(x00, y00); + function d3_geoArea (object) { + areaSum$1 = new Adder(); + d3_geoStream(object, areaStream$1); + return areaSum$1 * 2; } - var x0$2 = Infinity, - y0$2 = x0$2, - x1 = -x0$2, - y1 = x1; + function spherical(cartesian) { + return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])]; + } + function cartesian(spherical) { + var lambda = spherical[0], + phi = spherical[1], + cosPhi = cos(phi); + return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)]; + } + function cartesianDot(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + } + function cartesianCross(a, b) { + 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]]; + } // TODO return a + + function cartesianAddInPlace(a, b) { + a[0] += b[0], a[1] += b[1], a[2] += b[2]; + } + function cartesianScale(vector, k) { + return [vector[0] * k, vector[1] * k, vector[2] * k]; + } // TODO return d + + function cartesianNormalizeInPlace(d) { + var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); + d[0] /= l, d[1] /= l, d[2] /= l; + } + var lambda0$1, phi0, lambda1, phi1, // bounds + lambda2, // previous lambda-coordinate + lambda00, phi00, // first point + p0, // previous 3D point + deltaSum, ranges, range; var boundsStream$1 = { point: boundsPoint$1, - lineStart: noop$2, - lineEnd: noop$2, - polygonStart: noop$2, - polygonEnd: noop$2, - result: function() { - var bounds = [[x0$2, y0$2], [x1, y1]]; - x1 = y1 = -(y0$2 = x0$2 = Infinity); - return bounds; + lineStart: boundsLineStart, + lineEnd: boundsLineEnd, + polygonStart: function polygonStart() { + boundsStream$1.point = boundsRingPoint; + boundsStream$1.lineStart = boundsRingStart; + boundsStream$1.lineEnd = boundsRingEnd; + deltaSum = new Adder(); + areaStream$1.polygonStart(); + }, + polygonEnd: function polygonEnd() { + areaStream$1.polygonEnd(); + boundsStream$1.point = boundsPoint$1; + boundsStream$1.lineStart = boundsLineStart; + boundsStream$1.lineEnd = boundsLineEnd; + if (areaRingSum$1 < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90);else if (deltaSum > epsilon$1) phi1 = 90;else if (deltaSum < -epsilon$1) phi0 = -90; + range[0] = lambda0$1, range[1] = lambda1; + }, + sphere: function sphere() { + lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); } }; - function boundsPoint$1(x, y) { - if (x < x0$2) { x0$2 = x; } - if (x > x1) { x1 = x; } - if (y < y0$2) { y0$2 = y; } - if (y > y1) { y1 = y; } + function boundsPoint$1(lambda, phi) { + ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; } - // TODO Enforce positive area for exterior, negative area for interior? + function linePoint(lambda, phi) { + var p = cartesian([lambda * radians, phi * radians]); - var X0$1 = 0, - Y0$1 = 0, - Z0$1 = 0, - X1$1 = 0, - Y1$1 = 0, - Z1$1 = 0, - X2$1 = 0, - Y2$1 = 0, - Z2$1 = 0, - x00$1, - y00$1, - x0$3, - y0$3; + if (p0) { + var normal = cartesianCross(p0, p), + equatorial = [normal[1], -normal[0], 0], + inflection = cartesianCross(equatorial, normal); + cartesianNormalizeInPlace(inflection); + inflection = spherical(inflection); + var delta = lambda - lambda2, + sign = delta > 0 ? 1 : -1, + lambdai = inflection[0] * degrees$1 * sign, + phii, + antimeridian = abs$2(delta) > 180; - var centroidStream$1 = { - point: centroidPoint$1, - lineStart: centroidLineStart$1, - lineEnd: centroidLineEnd$1, - polygonStart: function() { - centroidStream$1.lineStart = centroidRingStart$1; - centroidStream$1.lineEnd = centroidRingEnd$1; - }, - polygonEnd: function() { - centroidStream$1.point = centroidPoint$1; - centroidStream$1.lineStart = centroidLineStart$1; - centroidStream$1.lineEnd = centroidLineEnd$1; - }, - result: function() { - var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1] - : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1] - : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1] - : [NaN, NaN]; - X0$1 = Y0$1 = Z0$1 = - X1$1 = Y1$1 = Z1$1 = - X2$1 = Y2$1 = Z2$1 = 0; - return centroid; + if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = inflection[1] * degrees$1; + if (phii > phi1) phi1 = phii; + } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = -inflection[1] * degrees$1; + if (phii < phi0) phi0 = phii; + } else { + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + } + + if (antimeridian) { + if (lambda < lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; + } + } else { + if (lambda1 >= lambda0$1) { + if (lambda < lambda0$1) lambda0$1 = lambda; + if (lambda > lambda1) lambda1 = lambda; + } else { + if (lambda > lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; + } + } + } + } else { + ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); } - }; - function centroidPoint$1(x, y) { - X0$1 += x; - Y0$1 += y; - ++Z0$1; + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + p0 = p, lambda2 = lambda; } - function centroidLineStart$1() { - centroidStream$1.point = centroidPointFirstLine; + function boundsLineStart() { + boundsStream$1.point = linePoint; } - function centroidPointFirstLine(x, y) { - centroidStream$1.point = centroidPointLine; - centroidPoint$1(x0$3 = x, y0$3 = y); + function boundsLineEnd() { + range[0] = lambda0$1, range[1] = lambda1; + boundsStream$1.point = boundsPoint$1; + p0 = null; } - function centroidPointLine(x, y) { - var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy); - X1$1 += z * (x0$3 + x) / 2; - Y1$1 += z * (y0$3 + y) / 2; - Z1$1 += z; - centroidPoint$1(x0$3 = x, y0$3 = y); + function boundsRingPoint(lambda, phi) { + if (p0) { + var delta = lambda - lambda2; + deltaSum.add(abs$2(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta); + } else { + lambda00 = lambda, phi00 = phi; + } + + areaStream$1.point(lambda, phi); + linePoint(lambda, phi); } - function centroidLineEnd$1() { - centroidStream$1.point = centroidPoint$1; + function boundsRingStart() { + areaStream$1.lineStart(); } - function centroidRingStart$1() { - centroidStream$1.point = centroidPointFirstRing; + function boundsRingEnd() { + boundsRingPoint(lambda00, phi00); + areaStream$1.lineEnd(); + if (abs$2(deltaSum) > epsilon$1) lambda0$1 = -(lambda1 = 180); + range[0] = lambda0$1, range[1] = lambda1; + p0 = null; + } // Finds the left-right distance between two longitudes. + // This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want + // the distance between ±180° to be 360°. + + + function angle(lambda0, lambda1) { + return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1; } - function centroidRingEnd$1() { - centroidPointRing(x00$1, y00$1); + function rangeCompare(a, b) { + return a[0] - b[0]; } - function centroidPointFirstRing(x, y) { - centroidStream$1.point = centroidPointRing; - centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y); + function rangeContains(range, x) { + return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x; } - function centroidPointRing(x, y) { - var dx = x - x0$3, - dy = y - y0$3, - z = sqrt(dx * dx + dy * dy); + function d3_geoBounds (feature) { + var i, n, a, b, merged, deltaMax, delta; + phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity); + ranges = []; + d3_geoStream(feature, boundsStream$1); // First, sort ranges by their minimum longitudes. - X1$1 += z * (x0$3 + x) / 2; - Y1$1 += z * (y0$3 + y) / 2; - Z1$1 += z; + if (n = ranges.length) { + ranges.sort(rangeCompare); // Then, merge any ranges that overlap. - z = y0$3 * x - x0$3 * y; - X2$1 += z * (x0$3 + x); - Y2$1 += z * (y0$3 + y); - Z2$1 += z * 3; - centroidPoint$1(x0$3 = x, y0$3 = y); - } + for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) { + b = ranges[i]; - function PathContext(context) { - this._context = context; - } - - PathContext.prototype = { - _radius: 4.5, - pointRadius: function(_) { - return this._radius = _, this; - }, - polygonStart: function() { - this._line = 0; - }, - polygonEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._point = 0; - }, - lineEnd: function() { - if (this._line === 0) { this._context.closePath(); } - this._point = NaN; - }, - point: function(x, y) { - switch (this._point) { - case 0: { - this._context.moveTo(x, y); - this._point = 1; - break; - } - case 1: { - this._context.lineTo(x, y); - break; - } - default: { - this._context.moveTo(x + this._radius, y); - this._context.arc(x, y, this._radius, 0, tau); - break; + if (rangeContains(a, b[0]) || rangeContains(a, b[1])) { + if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1]; + if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0]; + } else { + merged.push(a = b); } + } // Finally, find the largest gap between the merged ranges. + // The final bounding box will be the inverse of this gap. + + + for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) { + b = merged[i]; + if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1]; } - }, - result: noop$2 - }; + } - var lengthSum$1 = adder(), - lengthRing, - x00$2, - y00$2, - x0$4, - y0$4; + ranges = range = null; + return lambda0$1 === Infinity || phi0 === Infinity ? [[NaN, NaN], [NaN, NaN]] : [[lambda0$1, phi0], [lambda1, phi1]]; + } - var lengthStream$1 = { - point: noop$2, - lineStart: function() { - lengthStream$1.point = lengthPointFirst$1; - }, - lineEnd: function() { - if (lengthRing) { lengthPoint$1(x00$2, y00$2); } - lengthStream$1.point = noop$2; - }, - polygonStart: function() { - lengthRing = true; - }, - polygonEnd: function() { - lengthRing = null; - }, - result: function() { - var length = +lengthSum$1; - lengthSum$1.reset(); - return length; + function compose (a, b) { + function compose(x, y) { + return x = a(x, y), b(x[0], x[1]); } - }; - function lengthPointFirst$1(x, y) { - lengthStream$1.point = lengthPoint$1; - x00$2 = x0$4 = x, y00$2 = y0$4 = y; + if (a.invert && b.invert) compose.invert = function (x, y) { + return x = b.invert(x, y), x && a.invert(x[0], x[1]); + }; + return compose; } - function lengthPoint$1(x, y) { - x0$4 -= x, y0$4 -= y; - lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4)); - x0$4 = x, y0$4 = y; + function rotationIdentity(lambda, phi) { + return [abs$2(lambda) > pi ? lambda + Math.round(-lambda / tau) * tau : lambda, phi]; } - function PathString() { - this._string = []; + rotationIdentity.invert = rotationIdentity; + function rotateRadians(deltaLambda, deltaPhi, deltaGamma) { + return (deltaLambda %= tau) ? deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) : rotationLambda(deltaLambda) : deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) : rotationIdentity; } - PathString.prototype = { - _radius: 4.5, - _circle: circle(4.5), - pointRadius: function(_) { - if ((_ = +_) !== this._radius) { this._radius = _, this._circle = null; } - return this; - }, - polygonStart: function() { - this._line = 0; - }, - polygonEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._point = 0; - }, - lineEnd: function() { - if (this._line === 0) { this._string.push("Z"); } - this._point = NaN; - }, - point: function(x, y) { - switch (this._point) { - case 0: { - this._string.push("M", x, ",", y); - this._point = 1; - break; - } - case 1: { - this._string.push("L", x, ",", y); - break; - } - default: { - if (this._circle == null) { this._circle = circle(this._radius); } - this._string.push("M", x, ",", y, this._circle); - break; - } - } - }, - result: function() { - if (this._string.length) { - var result = this._string.join(""); - this._string = []; - return result; - } else { - return null; - } - } - }; + function forwardRotationLambda(deltaLambda) { + return function (lambda, phi) { + return lambda += deltaLambda, [lambda > pi ? lambda - tau : lambda < -pi ? lambda + tau : lambda, phi]; + }; + } - function circle(radius) { - return "m0," + radius - + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius - + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius - + "z"; + function rotationLambda(deltaLambda) { + var rotation = forwardRotationLambda(deltaLambda); + rotation.invert = forwardRotationLambda(-deltaLambda); + return rotation; } - function d3_geoPath(projection, context) { - var pointRadius = 4.5, - projectionStream, - contextStream; + function rotationPhiGamma(deltaPhi, deltaGamma) { + var cosDeltaPhi = cos(deltaPhi), + sinDeltaPhi = sin(deltaPhi), + cosDeltaGamma = cos(deltaGamma), + sinDeltaGamma = sin(deltaGamma); - function path(object) { - if (object) { - if (typeof pointRadius === "function") { contextStream.pointRadius(+pointRadius.apply(this, arguments)); } - d3_geoStream(object, projectionStream(contextStream)); - } - return contextStream.result(); + function rotation(lambda, phi) { + var cosPhi = cos(phi), + x = cos(lambda) * cosPhi, + y = sin(lambda) * cosPhi, + z = sin(phi), + k = z * cosDeltaPhi + x * sinDeltaPhi; + return [atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi), asin(k * cosDeltaGamma + y * sinDeltaGamma)]; } - path.area = function(object) { - d3_geoStream(object, projectionStream(areaStream$1)); - return areaStream$1.result(); + rotation.invert = function (lambda, phi) { + var cosPhi = cos(phi), + x = cos(lambda) * cosPhi, + y = sin(lambda) * cosPhi, + z = sin(phi), + k = z * cosDeltaGamma - y * sinDeltaGamma; + return [atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi), asin(k * cosDeltaPhi - x * sinDeltaPhi)]; }; - path.measure = function(object) { - d3_geoStream(object, projectionStream(lengthStream$1)); - return lengthStream$1.result(); - }; + return rotation; + } - path.bounds = function(object) { - d3_geoStream(object, projectionStream(boundsStream$1)); - return boundsStream$1.result(); - }; + function rotation (rotate) { + rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0); - path.centroid = function(object) { - d3_geoStream(object, projectionStream(centroidStream$1)); - return centroidStream$1.result(); - }; + function forward(coordinates) { + coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates; + } - path.projection = function(_) { - return arguments.length ? (projectionStream = _ == null ? (projection = null, identity) : (projection = _).stream, path) : projection; + forward.invert = function (coordinates) { + coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates; }; - path.context = function(_) { - if (!arguments.length) { return context; } - contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _); - if (typeof pointRadius !== "function") { contextStream.pointRadius(pointRadius); } - return path; - }; + return forward; + } - path.pointRadius = function(_) { - if (!arguments.length) { return pointRadius; } - pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); - return path; - }; + function circleStream(stream, radius, delta, direction, t0, t1) { + if (!delta) return; + var cosRadius = cos(radius), + sinRadius = sin(radius), + step = direction * delta; - return path.projection(projection).context(context); + if (t0 == null) { + t0 = radius + direction * tau; + t1 = radius - step / 2; + } else { + t0 = circleRadius(cosRadius, t0); + t1 = circleRadius(cosRadius, t1); + if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau; + } + + for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) { + point = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]); + stream.point(point[0], point[1]); + } + } // Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0]. + + function circleRadius(cosRadius, point) { + point = cartesian(point), point[0] -= cosRadius; + cartesianNormalizeInPlace(point); + var radius = acos(-point[1]); + return ((-point[2] < 0 ? -radius : radius) + tau - epsilon$1) % tau; } - function d3_geoTransform(methods) { + function clipBuffer () { + var lines = [], + line; return { - stream: transformer(methods) + point: function point(x, y, m) { + line.push([x, y, m]); + }, + lineStart: function lineStart() { + lines.push(line = []); + }, + lineEnd: noop$1, + rejoin: function rejoin() { + if (lines.length > 1) lines.push(lines.pop().concat(lines.shift())); + }, + result: function result() { + var result = lines; + lines = []; + line = null; + return result; + } }; } - function transformer(methods) { - return function(stream) { - var s = new TransformStream; - for (var key in methods) { s[key] = methods[key]; } - s.stream = stream; - return s; - }; + function pointEqual (a, b) { + return abs$2(a[0] - b[0]) < epsilon$1 && abs$2(a[1] - b[1]) < epsilon$1; } - function TransformStream() {} + function Intersection(point, points, other, entry) { + this.x = point; + this.z = points; + this.o = other; // another intersection - TransformStream.prototype = { - constructor: TransformStream, - point: function(x, y) { this.stream.point(x, y); }, - sphere: function() { this.stream.sphere(); }, - lineStart: function() { this.stream.lineStart(); }, - lineEnd: function() { this.stream.lineEnd(); }, - polygonStart: function() { this.stream.polygonStart(); }, - polygonEnd: function() { this.stream.polygonEnd(); } - }; + this.e = entry; // is an entry? - function fit(projection, fitBounds, object) { - var clip = projection.clipExtent && projection.clipExtent(); - projection.scale(150).translate([0, 0]); - if (clip != null) { projection.clipExtent(null); } - d3_geoStream(object, projection.stream(boundsStream$1)); - fitBounds(boundsStream$1.result()); - if (clip != null) { projection.clipExtent(clip); } - return projection; - } + this.v = false; // visited - function fitExtent(projection, extent, object) { - return fit(projection, function(b) { - var w = extent[1][0] - extent[0][0], - h = extent[1][1] - extent[0][1], - k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])), - x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2, - y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2; - projection.scale(150 * k).translate([x, y]); - }, object); - } + this.n = this.p = null; // next & previous + } // A generalized polygon clipping algorithm: given a polygon that has been cut + // into its visible line segments, and rejoins the segments by interpolating + // along the clip edge. - function fitSize(projection, size, object) { - return fitExtent(projection, [[0, 0], size], object); - } - function fitWidth(projection, width, object) { - return fit(projection, function(b) { - var w = +width, - k = w / (b[1][0] - b[0][0]), - x = (w - k * (b[1][0] + b[0][0])) / 2, - y = -k * b[0][1]; - projection.scale(150 * k).translate([x, y]); - }, object); - } + function clipRejoin (segments, compareIntersection, startInside, interpolate, stream) { + var subject = [], + clip = [], + i, + n; + segments.forEach(function (segment) { + if ((n = segment.length - 1) <= 0) return; + var n, + p0 = segment[0], + p1 = segment[n], + x; - function fitHeight(projection, height, object) { - return fit(projection, function(b) { - var h = +height, - k = h / (b[1][1] - b[0][1]), - x = -k * b[0][0], - y = (h - k * (b[1][1] + b[0][1])) / 2; - projection.scale(150 * k).translate([x, y]); - }, object); - } + if (pointEqual(p0, p1)) { + if (!p0[2] && !p1[2]) { + stream.lineStart(); - var maxDepth = 16, // maximum depth of subdivision - cosMinDistance = cos(30 * radians); // cos(minimum angular distance) + for (i = 0; i < n; ++i) { + stream.point((p0 = segment[i])[0], p0[1]); + } - function resample(project, delta2) { - return +delta2 ? resample$1(project, delta2) : resampleNone(project); - } + stream.lineEnd(); + return; + } // handle degenerate cases by moving the point - function resampleNone(project) { - return transformer({ - point: function(x, y) { - x = project(x, y); - this.stream.point(x[0], x[1]); + + p1[0] += 2 * epsilon$1; } - }); - } - function resample$1(project, delta2) { + subject.push(x = new Intersection(p0, segment, null, true)); + clip.push(x.o = new Intersection(p0, null, x, false)); + subject.push(x = new Intersection(p1, segment, null, false)); + clip.push(x.o = new Intersection(p1, null, x, true)); + }); + if (!subject.length) return; + clip.sort(compareIntersection); + link(subject); + link(clip); - function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) { - var dx = x1 - x0, - dy = y1 - y0, - d2 = dx * dx + dy * dy; - if (d2 > 4 * delta2 && depth--) { - var a = a0 + a1, - b = b0 + b1, - c = c0 + c1, - m = sqrt(a * a + b * b + c * c), - phi2 = asin(c /= m), - lambda2 = abs$2(abs$2(c) - 1) < epsilon || abs$2(lambda0 - lambda1) < epsilon ? (lambda0 + lambda1) / 2 : atan2(b, a), - p = project(lambda2, phi2), - x2 = p[0], - y2 = p[1], - dx2 = x2 - x0, - dy2 = y2 - y0, - dz = dy * dx2 - dx * dy2; - if (dz * dz / d2 > delta2 // perpendicular projected distance - || abs$2((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end - || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance - resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream); - stream.point(x2, y2); - resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream); - } - } + for (i = 0, n = clip.length; i < n; ++i) { + clip[i].e = startInside = !startInside; } - return function(stream) { - var lambda00, x00, y00, a00, b00, c00, // first point - lambda0, x0, y0, a0, b0, c0; // previous point - - var resampleStream = { - point: point, - lineStart: lineStart, - lineEnd: lineEnd, - polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; }, - polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; } - }; - function point(x, y) { - x = project(x, y); - stream.point(x[0], x[1]); - } + var start = subject[0], + points, + point; - function lineStart() { - x0 = NaN; - resampleStream.point = linePoint; - stream.lineStart(); - } + while (1) { + // Find first unvisited intersection. + var current = start, + isSubject = true; - function linePoint(lambda, phi) { - var c = cartesian([lambda, phi]), p = project(lambda, phi); - 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); - stream.point(x0, y0); + while (current.v) { + if ((current = current.n) === start) return; } - function lineEnd() { - resampleStream.point = point; - stream.lineEnd(); - } + points = current.z; + stream.lineStart(); - function ringStart() { - lineStart(); - resampleStream.point = ringPoint; - resampleStream.lineEnd = ringEnd; - } + do { + current.v = current.o.v = true; - function ringPoint(lambda, phi) { - linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0; - resampleStream.point = linePoint; - } + if (current.e) { + if (isSubject) { + for (i = 0, n = points.length; i < n; ++i) { + stream.point((point = points[i])[0], point[1]); + } + } else { + interpolate(current.x, current.n.x, 1, stream); + } - function ringEnd() { - resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream); - resampleStream.lineEnd = lineEnd; - lineEnd(); - } + current = current.n; + } else { + if (isSubject) { + points = current.p.z; - return resampleStream; - }; - } + for (i = points.length - 1; i >= 0; --i) { + stream.point((point = points[i])[0], point[1]); + } + } else { + interpolate(current.x, current.p.x, -1, stream); + } - var transformRadians = transformer({ - point: function(x, y) { - this.stream.point(x * radians, y * radians); - } - }); + current = current.p; + } - function transformRotate(rotate) { - return transformer({ - point: function(x, y) { - var r = rotate(x, y); - return this.stream.point(r[0], r[1]); - } - }); - } + current = current.o; + points = current.z; + isSubject = !isSubject; + } while (!current.v); - function scaleTranslate(k, dx, dy, sx, sy) { - function transform(x, y) { - x *= sx; y *= sy; - return [dx + k * x, dy - k * y]; + stream.lineEnd(); } - transform.invert = function(x, y) { - return [(x - dx) / k * sx, (dy - y) / k * sy]; - }; - return transform; } - function scaleTranslateRotate(k, dx, dy, sx, sy, alpha) { - var cosAlpha = cos(alpha), - sinAlpha = sin(alpha), - a = cosAlpha * k, - b = sinAlpha * k, - ai = cosAlpha / k, - bi = sinAlpha / k, - ci = (sinAlpha * dy - cosAlpha * dx) / k, - fi = (sinAlpha * dx + cosAlpha * dy) / k; - function transform(x, y) { - x *= sx; y *= sy; - return [a * x - b * y + dx, dy - b * x - a * y]; + function link(array) { + if (!(n = array.length)) return; + var n, + i = 0, + a = array[0], + b; + + while (++i < n) { + a.n = b = array[i]; + b.p = a; + a = b; } - transform.invert = function(x, y) { - return [sx * (ai * x - bi * y + ci), sy * (fi - bi * x - ai * y)]; - }; - return transform; + + a.n = b = array[0]; + b.p = a; } - function projection(project) { - return projectionMutator(function() { return project; })(); + function longitude(point) { + if (abs$2(point[0]) <= pi) return point[0];else return sign(point[0]) * ((abs$2(point[0]) + pi) % tau - pi); } - function projectionMutator(projectAt) { - var project, - k = 150, // scale - x = 480, y = 250, // translate - lambda = 0, phi = 0, // center - deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate - alpha = 0, // post-rotate angle - sx = 1, // reflectX - sy = 1, // reflectX - theta = null, preclip = clipAntimeridian, // pre-clip angle - x0 = null, y0, x1, y1, postclip = identity, // post-clip extent - delta2 = 0.5, // precision - projectResample, - projectTransform, - projectRotateTransform, - cache, - cacheStream; + function polygonContains (polygon, point) { + var lambda = longitude(point), + phi = point[1], + sinPhi = sin(phi), + normal = [sin(lambda), -cos(lambda), 0], + angle = 0, + winding = 0; + var sum = new Adder(); + if (sinPhi === 1) phi = halfPi + epsilon$1;else if (sinPhi === -1) phi = -halfPi - epsilon$1; - function projection(point) { - return projectRotateTransform(point[0] * radians, point[1] * radians); - } + for (var i = 0, n = polygon.length; i < n; ++i) { + if (!(m = (ring = polygon[i]).length)) continue; + var ring, + m, + point0 = ring[m - 1], + lambda0 = longitude(point0), + phi0 = point0[1] / 2 + quarterPi, + sinPhi0 = sin(phi0), + cosPhi0 = cos(phi0); - function invert(point) { - point = projectRotateTransform.invert(point[0], point[1]); - return point && [point[0] * degrees, point[1] * degrees]; - } + for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) { + var point1 = ring[j], + lambda1 = longitude(point1), + phi1 = point1[1] / 2 + quarterPi, + sinPhi1 = sin(phi1), + cosPhi1 = cos(phi1), + delta = lambda1 - lambda0, + sign = delta >= 0 ? 1 : -1, + absDelta = sign * delta, + antimeridian = absDelta > pi, + k = sinPhi0 * sinPhi1; + sum.add(atan2(k * sign * sin(absDelta), cosPhi0 * cosPhi1 + k * cos(absDelta))); + angle += antimeridian ? delta + sign * tau : delta; // Are the longitudes either side of the point’s meridian (lambda), + // and are the latitudes smaller than the parallel (phi)? - projection.stream = function(stream) { - return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream))))); - }; + if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) { + var arc = cartesianCross(cartesian(point0), cartesian(point1)); + cartesianNormalizeInPlace(arc); + var intersection = cartesianCross(normal, arc); + cartesianNormalizeInPlace(intersection); + var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]); - projection.preclip = function(_) { - return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip; - }; + if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) { + winding += antimeridian ^ delta >= 0 ? 1 : -1; + } + } + } + } // First, determine whether the South pole is inside or outside: + // + // It is inside if: + // * the polygon winds around it in a clockwise direction. + // * the polygon does not (cumulatively) wind around it, but has a negative + // (counter-clockwise) area. + // + // Second, count the (signed) number of times a segment crosses a lambda + // from the point to the South pole. If it is zero, then the point is the + // same side as the South pole. - projection.postclip = function(_) { - return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; - }; - projection.clipAngle = function(_) { - return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees; - }; + return (angle < -epsilon$1 || angle < epsilon$1 && sum < -epsilon2$1) ^ winding & 1; + } - projection.clipExtent = function(_) { - return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; - }; + function clip (pointVisible, clipLine, interpolate, start) { + return function (sink) { + var line = clipLine(sink), + ringBuffer = clipBuffer(), + ringSink = clipLine(ringBuffer), + polygonStarted = false, + polygon, + segments, + ring; + var clip = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function polygonStart() { + clip.point = pointRing; + clip.lineStart = ringStart; + clip.lineEnd = ringEnd; + segments = []; + polygon = []; + }, + polygonEnd: function polygonEnd() { + clip.point = point; + clip.lineStart = lineStart; + clip.lineEnd = lineEnd; + segments = merge$4(segments); + var startInside = polygonContains(polygon, start); - projection.scale = function(_) { - return arguments.length ? (k = +_, recenter()) : k; - }; + if (segments.length) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + clipRejoin(segments, compareIntersection, startInside, interpolate, sink); + } else if (startInside) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + } - projection.translate = function(_) { - return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y]; - }; + if (polygonStarted) sink.polygonEnd(), polygonStarted = false; + segments = polygon = null; + }, + sphere: function sphere() { + sink.polygonStart(); + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + sink.polygonEnd(); + } + }; - projection.center = function(_) { - return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees]; - }; + function point(lambda, phi) { + if (pointVisible(lambda, phi)) sink.point(lambda, phi); + } - projection.rotate = function(_) { - return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees]; - }; + function pointLine(lambda, phi) { + line.point(lambda, phi); + } - projection.angle = function(_) { - return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees; - }; + function lineStart() { + clip.point = pointLine; + line.lineStart(); + } - projection.reflectX = function(_) { - return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0; - }; - - projection.reflectY = function(_) { - return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0; - }; + function lineEnd() { + clip.point = point; + line.lineEnd(); + } - projection.precision = function(_) { - return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2); - }; + function pointRing(lambda, phi) { + ring.push([lambda, phi]); + ringSink.point(lambda, phi); + } - projection.fitExtent = function(extent, object) { - return fitExtent(projection, extent, object); - }; + function ringStart() { + ringSink.lineStart(); + ring = []; + } - projection.fitSize = function(size, object) { - return fitSize(projection, size, object); - }; + function ringEnd() { + pointRing(ring[0][0], ring[0][1]); + ringSink.lineEnd(); + var clean = ringSink.clean(), + ringSegments = ringBuffer.result(), + i, + n = ringSegments.length, + m, + segment, + point; + ring.pop(); + polygon.push(ring); + ring = null; + if (!n) return; // No intersections. - projection.fitWidth = function(width, object) { - return fitWidth(projection, width, object); - }; + if (clean & 1) { + segment = ringSegments[0]; - projection.fitHeight = function(height, object) { - return fitHeight(projection, height, object); - }; + if ((m = segment.length - 1) > 0) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); - function recenter() { - var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project(lambda, phi)), - transform = (alpha ? scaleTranslateRotate : scaleTranslate)(k, x - center[0], y - center[1], sx, sy, alpha); - rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma); - projectTransform = compose(project, transform); - projectRotateTransform = compose(rotate, projectTransform); - projectResample = resample(projectTransform, delta2); - return reset(); - } + for (i = 0; i < m; ++i) { + sink.point((point = segment[i])[0], point[1]); + } - function reset() { - cache = cacheStream = null; - return projection; - } + sink.lineEnd(); + } - return function() { - project = projectAt.apply(this, arguments); - projection.invert = project.invert && invert; - return recenter(); - }; - } + return; + } // Rejoin connected segments. + // TODO reuse ringBuffer.rejoin()? - function mercatorRaw(lambda, phi) { - return [lambda, log(tan((halfPi + phi) / 2))]; - } - mercatorRaw.invert = function(x, y) { - return [x, 2 * atan(exp(y)) - halfPi]; - }; + if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); + segments.push(ringSegments.filter(validSegment)); + } - function mercator() { - return mercatorProjection(mercatorRaw) - .scale(961 / tau); + return clip; + }; } - function mercatorProjection(project) { - var m = projection(project), - center = m.center, - scale = m.scale, - translate = m.translate, - clipExtent = m.clipExtent, - x0 = null, y0, x1, y1; // clip extent + function validSegment(segment) { + return segment.length > 1; + } // Intersections are sorted along the clip edge. For both antimeridian cutting + // and circle clipping, the same comparison is used. - m.scale = function(_) { - return arguments.length ? (scale(_), reclip()) : scale(); - }; - m.translate = function(_) { - return arguments.length ? (translate(_), reclip()) : translate(); - }; + function compareIntersection(a, b) { + return ((a = a.x)[0] < 0 ? a[1] - halfPi - epsilon$1 : halfPi - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfPi - epsilon$1 : halfPi - b[1]); + } - m.center = function(_) { - return arguments.length ? (center(_), reclip()) : center(); - }; + var clipAntimeridian = clip(function () { + return true; + }, clipAntimeridianLine, clipAntimeridianInterpolate, [-pi, -halfPi]); // Takes a line and cuts into visible segments. Return values: 0 - there were + // intersections or the line was empty; 1 - no intersections; 2 - there were + // intersections, and the first and last segments should be rejoined. - m.clipExtent = function(_) { - 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]]; - }; + function clipAntimeridianLine(stream) { + var lambda0 = NaN, + phi0 = NaN, + sign0 = NaN, + _clean; // no intersections - function reclip() { - var k = pi * scale(), - t = m(rotation(m.rotate()).invert([0, 0])); - return clipExtent(x0 == null - ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw - ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]] - : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]); - } - return reclip(); - } + return { + lineStart: function lineStart() { + stream.lineStart(); + _clean = 1; + }, + point: function point(lambda1, phi1) { + var sign1 = lambda1 > 0 ? pi : -pi, + delta = abs$2(lambda1 - lambda0); - function d3_geoIdentity() { - var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, // scale, translate and reflect - alpha = 0, ca, sa, // angle - x0 = null, y0, x1, y1, // clip extent - kx = 1, ky = 1, - transform = transformer({ - point: function(x, y) { - var p = projection([x, y]); - this.stream.point(p[0], p[1]); - } - }), - postclip = identity, - cache, - cacheStream; + if (abs$2(delta - pi) < epsilon$1) { + // line crosses a pole + stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi : -halfPi); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + stream.point(lambda1, phi0); + _clean = 0; + } else if (sign0 !== sign1 && delta >= pi) { + // line crosses antimeridian + if (abs$2(lambda0 - sign0) < epsilon$1) lambda0 -= sign0 * epsilon$1; // handle degeneracies - function reset() { - kx = k * sx; - ky = k * sy; - cache = cacheStream = null; - return projection; - } + if (abs$2(lambda1 - sign1) < epsilon$1) lambda1 -= sign1 * epsilon$1; + phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + _clean = 0; + } - function projection (p) { - var x = p[0] * kx, y = p[1] * ky; - if (alpha) { - var t = y * ca - x * sa; - x = x * ca + y * sa; - y = t; - } - return [x + tx, y + ty]; - } - projection.invert = function(p) { - var x = p[0] - tx, y = p[1] - ty; - if (alpha) { - var t = y * ca + x * sa; - x = x * ca - y * sa; - y = t; + stream.point(lambda0 = lambda1, phi0 = phi1); + sign0 = sign1; + }, + lineEnd: function lineEnd() { + stream.lineEnd(); + lambda0 = phi0 = NaN; + }, + clean: function clean() { + return 2 - _clean; // if intersections, rejoin first and last segments } - return [x / kx, y / ky]; - }; - projection.stream = function(stream) { - return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream)); - }; - projection.postclip = function(_) { - return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; - }; - projection.clipExtent = function(_) { - return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; - }; - projection.scale = function(_) { - return arguments.length ? (k = +_, reset()) : k; - }; - projection.translate = function(_) { - return arguments.length ? (tx = +_[0], ty = +_[1], reset()) : [tx, ty]; - }; - projection.angle = function(_) { - return arguments.length ? (alpha = _ % 360 * radians, sa = sin(alpha), ca = cos(alpha), reset()) : alpha * degrees; - }; - projection.reflectX = function(_) { - return arguments.length ? (sx = _ ? -1 : 1, reset()) : sx < 0; - }; - projection.reflectY = function(_) { - return arguments.length ? (sy = _ ? -1 : 1, reset()) : sy < 0; - }; - projection.fitExtent = function(extent, object) { - return fitExtent(projection, extent, object); - }; - projection.fitSize = function(size, object) { - return fitSize(projection, size, object); - }; - projection.fitWidth = function(width, object) { - return fitWidth(projection, width, object); - }; - projection.fitHeight = function(height, object) { - return fitHeight(projection, height, object); }; - - return projection; } - // constants - var TAU = 2 * Math.PI; - var EQUATORIAL_RADIUS = 6356752.314245179; - var POLAR_RADIUS = 6378137.0; + function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) { + var cosPhi0, + cosPhi1, + sinLambda0Lambda1 = sin(lambda0 - lambda1); + return abs$2(sinLambda0Lambda1) > epsilon$1 ? atan((sin(phi0) * (cosPhi1 = cos(phi1)) * sin(lambda1) - sin(phi1) * (cosPhi0 = cos(phi0)) * sin(lambda0)) / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) : (phi0 + phi1) / 2; + } + function clipAntimeridianInterpolate(from, to, direction, stream) { + var phi; - function geoLatToMeters(dLat) { - return dLat * (TAU * POLAR_RADIUS / 360); + if (from == null) { + phi = direction * halfPi; + stream.point(-pi, phi); + stream.point(0, phi); + stream.point(pi, phi); + stream.point(pi, 0); + stream.point(pi, -phi); + stream.point(0, -phi); + stream.point(-pi, -phi); + stream.point(-pi, 0); + stream.point(-pi, phi); + } else if (abs$2(from[0] - to[0]) > epsilon$1) { + var lambda = from[0] < to[0] ? pi : -pi; + phi = direction * lambda / 2; + stream.point(-lambda, phi); + stream.point(0, phi); + stream.point(lambda, phi); + } else { + stream.point(to[0], to[1]); + } } + function clipCircle (radius) { + var cr = cos(radius), + delta = 6 * radians, + smallRadius = cr > 0, + notHemisphere = abs$2(cr) > epsilon$1; // TODO optimise for this common case - function geoLonToMeters(dLon, atLat) { - return Math.abs(atLat) >= 90 ? 0 : - dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180))); - } + function interpolate(from, to, direction, stream) { + circleStream(stream, radius, delta, direction, from, to); + } + function visible(lambda, phi) { + return cos(lambda) * cos(phi) > cr; + } // Takes a line and cuts into visible segments. Return values used for polygon + // clipping: 0 - there were intersections or the line was empty; 1 - no + // intersections 2 - there were intersections, and the first and last segments + // should be rejoined. - function geoMetersToLat(m) { - return m / (TAU * POLAR_RADIUS / 360); - } + function clipLine(stream) { + var point0, // previous point + c0, // code for previous point + v0, // visibility of previous point + v00, // visibility of first point + _clean; // no intersections - function geoMetersToLon(m, atLat) { - return Math.abs(atLat) >= 90 ? 0 : - m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180))); - } + return { + lineStart: function lineStart() { + v00 = v0 = false; + _clean = 1; + }, + point: function point(lambda, phi) { + var point1 = [lambda, phi], + point2, + v = visible(lambda, phi), + c = smallRadius ? v ? 0 : code(lambda, phi) : v ? code(lambda + (lambda < 0 ? pi : -pi), phi) : 0; + if (!point0 && (v00 = v0 = v)) stream.lineStart(); - function geoMetersToOffset(meters, tileSize) { - tileSize = tileSize || 256; - return [ - meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS), - -meters[1] * tileSize / (TAU * POLAR_RADIUS) - ]; - } + if (v !== v0) { + point2 = intersect(point0, point1); + if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) point1[2] = 1; + } + if (v !== v0) { + _clean = 0; - function geoOffsetToMeters(offset, tileSize) { - tileSize = tileSize || 256; - return [ - offset[0] * TAU * EQUATORIAL_RADIUS / tileSize, - -offset[1] * TAU * POLAR_RADIUS / tileSize - ]; - } + if (v) { + // outside going in + stream.lineStart(); + point2 = intersect(point1, point0); + stream.point(point2[0], point2[1]); + } else { + // inside going out + point2 = intersect(point0, point1); + stream.point(point2[0], point2[1], 2); + stream.lineEnd(); + } + point0 = point2; + } else if (notHemisphere && point0 && smallRadius ^ v) { + var t; // If the codes for two points are different, or are both zero, + // and there this segment intersects with the small circle. - // Equirectangular approximation of spherical distances on Earth - function geoSphericalDistance(a, b) { - var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2); - var y = geoLatToMeters(a[1] - b[1]); - return Math.sqrt((x * x) + (y * y)); - } + if (!(c & c0) && (t = intersect(point1, point0, true))) { + _clean = 0; + + if (smallRadius) { + stream.lineStart(); + stream.point(t[0][0], t[0][1]); + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + } else { + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + stream.lineStart(); + stream.point(t[0][0], t[0][1], 3); + } + } + } + if (v && (!point0 || !pointEqual(point0, point1))) { + stream.point(point1[0], point1[1]); + } - // scale to zoom - function geoScaleToZoom(k, tileSize) { - tileSize = tileSize || 256; - var log2ts = Math.log(tileSize) * Math.LOG2E; - return Math.log(k * TAU) / Math.LN2 - log2ts; - } + point0 = point1, v0 = v, c0 = c; + }, + lineEnd: function lineEnd() { + if (v0) stream.lineEnd(); + point0 = null; + }, + // Rejoin first and last segments if there were intersections and the first + // and last points were visible. + clean: function clean() { + return _clean | (v00 && v0) << 1; + } + }; + } // Intersects the great circle between a and b with the clip circle. - // zoom to scale - function geoZoomToScale(z, tileSize) { - tileSize = tileSize || 256; - return tileSize * Math.pow(2, z) / TAU; - } + function intersect(a, b, two) { + var pa = cartesian(a), + pb = cartesian(b); // We have two planes, n1.p = d1 and n2.p = d2. + // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2). + var n1 = [1, 0, 0], + // normal + n2 = cartesianCross(pa, pb), + n2n2 = cartesianDot(n2, n2), + n1n2 = n2[0], + // cartesianDot(n1, n2), + determinant = n2n2 - n1n2 * n1n2; // Two polar points. - // returns info about the node from `nodes` closest to the given `point` - function geoSphericalClosestNode(nodes, point) { - var minDistance = Infinity, distance; - var indexOfMin; + if (!determinant) return !two && a; + var c1 = cr * n2n2 / determinant, + c2 = -cr * n1n2 / determinant, + n1xn2 = cartesianCross(n1, n2), + A = cartesianScale(n1, c1), + B = cartesianScale(n2, c2); + cartesianAddInPlace(A, B); // Solve |p(t)|^2 = 1. - for (var i in nodes) { - distance = geoSphericalDistance(nodes[i].loc, point); - if (distance < minDistance) { - minDistance = distance; - indexOfMin = i; - } - } + var u = n1xn2, + w = cartesianDot(A, u), + uu = cartesianDot(u, u), + t2 = w * w - uu * (cartesianDot(A, A) - 1); + if (t2 < 0) return; + var t = sqrt(t2), + q = cartesianScale(u, (-w - t) / uu); + cartesianAddInPlace(q, A); + q = spherical(q); + if (!two) return q; // Two intersection points. - if (indexOfMin !== undefined) { - return { index: indexOfMin, distance: minDistance, node: nodes[indexOfMin] }; - } else { - return null; - } - } + var lambda0 = a[0], + lambda1 = b[0], + phi0 = a[1], + phi1 = b[1], + z; + if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z; + var delta = lambda1 - lambda0, + polar = abs$2(delta - pi) < epsilon$1, + meridian = polar || delta < epsilon$1; + if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z; // Check that the first point is between a and b. - function geoExtent(min, max) { - if (!(this instanceof geoExtent)) { - return new geoExtent(min, max); - } else if (min instanceof geoExtent) { - return min; - } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) { - this[0] = min[0]; - this[1] = min[1]; - } else { - this[0] = min || [ Infinity, Infinity]; - this[1] = max || min || [-Infinity, -Infinity]; + if (meridian ? polar ? phi0 + phi1 > 0 ^ q[1] < (abs$2(q[0] - lambda0) < epsilon$1 ? phi0 : phi1) : phi0 <= q[1] && q[1] <= phi1 : delta > pi ^ (lambda0 <= q[0] && q[0] <= lambda1)) { + var q1 = cartesianScale(u, (-w + t) / uu); + cartesianAddInPlace(q1, A); + return [q, spherical(q1)]; } - } + } // Generates a 4-bit vector representing the location of a point relative to + // the small circle's bounding box. - geoExtent.prototype = new Array(2); - Object.assign(geoExtent.prototype, { + function code(lambda, phi) { + var r = smallRadius ? radius : pi - radius, + code = 0; + if (lambda < -r) code |= 1; // left + else if (lambda > r) code |= 2; // right - equals: function (obj) { - return this[0][0] === obj[0][0] && - this[0][1] === obj[0][1] && - this[1][0] === obj[1][0] && - this[1][1] === obj[1][1]; - }, + if (phi < -r) code |= 4; // below + else if (phi > r) code |= 8; // above + return code; + } - extend: function(obj) { - if (!(obj instanceof geoExtent)) { obj = new geoExtent(obj); } - return geoExtent( - [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])], - [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])] - ); - }, + return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi, radius - pi]); + } + function clipLine (a, b, x0, y0, x1, y1) { + var ax = a[0], + ay = a[1], + bx = b[0], + by = b[1], + t0 = 0, + t1 = 1, + dx = bx - ax, + dy = by - ay, + r; + r = x0 - ax; + if (!dx && r > 0) return; + r /= dx; - _extend: function(extent) { - this[0][0] = Math.min(extent[0][0], this[0][0]); - this[0][1] = Math.min(extent[0][1], this[0][1]); - this[1][0] = Math.max(extent[1][0], this[1][0]); - this[1][1] = Math.max(extent[1][1], this[1][1]); - }, + if (dx < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dx > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + r = x1 - ax; + if (!dx && r < 0) return; + r /= dx; - area: function() { - return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1])); - }, + if (dx < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dx > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + r = y0 - ay; + if (!dy && r > 0) return; + r /= dy; - center: function() { - return [(this[0][0] + this[1][0]) / 2, (this[0][1] + this[1][1]) / 2]; - }, + if (dy < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dy > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + r = y1 - ay; + if (!dy && r < 0) return; + r /= dy; - rectangle: function() { - return [this[0][0], this[0][1], this[1][0], this[1][1]]; - }, + if (dy < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dy > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy; + if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy; + return true; + } - bbox: function() { - return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] }; - }, + var clipMax = 1e9, + clipMin = -clipMax; // TODO Use d3-polygon’s polygonContains here for the ring check? + // TODO Eliminate duplicate buffering in clipBuffer and polygon.push? + function clipRectangle(x0, y0, x1, y1) { + function visible(x, y) { + return x0 <= x && x <= x1 && y0 <= y && y <= y1; + } - polygon: function() { - return [ - [this[0][0], this[0][1]], - [this[0][0], this[1][1]], - [this[1][0], this[1][1]], - [this[1][0], this[0][1]], - [this[0][0], this[0][1]] - ]; - }, + function interpolate(from, to, direction, stream) { + var a = 0, + a1 = 0; + if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoint(from, to) < 0 ^ direction > 0) { + do { + stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0); + } while ((a = (a + direction + 4) % 4) !== a1); + } else { + stream.point(to[0], to[1]); + } + } - contains: function(obj) { - if (!(obj instanceof geoExtent)) { obj = new geoExtent(obj); } - return obj[0][0] >= this[0][0] && - obj[0][1] >= this[0][1] && - obj[1][0] <= this[1][0] && - obj[1][1] <= this[1][1]; - }, + function corner(p, direction) { + return abs$2(p[0] - x0) < epsilon$1 ? direction > 0 ? 0 : 3 : abs$2(p[0] - x1) < epsilon$1 ? direction > 0 ? 2 : 1 : abs$2(p[1] - y0) < epsilon$1 ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon + } + function compareIntersection(a, b) { + return comparePoint(a.x, b.x); + } - intersects: function(obj) { - if (!(obj instanceof geoExtent)) { obj = new geoExtent(obj); } - return obj[0][0] <= this[1][0] && - obj[0][1] <= this[1][1] && - obj[1][0] >= this[0][0] && - obj[1][1] >= this[0][1]; - }, + function comparePoint(a, b) { + var ca = corner(a, 1), + cb = corner(b, 1); + return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0]; + } + return function (stream) { + var activeStream = stream, + bufferStream = clipBuffer(), + segments, + polygon, + ring, + x__, + y__, + v__, + // first point + x_, + y_, + v_, + // previous point + first, + clean; + var clipStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: polygonStart, + polygonEnd: polygonEnd + }; - intersection: function(obj) { - if (!this.intersects(obj)) { return new geoExtent(); } - return new geoExtent( - [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])], - [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])] - ); - }, + function point(x, y) { + if (visible(x, y)) activeStream.point(x, y); + } + function polygonInside() { + var winding = 0; - percentContainedIn: function(obj) { - if (!(obj instanceof geoExtent)) { obj = new geoExtent(obj); } - var a1 = this.intersection(obj).area(); - var a2 = this.area(); + for (var i = 0, n = polygon.length; i < n; ++i) { + for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) { + a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1]; - if (a1 === Infinity || a2 === Infinity) { - return 0; - } else if (a1 === 0 || a2 === 0) { - if (obj.contains(this)) { - return 1; - } - return 0; - } else { - return a1 / a2; + if (a1 <= y1) { + if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; + } else { + if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; + } } - }, - + } - padByMeters: function(meters) { - var dLat = geoMetersToLat(meters); - var dLon = geoMetersToLon(meters, this.center()[1]); - return geoExtent( - [this[0][0] - dLon, this[0][1] - dLat], - [this[1][0] + dLon, this[1][1] + dLat] - ); - }, + return winding; + } // Buffer geometry within a polygon and then clip it en masse. - toParam: function() { - return this.rectangle().join(','); + function polygonStart() { + activeStream = bufferStream, segments = [], polygon = [], clean = true; } - }); + function polygonEnd() { + var startInside = polygonInside(), + cleanInside = clean && startInside, + visible = (segments = merge$4(segments)).length; - function d3_polygonArea(polygon) { - var i = -1, - n = polygon.length, - a, - b = polygon[n - 1], - area = 0; + if (cleanInside || visible) { + stream.polygonStart(); - while (++i < n) { - a = b; - b = polygon[i]; - area += a[1] * b[0] - a[0] * b[1]; - } + if (cleanInside) { + stream.lineStart(); + interpolate(null, null, 1, stream); + stream.lineEnd(); + } - return area / 2; - } + if (visible) { + clipRejoin(segments, compareIntersection, startInside, interpolate, stream); + } - function d3_polygonCentroid(polygon) { - var i = -1, - n = polygon.length, - x = 0, - y = 0, - a, - b = polygon[n - 1], - c, - k = 0; + stream.polygonEnd(); + } - while (++i < n) { - a = b; - b = polygon[i]; - k += c = a[0] * b[1] - b[0] * a[1]; - x += (a[0] + b[0]) * c; - y += (a[1] + b[1]) * c; - } + activeStream = stream, segments = polygon = ring = null; + } - return k *= 3, [x / k, y / k]; - } + function lineStart() { + clipStream.point = linePoint; + if (polygon) polygon.push(ring = []); + first = true; + v_ = false; + x_ = y_ = NaN; + } // TODO rather than special-case polygons, simply handle them separately. + // Ideally, coincident intersection points should be jittered to avoid + // clipping issues. - // Returns the 2D cross product of AB and AC vectors, i.e., the z-component of - // the 3D cross product in a quadrant I Cartesian coordinate system (+x is - // right, +y is up). Returns a positive value if ABC is counter-clockwise, - // negative if clockwise, and zero if the points are collinear. - function cross(a, b, c) { - return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); - } - function lexicographicOrder(a, b) { - return a[0] - b[0] || a[1] - b[1]; - } + function lineEnd() { + if (segments) { + linePoint(x__, y__); + if (v__ && v_) bufferStream.rejoin(); + segments.push(bufferStream.result()); + } - // Computes the upper convex hull per the monotone chain algorithm. - // Assumes points.length >= 3, is sorted by x, unique in y. - // Returns an array of indices into points in left-to-right order. - function computeUpperHullIndexes(points) { - var n = points.length, - indexes = [0, 1], - size = 2; + clipStream.point = point; + if (v_) activeStream.lineEnd(); + } - for (var i = 2; i < n; ++i) { - while (size > 1 && cross(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) { --size; } - indexes[size++] = i; - } + function linePoint(x, y) { + var v = visible(x, y); + if (polygon) ring.push([x, y]); - return indexes.slice(0, size); // remove popped points - } + if (first) { + x__ = x, y__ = y, v__ = v; + first = false; - function d3_polygonHull(points) { - if ((n = points.length) < 3) { return null; } + if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + } + } else { + if (v && v_) activeStream.point(x, y);else { + var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], + b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))]; - var i, - n, - sortedPoints = new Array(n), - flippedPoints = new Array(n); - - for (i = 0; i < n; ++i) { sortedPoints[i] = [+points[i][0], +points[i][1], i]; } - sortedPoints.sort(lexicographicOrder); - for (i = 0; i < n; ++i) { flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]]; } - - var upperIndexes = computeUpperHullIndexes(sortedPoints), - lowerIndexes = computeUpperHullIndexes(flippedPoints); + if (clipLine(a, b, x0, y0, x1, y1)) { + if (!v_) { + activeStream.lineStart(); + activeStream.point(a[0], a[1]); + } - // Construct the hull polygon, removing possible duplicate endpoints. - var skipLeft = lowerIndexes[0] === upperIndexes[0], - skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1], - hull = []; + activeStream.point(b[0], b[1]); + if (!v) activeStream.lineEnd(); + clean = false; + } else if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + clean = false; + } + } + } - // Add upper hull in right-to-l order. - // Then add lower hull in left-to-right order. - for (i = upperIndexes.length - 1; i >= 0; --i) { hull.push(points[sortedPoints[upperIndexes[i]][2]]); } - for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) { hull.push(points[sortedPoints[lowerIndexes[i]][2]]); } + x_ = x, y_ = y, v_ = v; + } - return hull; + return clipStream; + }; } - // vector equals - function geoVecEqual(a, b, epsilon) { - if (epsilon) { - return (Math.abs(a[0] - b[0]) <= epsilon) && (Math.abs(a[1] - b[1]) <= epsilon); - } else { - return (a[0] === b[0]) && (a[1] === b[1]); - } - } + var lengthSum$1, lambda0, sinPhi0, cosPhi0; + var lengthStream$1 = { + sphere: noop$1, + point: noop$1, + lineStart: lengthLineStart, + lineEnd: noop$1, + polygonStart: noop$1, + polygonEnd: noop$1 + }; - // vector addition - function geoVecAdd(a, b) { - return [ a[0] + b[0], a[1] + b[1] ]; + function lengthLineStart() { + lengthStream$1.point = lengthPointFirst$1; + lengthStream$1.lineEnd = lengthLineEnd; } - // vector subtraction - function geoVecSubtract(a, b) { - return [ a[0] - b[0], a[1] - b[1] ]; + function lengthLineEnd() { + lengthStream$1.point = lengthStream$1.lineEnd = noop$1; } - // vector scaling - function geoVecScale(a, mag) { - return [ a[0] * mag, a[1] * mag ]; + function lengthPointFirst$1(lambda, phi) { + lambda *= radians, phi *= radians; + lambda0 = lambda, sinPhi0 = sin(phi), cosPhi0 = cos(phi); + lengthStream$1.point = lengthPoint$1; } - // vector rounding (was: geoRoundCoordinates) - function geoVecFloor(a) { - return [ Math.floor(a[0]), Math.floor(a[1]) ]; + function lengthPoint$1(lambda, phi) { + lambda *= radians, phi *= radians; + var sinPhi = sin(phi), + cosPhi = cos(phi), + delta = abs$2(lambda - lambda0), + cosDelta = cos(delta), + sinDelta = sin(delta), + x = cosPhi * sinDelta, + y = cosPhi0 * sinPhi - sinPhi0 * cosPhi * cosDelta, + z = sinPhi0 * sinPhi + cosPhi0 * cosPhi * cosDelta; + lengthSum$1.add(atan2(sqrt(x * x + y * y), z)); + lambda0 = lambda, sinPhi0 = sinPhi, cosPhi0 = cosPhi; } - // linear interpolation - function geoVecInterp(a, b, t) { - return [ - a[0] + (b[0] - a[0]) * t, - a[1] + (b[1] - a[1]) * t - ]; + function d3_geoLength (object) { + lengthSum$1 = new Adder(); + d3_geoStream(object, lengthStream$1); + return +lengthSum$1; } - // http://jsperf.com/id-dist-optimization - function geoVecLength(a, b) { - return Math.sqrt(geoVecLengthSquare(a,b)); - } + var identity$4 = (function (x) { + return x; + }); - // length of vector raised to the power two - function geoVecLengthSquare(a, b) { - b = b || [0, 0]; - var x = a[0] - b[0]; - var y = a[1] - b[1]; - return (x * x) + (y * y); - } + var areaSum = new Adder(), + areaRingSum = new Adder(), + x00$2, + y00$2, + x0$3, + y0$3; + var areaStream = { + point: noop$1, + lineStart: noop$1, + lineEnd: noop$1, + polygonStart: function polygonStart() { + areaStream.lineStart = areaRingStart; + areaStream.lineEnd = areaRingEnd; + }, + polygonEnd: function polygonEnd() { + areaStream.lineStart = areaStream.lineEnd = areaStream.point = noop$1; + areaSum.add(abs$2(areaRingSum)); + areaRingSum = new Adder(); + }, + result: function result() { + var area = areaSum / 2; + areaSum = new Adder(); + return area; + } + }; - // get a unit vector - function geoVecNormalize(a) { - var length = Math.sqrt((a[0] * a[0]) + (a[1] * a[1])); - if (length !== 0) { - return geoVecScale(a, 1 / length); - } - return [0, 0]; + function areaRingStart() { + areaStream.point = areaPointFirst; } - // Return the counterclockwise angle in the range (-pi, pi) - // between the positive X axis and the line intersecting a and b. - function geoVecAngle(a, b) { - return Math.atan2(b[1] - a[1], b[0] - a[0]); + function areaPointFirst(x, y) { + areaStream.point = areaPoint; + x00$2 = x0$3 = x, y00$2 = y0$3 = y; } - // dot product - function geoVecDot(a, b, origin) { - origin = origin || [0, 0]; - var p = geoVecSubtract(a, origin); - var q = geoVecSubtract(b, origin); - return (p[0]) * (q[0]) + (p[1]) * (q[1]); + function areaPoint(x, y) { + areaRingSum.add(y0$3 * x - x0$3 * y); + x0$3 = x, y0$3 = y; } - // normalized dot product - function geoVecNormalizedDot(a, b, origin) { - origin = origin || [0, 0]; - var p = geoVecNormalize(geoVecSubtract(a, origin)); - var q = geoVecNormalize(geoVecSubtract(b, origin)); - return geoVecDot(p, q); + function areaRingEnd() { + areaPoint(x00$2, y00$2); } - // 2D cross product of OA and OB vectors, returns magnitude of Z vector - // Returns a positive value, if OAB makes a counter-clockwise turn, - // negative for clockwise turn, and zero if the points are collinear. - function geoVecCross(a, b, origin) { - origin = origin || [0, 0]; - var p = geoVecSubtract(a, origin); - var q = geoVecSubtract(b, origin); - return (p[0]) * (q[1]) - (p[1]) * (q[0]); + var x0$2 = Infinity, + y0$2 = x0$2, + x1 = -x0$2, + y1 = x1; + var boundsStream = { + point: boundsPoint, + lineStart: noop$1, + lineEnd: noop$1, + polygonStart: noop$1, + polygonEnd: noop$1, + result: function result() { + var bounds = [[x0$2, y0$2], [x1, y1]]; + x1 = y1 = -(y0$2 = x0$2 = Infinity); + return bounds; + } + }; + + function boundsPoint(x, y) { + if (x < x0$2) x0$2 = x; + if (x > x1) x1 = x; + if (y < y0$2) y0$2 = y; + if (y > y1) y1 = y; } + var X0 = 0, + Y0 = 0, + Z0 = 0, + X1 = 0, + Y1 = 0, + Z1 = 0, + X2 = 0, + Y2 = 0, + Z2 = 0, + x00$1, + y00$1, + x0$1, + y0$1; + var centroidStream = { + point: centroidPoint, + lineStart: centroidLineStart, + lineEnd: centroidLineEnd, + polygonStart: function polygonStart() { + centroidStream.lineStart = centroidRingStart; + centroidStream.lineEnd = centroidRingEnd; + }, + polygonEnd: function polygonEnd() { + centroidStream.point = centroidPoint; + centroidStream.lineStart = centroidLineStart; + centroidStream.lineEnd = centroidLineEnd; + }, + result: function result() { + var centroid = Z2 ? [X2 / Z2, Y2 / Z2] : Z1 ? [X1 / Z1, Y1 / Z1] : Z0 ? [X0 / Z0, Y0 / Z0] : [NaN, NaN]; + X0 = Y0 = Z0 = X1 = Y1 = Z1 = X2 = Y2 = Z2 = 0; + return centroid; + } + }; - // find closest orthogonal projection of point onto points array - function geoVecProject(a, points) { - var min = Infinity; - var idx; - var target; - - for (var i = 0; i < points.length - 1; i++) { - var o = points[i]; - var s = geoVecSubtract(points[i + 1], o); - var v = geoVecSubtract(a, o); - var proj = geoVecDot(v, s) / geoVecDot(s, s); - var p; - - if (proj < 0) { - p = o; - } else if (proj > 1) { - p = points[i + 1]; - } else { - p = [o[0] + proj * s[0], o[1] + proj * s[1]]; - } + function centroidPoint(x, y) { + X0 += x; + Y0 += y; + ++Z0; + } - var dist = geoVecLength(p, a); - if (dist < min) { - min = dist; - idx = i + 1; - target = p; - } - } + function centroidLineStart() { + centroidStream.point = centroidPointFirstLine; + } - if (idx !== undefined) { - return { index: idx, distance: min, target: target }; - } else { - return null; - } + function centroidPointFirstLine(x, y) { + centroidStream.point = centroidPointLine; + centroidPoint(x0$1 = x, y0$1 = y); } - // Return the counterclockwise angle in the range (-pi, pi) - // between the positive X axis and the line intersecting a and b. - function geoAngle(a, b, projection) { - return geoVecAngle(projection(a.loc), projection(b.loc)); + function centroidPointLine(x, y) { + var dx = x - x0$1, + dy = y - y0$1, + z = sqrt(dx * dx + dy * dy); + X1 += z * (x0$1 + x) / 2; + Y1 += z * (y0$1 + y) / 2; + Z1 += z; + centroidPoint(x0$1 = x, y0$1 = y); } + function centroidLineEnd() { + centroidStream.point = centroidPoint; + } - function geoEdgeEqual(a, b) { - return (a[0] === b[0] && a[1] === b[1]) || - (a[0] === b[1] && a[1] === b[0]); + function centroidRingStart() { + centroidStream.point = centroidPointFirstRing; } + function centroidRingEnd() { + centroidPointRing(x00$1, y00$1); + } - // Rotate all points counterclockwise around a pivot point by given angle - function geoRotate(points, angle, around) { - return points.map(function(point) { - var radial = geoVecSubtract(point, around); - return [ - radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0], - radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1] - ]; - }); + function centroidPointFirstRing(x, y) { + centroidStream.point = centroidPointRing; + centroidPoint(x00$1 = x0$1 = x, y00$1 = y0$1 = y); } + function centroidPointRing(x, y) { + var dx = x - x0$1, + dy = y - y0$1, + z = sqrt(dx * dx + dy * dy); + X1 += z * (x0$1 + x) / 2; + Y1 += z * (y0$1 + y) / 2; + Z1 += z; + z = y0$1 * x - x0$1 * y; + X2 += z * (x0$1 + x); + Y2 += z * (y0$1 + y); + Z2 += z * 3; + centroidPoint(x0$1 = x, y0$1 = y); + } - // Choose the edge with the minimal distance from `point` to its orthogonal - // projection onto that edge, if such a projection exists, or the distance to - // the closest vertex on that edge. Returns an object with the `index` of the - // chosen edge, the chosen `loc` on that edge, and the `distance` to to it. - function geoChooseEdge(nodes, point, projection, activeID) { - var dist = geoVecLength; - var points = nodes.map(function(n) { return projection(n.loc); }); - var ids = nodes.map(function(n) { return n.id; }); - var min = Infinity; - var idx; - var loc; - - for (var i = 0; i < points.length - 1; i++) { - if (ids[i] === activeID || ids[i + 1] === activeID) { continue; } - - var o = points[i]; - var s = geoVecSubtract(points[i + 1], o); - var v = geoVecSubtract(point, o); - var proj = geoVecDot(v, s) / geoVecDot(s, s); - var p; - - if (proj < 0) { - p = o; - } else if (proj > 1) { - p = points[i + 1]; - } else { - p = [o[0] + proj * s[0], o[1] + proj * s[1]]; - } + function PathContext(context) { + this._context = context; + } + PathContext.prototype = { + _radius: 4.5, + pointRadius: function pointRadius(_) { + return this._radius = _, this; + }, + polygonStart: function polygonStart() { + this._line = 0; + }, + polygonEnd: function polygonEnd() { + this._line = NaN; + }, + lineStart: function lineStart() { + this._point = 0; + }, + lineEnd: function lineEnd() { + if (this._line === 0) this._context.closePath(); + this._point = NaN; + }, + point: function point(x, y) { + switch (this._point) { + case 0: + { + this._context.moveTo(x, y); - var d = dist(p, point); - if (d < min) { - min = d; - idx = i + 1; - loc = projection.invert(p); + this._point = 1; + break; } - } - - if (idx !== undefined) { - return { index: idx, distance: min, loc: loc }; - } else { - return null; - } - } + case 1: + { + this._context.lineTo(x, y); - // Test active (dragged or drawing) segments against inactive segments - // This is used to test e.g. multipolygon rings that cross - // `activeNodes` is the ring containing the activeID being dragged. - // `inactiveNodes` is the other ring to test against - function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) { - var actives = []; - var inactives = []; - var j, k, n1, n2, segment; - - // gather active segments (only segments in activeNodes that contain the activeID) - for (j = 0; j < activeNodes.length - 1; j++) { - n1 = activeNodes[j]; - n2 = activeNodes[j+1]; - segment = [n1.loc, n2.loc]; - if (n1.id === activeID || n2.id === activeID) { - actives.push(segment); - } - } - - // gather inactive segments - for (j = 0; j < inactiveNodes.length - 1; j++) { - n1 = inactiveNodes[j]; - n2 = inactiveNodes[j+1]; - segment = [n1.loc, n2.loc]; - inactives.push(segment); - } - - // test - for (j = 0; j < actives.length; j++) { - for (k = 0; k < inactives.length; k++) { - var p = actives[j]; - var q = inactives[k]; - var hit = geoLineIntersection(p, q); - if (hit) { - return true; - } + break; } - } - return false; - } + default: + { + this._context.moveTo(x + this._radius, y); + this._context.arc(x, y, this._radius, 0, tau); - // Test active (dragged or drawing) segments against inactive segments - // This is used to test whether a way intersects with itself. - function geoHasSelfIntersections(nodes, activeID) { - var actives = []; - var inactives = []; - var j, k; - - // group active and passive segments along the nodes - for (j = 0; j < nodes.length - 1; j++) { - var n1 = nodes[j]; - var n2 = nodes[j+1]; - var segment = [n1.loc, n2.loc]; - if (n1.id === activeID || n2.id === activeID) { - actives.push(segment); - } else { - inactives.push(segment); + break; } } + }, + result: noop$1 + }; - // test - for (j = 0; j < actives.length; j++) { - for (k = 0; k < inactives.length; k++) { - var p = actives[j]; - var q = inactives[k]; - // skip if segments share an endpoint - if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) || - geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1]) ) { - continue; - } + var lengthSum = new Adder(), + lengthRing, + x00, + y00, + x0, + y0; + var lengthStream = { + point: noop$1, + lineStart: function lineStart() { + lengthStream.point = lengthPointFirst; + }, + lineEnd: function lineEnd() { + if (lengthRing) lengthPoint(x00, y00); + lengthStream.point = noop$1; + }, + polygonStart: function polygonStart() { + lengthRing = true; + }, + polygonEnd: function polygonEnd() { + lengthRing = null; + }, + result: function result() { + var length = +lengthSum; + lengthSum = new Adder(); + return length; + } + }; - var hit = geoLineIntersection(p, q); - if (hit) { - var epsilon = 1e-8; - // skip if the hit is at the segment's endpoint - if (geoVecEqual(p[1], hit, epsilon) || geoVecEqual(p[0], hit, epsilon) || - geoVecEqual(q[1], hit, epsilon) || geoVecEqual(q[0], hit, epsilon) ) { - continue; - } else { - return true; - } - } - } - } + function lengthPointFirst(x, y) { + lengthStream.point = lengthPoint; + x00 = x0 = x, y00 = y0 = y; + } - return false; + function lengthPoint(x, y) { + x0 -= x, y0 -= y; + lengthSum.add(sqrt(x0 * x0 + y0 * y0)); + x0 = x, y0 = y; } + function PathString() { + this._string = []; + } + PathString.prototype = { + _radius: 4.5, + _circle: circle(4.5), + pointRadius: function pointRadius(_) { + if ((_ = +_) !== this._radius) this._radius = _, this._circle = null; + return this; + }, + polygonStart: function polygonStart() { + this._line = 0; + }, + polygonEnd: function polygonEnd() { + this._line = NaN; + }, + lineStart: function lineStart() { + this._point = 0; + }, + lineEnd: function lineEnd() { + if (this._line === 0) this._string.push("Z"); + this._point = NaN; + }, + point: function point(x, y) { + switch (this._point) { + case 0: + { + this._string.push("M", x, ",", y); - // Return the intersection point of 2 line segments. - // From https://github.com/pgkelley4/line-segments-intersect - // This uses the vector cross product approach described below: - // http://stackoverflow.com/a/565282/786339 - function geoLineIntersection(a, b) { - var p = [a[0][0], a[0][1]]; - var p2 = [a[1][0], a[1][1]]; - var q = [b[0][0], b[0][1]]; - var q2 = [b[1][0], b[1][1]]; - var r = geoVecSubtract(p2, p); - var s = geoVecSubtract(q2, q); - var uNumerator = geoVecCross(geoVecSubtract(q, p), r); - var denominator = geoVecCross(r, s); + this._point = 1; + break; + } - if (uNumerator && denominator) { - var u = uNumerator / denominator; - var t = geoVecCross(geoVecSubtract(q, p), s) / denominator; + case 1: + { + this._string.push("L", x, ",", y); - if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) { - return geoVecInterp(p, p2, t); + break; } - } - return null; - } + default: + { + if (this._circle == null) this._circle = circle(this._radius); + this._string.push("M", x, ",", y, this._circle); - function geoPathIntersections(path1, path2) { - var intersections = []; - for (var i = 0; i < path1.length - 1; i++) { - for (var j = 0; j < path2.length - 1; j++) { - var a = [ path1[i], path1[i+1] ]; - var b = [ path2[j], path2[j+1] ]; - var hit = geoLineIntersection(a, b); - if (hit) { - intersections.push(hit); - } + break; } } - return intersections; - } + }, + result: function result() { + if (this._string.length) { + var result = this._string.join(""); - function geoPathHasIntersections(path1, path2) { - for (var i = 0; i < path1.length - 1; i++) { - for (var j = 0; j < path2.length - 1; j++) { - var a = [ path1[i], path1[i+1] ]; - var b = [ path2[j], path2[j+1] ]; - var hit = geoLineIntersection(a, b); - if (hit) { - return true; - } - } + this._string = []; + return result; + } else { + return null; } - return false; - } - + } + }; - // Return whether point is contained in polygon. - // - // `point` should be a 2-item array of coordinates. - // `polygon` should be an array of 2-item arrays of coordinates. - // - // From https://github.com/substack/point-in-polygon. - // ray-casting algorithm based on - // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html - // - function geoPointInPolygon(point, polygon) { - var x = point[0]; - var y = point[1]; - var inside = false; + function circle(radius) { + return "m0," + radius + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + "z"; + } - for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) { - var xi = polygon[i][0]; - var yi = polygon[i][1]; - var xj = polygon[j][0]; - var yj = polygon[j][1]; + function d3_geoPath (projection, context) { + var pointRadius = 4.5, + projectionStream, + contextStream; - var intersect = ((yi > y) !== (yj > y)) && - (x < (xj - xi) * (y - yi) / (yj - yi) + xi); - if (intersect) { inside = !inside; } + function path(object) { + if (object) { + if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments)); + d3_geoStream(object, projectionStream(contextStream)); } - return inside; - } + return contextStream.result(); + } + path.area = function (object) { + d3_geoStream(object, projectionStream(areaStream)); + return areaStream.result(); + }; - function geoPolygonContainsPolygon(outer, inner) { - return inner.every(function(point) { - return geoPointInPolygon(point, outer); - }); - } + path.measure = function (object) { + d3_geoStream(object, projectionStream(lengthStream)); + return lengthStream.result(); + }; + path.bounds = function (object) { + d3_geoStream(object, projectionStream(boundsStream)); + return boundsStream.result(); + }; - function geoPolygonIntersectsPolygon(outer, inner, checkSegments) { - function testPoints(outer, inner) { - return inner.some(function(point) { - return geoPointInPolygon(point, outer); - }); - } + path.centroid = function (object) { + d3_geoStream(object, projectionStream(centroidStream)); + return centroidStream.result(); + }; - return testPoints(outer, inner) || (!!checkSegments && geoPathHasIntersections(outer, inner)); - } + path.projection = function (_) { + return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$4) : (projection = _).stream, path) : projection; + }; + path.context = function (_) { + if (!arguments.length) return context; + contextStream = _ == null ? (context = null, new PathString()) : new PathContext(context = _); + if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius); + return path; + }; - // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points - // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756 - function geoGetSmallestSurroundingRectangle(points) { - var hull = d3_polygonHull(points); - var centroid = d3_polygonCentroid(hull); - var minArea = Infinity; - var ssrExtent = []; - var ssrAngle = 0; - var c1 = hull[0]; - - for (var i = 0; i <= hull.length - 1; i++) { - var c2 = (i === hull.length - 1) ? hull[0] : hull[i + 1]; - var angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]); - var poly = geoRotate(hull, -angle, centroid); - var extent = poly.reduce(function(extent, point) { - return extent.extend(geoExtent(point)); - }, geoExtent()); - - var area = extent.area(); - if (area < minArea) { - minArea = area; - ssrExtent = extent; - ssrAngle = angle; - } - c1 = c2; - } + path.pointRadius = function (_) { + if (!arguments.length) return pointRadius; + pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); + return path; + }; - return { - poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid), - angle: ssrAngle - }; + return path.projection(projection).context(context); } - - function geoPathLength(path) { - var length = 0; - for (var i = 0; i < path.length - 1; i++) { - length += geoVecLength(path[i], path[i + 1]); - } - return length; + function d3_geoTransform (methods) { + return { + stream: transformer$1(methods) + }; } + function transformer$1(methods) { + return function (stream) { + var s = new TransformStream(); - - // If the given point is at the edge of the padded viewport, - // return a vector that will nudge the viewport in that direction - function geoViewportEdge(point, dimensions) { - var pad = [80, 20, 50, 20]; // top, right, bottom, left - var x = 0; - var y = 0; - - if (point[0] > dimensions[0] - pad[1]) - { x = -10; } - if (point[0] < pad[3]) - { x = 10; } - if (point[1] > dimensions[1] - pad[2]) - { y = -10; } - if (point[1] < pad[0]) - { y = 10; } - - if (x || y) { - return [x, y]; - } else { - return null; + for (var key in methods) { + s[key] = methods[key]; } - } - - var noop$3 = {value: function() {}}; - - function dispatch() { - var arguments$1 = arguments; - - for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { - if (!(t = arguments$1[i] + "") || (t in _) || /[\s.]/.test(t)) { throw new Error("illegal type: " + t); } - _[t] = []; - } - return new Dispatch(_); - } - function Dispatch(_) { - this._ = _; - } - - function parseTypenames(typenames, types) { - return typenames.trim().split(/^|\s+/).map(function(t) { - var name = "", i = t.indexOf("."); - if (i >= 0) { name = t.slice(i + 1), t = t.slice(0, i); } - if (t && !types.hasOwnProperty(t)) { throw new Error("unknown type: " + t); } - return {type: t, name: name}; - }); + s.stream = stream; + return s; + }; } - Dispatch.prototype = dispatch.prototype = { - constructor: Dispatch, - on: function(typename, callback) { - var _ = this._, - T = parseTypenames(typename + "", _), - t, - i = -1, - n = T.length; - - // If no callback was specified, return the callback of the given type and name. - if (arguments.length < 2) { - while (++i < n) { if ((t = (typename = T[i]).type) && (t = get$1(_[t], typename.name))) { return t; } } - return; - } - - // If a type was specified, set the callback for the given type and name. - // Otherwise, if a null callback was specified, remove callbacks of the given name. - if (callback != null && typeof callback !== "function") { throw new Error("invalid callback: " + callback); } - while (++i < n) { - if (t = (typename = T[i]).type) { _[t] = set(_[t], typename.name, callback); } - else if (callback == null) { for (t in _) { _[t] = set(_[t], typename.name, null); } } - } + function TransformStream() {} - return this; + TransformStream.prototype = { + constructor: TransformStream, + point: function point(x, y) { + this.stream.point(x, y); }, - copy: function() { - var copy = {}, _ = this._; - for (var t in _) { copy[t] = _[t].slice(); } - return new Dispatch(copy); + sphere: function sphere() { + this.stream.sphere(); }, - call: function(type, that) { - var arguments$1 = arguments; - - if ((n = arguments.length - 2) > 0) { for (var args = new Array(n), i = 0, n, t; i < n; ++i) { args[i] = arguments$1[i + 2]; } } - if (!this._.hasOwnProperty(type)) { throw new Error("unknown type: " + type); } - for (t = this._[type], i = 0, n = t.length; i < n; ++i) { t[i].value.apply(that, args); } + lineStart: function lineStart() { + this.stream.lineStart(); + }, + lineEnd: function lineEnd() { + this.stream.lineEnd(); + }, + polygonStart: function polygonStart() { + this.stream.polygonStart(); }, - apply: function(type, that, args) { - if (!this._.hasOwnProperty(type)) { throw new Error("unknown type: " + type); } - for (var t = this._[type], i = 0, n = t.length; i < n; ++i) { t[i].value.apply(that, args); } + polygonEnd: function polygonEnd() { + this.stream.polygonEnd(); } }; - function get$1(type, name) { - for (var i = 0, n = type.length, c; i < n; ++i) { - if ((c = type[i]).name === name) { - return c.value; - } - } - } - - function set(type, name, callback) { - for (var i = 0, n = type.length; i < n; ++i) { - if (type[i].name === name) { - type[i] = noop$3, type = type.slice(0, i).concat(type.slice(i + 1)); - break; - } - } - if (callback != null) { type.push({name: name, value: callback}); } - return type; + function fit(projection, fitBounds, object) { + var clip = projection.clipExtent && projection.clipExtent(); + projection.scale(150).translate([0, 0]); + if (clip != null) projection.clipExtent(null); + d3_geoStream(object, projection.stream(boundsStream)); + fitBounds(boundsStream.result()); + if (clip != null) projection.clipExtent(clip); + return projection; } - var xhtml = "http://www.w3.org/1999/xhtml"; - - var namespaces = { - svg: "http://www.w3.org/2000/svg", - xhtml: xhtml, - xlink: "http://www.w3.org/1999/xlink", - xml: "http://www.w3.org/XML/1998/namespace", - xmlns: "http://www.w3.org/2000/xmlns/" - }; - - function namespace(name) { - var prefix = name += "", i = prefix.indexOf(":"); - if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") { name = name.slice(i + 1); } - return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; + function fitExtent(projection, extent, object) { + return fit(projection, function (b) { + var w = extent[1][0] - extent[0][0], + h = extent[1][1] - extent[0][1], + k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])), + x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2, + y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2; + projection.scale(150 * k).translate([x, y]); + }, object); } - - function creatorInherit(name) { - return function() { - var document = this.ownerDocument, - uri = this.namespaceURI; - return uri === xhtml && document.documentElement.namespaceURI === xhtml - ? document.createElement(name) - : document.createElementNS(uri, name); - }; + function fitSize(projection, size, object) { + return fitExtent(projection, [[0, 0], size], object); } - - function creatorFixed(fullname) { - return function() { - return this.ownerDocument.createElementNS(fullname.space, fullname.local); - }; + function fitWidth(projection, width, object) { + return fit(projection, function (b) { + var w = +width, + k = w / (b[1][0] - b[0][0]), + x = (w - k * (b[1][0] + b[0][0])) / 2, + y = -k * b[0][1]; + projection.scale(150 * k).translate([x, y]); + }, object); } - - function creator(name) { - var fullname = namespace(name); - return (fullname.local - ? creatorFixed - : creatorInherit)(fullname); + function fitHeight(projection, height, object) { + return fit(projection, function (b) { + var h = +height, + k = h / (b[1][1] - b[0][1]), + x = -k * b[0][0], + y = (h - k * (b[1][1] + b[0][1])) / 2; + projection.scale(150 * k).translate([x, y]); + }, object); } - function none() {} + var maxDepth = 16, + // maximum depth of subdivision + cosMinDistance = cos(30 * radians); // cos(minimum angular distance) - function selector(selector) { - return selector == null ? none : function() { - return this.querySelector(selector); - }; + function resample (project, delta2) { + return +delta2 ? resample$1(project, delta2) : resampleNone(project); } - function selection_select(select) { - if (typeof select !== "function") { select = selector(select); } - - for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { - if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { - if ("__data__" in node) { subnode.__data__ = node.__data__; } - subgroup[i] = subnode; - } + function resampleNone(project) { + return transformer$1({ + point: function point(x, y) { + x = project(x, y); + this.stream.point(x[0], x[1]); } - } - - return new Selection(subgroups, this._parents); - } - - function empty() { - return []; + }); } - function selectorAll(selector) { - return selector == null ? empty : function() { - return this.querySelectorAll(selector); - }; - } + function resample$1(project, delta2) { + function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) { + var dx = x1 - x0, + dy = y1 - y0, + d2 = dx * dx + dy * dy; - function selection_selectAll(select) { - if (typeof select !== "function") { select = selectorAll(select); } + if (d2 > 4 * delta2 && depth--) { + var a = a0 + a1, + b = b0 + b1, + c = c0 + c1, + m = sqrt(a * a + b * b + c * c), + phi2 = asin(c /= m), + lambda2 = abs$2(abs$2(c) - 1) < epsilon$1 || abs$2(lambda0 - lambda1) < epsilon$1 ? (lambda0 + lambda1) / 2 : atan2(b, a), + p = project(lambda2, phi2), + x2 = p[0], + y2 = p[1], + dx2 = x2 - x0, + dy2 = y2 - y0, + dz = dy * dx2 - dx * dy2; - for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { - if (node = group[i]) { - subgroups.push(select.call(node, node.__data__, i, group)); - parents.push(node); + if (dz * dz / d2 > delta2 // perpendicular projected distance + || abs$2((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end + || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { + // angular distance + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream); + stream.point(x2, y2); + resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream); } } } - return new Selection(subgroups, parents); - } - - function matcher(selector) { - return function() { - return this.matches(selector); - }; - } - - function selection_filter(match) { - if (typeof match !== "function") { match = matcher(match); } + return function (stream) { + var lambda00, x00, y00, a00, b00, c00, // first point + lambda0, x0, y0, a0, b0, c0; // previous point - for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { - if ((node = group[i]) && match.call(node, node.__data__, i, group)) { - subgroup.push(node); + var resampleStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function polygonStart() { + stream.polygonStart(); + resampleStream.lineStart = ringStart; + }, + polygonEnd: function polygonEnd() { + stream.polygonEnd(); + resampleStream.lineStart = lineStart; } + }; + + function point(x, y) { + x = project(x, y); + stream.point(x[0], x[1]); } - } - return new Selection(subgroups, this._parents); - } + function lineStart() { + x0 = NaN; + resampleStream.point = linePoint; + stream.lineStart(); + } - function sparse(update) { - return new Array(update.length); - } + function linePoint(lambda, phi) { + var c = cartesian([lambda, phi]), + p = project(lambda, phi); + 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); + stream.point(x0, y0); + } - function selection_enter() { - return new Selection(this._enter || this._groups.map(sparse), this._parents); - } - - function EnterNode(parent, datum) { - this.ownerDocument = parent.ownerDocument; - this.namespaceURI = parent.namespaceURI; - this._next = null; - this._parent = parent; - this.__data__ = datum; - } - - EnterNode.prototype = { - constructor: EnterNode, - appendChild: function(child) { return this._parent.insertBefore(child, this._next); }, - insertBefore: function(child, next) { return this._parent.insertBefore(child, next); }, - querySelector: function(selector) { return this._parent.querySelector(selector); }, - querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); } - }; - - function constant(x) { - return function() { - return x; - }; - } - - var keyPrefix = "$"; // Protect against keys like “__proto__”. - - function bindIndex(parent, group, enter, update, exit, data) { - var i = 0, - node, - groupLength = group.length, - dataLength = data.length; - - // Put any non-null nodes that fit into update. - // Put any null nodes into enter. - // Put any remaining data into enter. - for (; i < dataLength; ++i) { - if (node = group[i]) { - node.__data__ = data[i]; - update[i] = node; - } else { - enter[i] = new EnterNode(parent, data[i]); + function lineEnd() { + resampleStream.point = point; + stream.lineEnd(); } - } - // Put any non-null nodes that don’t fit into exit. - for (; i < groupLength; ++i) { - if (node = group[i]) { - exit[i] = node; + function ringStart() { + lineStart(); + resampleStream.point = ringPoint; + resampleStream.lineEnd = ringEnd; } - } - } - - function bindKey(parent, group, enter, update, exit, data, key) { - var i, - node, - nodeByKeyValue = {}, - groupLength = group.length, - dataLength = data.length, - keyValues = new Array(groupLength), - keyValue; - // Compute the key for each node. - // If multiple nodes have the same key, the duplicates are added to exit. - for (i = 0; i < groupLength; ++i) { - if (node = group[i]) { - keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group); - if (keyValue in nodeByKeyValue) { - exit[i] = node; - } else { - nodeByKeyValue[keyValue] = node; - } + function ringPoint(lambda, phi) { + linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0; + resampleStream.point = linePoint; } - } - // Compute the key for each datum. - // If there a node associated with this key, join and add it to update. - // If there is not (or the key is a duplicate), add it to enter. - for (i = 0; i < dataLength; ++i) { - keyValue = keyPrefix + key.call(parent, data[i], i, data); - if (node = nodeByKeyValue[keyValue]) { - update[i] = node; - node.__data__ = data[i]; - nodeByKeyValue[keyValue] = null; - } else { - enter[i] = new EnterNode(parent, data[i]); + function ringEnd() { + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream); + resampleStream.lineEnd = lineEnd; + lineEnd(); } - } - // Add any remaining nodes that were not bound to data to exit. - for (i = 0; i < groupLength; ++i) { - if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) { - exit[i] = node; - } - } + return resampleStream; + }; } - function selection_data(value, key) { - if (!value) { - data = new Array(this.size()), j = -1; - this.each(function(d) { data[++j] = d; }); - return data; + var transformRadians = transformer$1({ + point: function point(x, y) { + this.stream.point(x * radians, y * radians); } + }); - var bind = key ? bindKey : bindIndex, - parents = this._parents, - groups = this._groups; - - if (typeof value !== "function") { value = constant(value); } - - for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) { - var parent = parents[j], - group = groups[j], - groupLength = group.length, - data = value.call(parent, parent && parent.__data__, j, parents), - dataLength = data.length, - enterGroup = enter[j] = new Array(dataLength), - updateGroup = update[j] = new Array(dataLength), - exitGroup = exit[j] = new Array(groupLength); - - bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); - - // Now connect the enter nodes to their following update node, such that - // appendChild can insert the materialized enter node before this node, - // rather than at the end of the parent node. - for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { - if (previous = enterGroup[i0]) { - if (i0 >= i1) { i1 = i0 + 1; } - while (!(next = updateGroup[i1]) && ++i1 < dataLength){ } - previous._next = next || null; - } + function transformRotate(rotate) { + return transformer$1({ + point: function point(x, y) { + var r = rotate(x, y); + return this.stream.point(r[0], r[1]); } - } - - update = new Selection(update, parents); - update._enter = enter; - update._exit = exit; - return update; - } - - function selection_exit() { - return new Selection(this._exit || this._groups.map(sparse), this._parents); - } - - function selection_join(onenter, onupdate, onexit) { - var enter = this.enter(), update = this, exit = this.exit(); - enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + ""); - if (onupdate != null) { update = onupdate(update); } - if (onexit == null) { exit.remove(); } else { onexit(exit); } - return enter && update ? enter.merge(update).order() : update; + }); } - function selection_merge(selection) { - - for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { - for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { - if (node = group0[i] || group1[i]) { - merge[i] = node; - } - } + function scaleTranslate(k, dx, dy, sx, sy) { + function transform(x, y) { + x *= sx; + y *= sy; + return [dx + k * x, dy - k * y]; } - for (; j < m0; ++j) { - merges[j] = groups0[j]; - } + transform.invert = function (x, y) { + return [(x - dx) / k * sx, (dy - y) / k * sy]; + }; - return new Selection(merges, this._parents); + return transform; } - function selection_order() { + function scaleTranslateRotate(k, dx, dy, sx, sy, alpha) { + if (!alpha) return scaleTranslate(k, dx, dy, sx, sy); + var cosAlpha = cos(alpha), + sinAlpha = sin(alpha), + a = cosAlpha * k, + b = sinAlpha * k, + ai = cosAlpha / k, + bi = sinAlpha / k, + ci = (sinAlpha * dy - cosAlpha * dx) / k, + fi = (sinAlpha * dx + cosAlpha * dy) / k; - for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) { - for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) { - if (node = group[i]) { - if (next && node.compareDocumentPosition(next) ^ 4) { next.parentNode.insertBefore(node, next); } - next = node; - } - } + function transform(x, y) { + x *= sx; + y *= sy; + return [a * x - b * y + dx, dy - b * x - a * y]; } - return this; + transform.invert = function (x, y) { + return [sx * (ai * x - bi * y + ci), sy * (fi - bi * x - ai * y)]; + }; + + return transform; } - function selection_sort(compare) { - if (!compare) { compare = ascending; } + function projection(project) { + return projectionMutator(function () { + return project; + })(); + } + function projectionMutator(projectAt) { + var project, + k = 150, + // scale + x = 480, + y = 250, + // translate + lambda = 0, + phi = 0, + // center + deltaLambda = 0, + deltaPhi = 0, + deltaGamma = 0, + rotate, + // pre-rotate + alpha = 0, + // post-rotate angle + sx = 1, + // reflectX + sy = 1, + // reflectX + theta = null, + preclip = clipAntimeridian, + // pre-clip angle + x0 = null, + y0, + x1, + y1, + postclip = identity$4, + // post-clip extent + delta2 = 0.5, + // precision + projectResample, + projectTransform, + projectRotateTransform, + cache, + cacheStream; - function compareNode(a, b) { - return a && b ? compare(a.__data__, b.__data__) : !a - !b; + function projection(point) { + return projectRotateTransform(point[0] * radians, point[1] * radians); } - for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { - if (node = group[i]) { - sortgroup[i] = node; - } - } - sortgroup.sort(compareNode); + function invert(point) { + point = projectRotateTransform.invert(point[0], point[1]); + return point && [point[0] * degrees$1, point[1] * degrees$1]; } - return new Selection(sortgroups, this._parents).order(); - } - - function ascending(a, b) { - return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; - } - - function selection_call() { - var callback = arguments[0]; - arguments[0] = this; - callback.apply(null, arguments); - return this; - } + projection.stream = function (stream) { + return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream))))); + }; - function selection_nodes() { - var nodes = new Array(this.size()), i = -1; - this.each(function() { nodes[++i] = this; }); - return nodes; - } + projection.preclip = function (_) { + return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip; + }; - function selection_node() { + projection.postclip = function (_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }; - for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { - for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { - var node = group[i]; - if (node) { return node; } - } - } + projection.clipAngle = function (_) { + return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1; + }; - return null; - } + projection.clipExtent = function (_) { + 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]]; + }; - function selection_size() { - var size = 0; - this.each(function() { ++size; }); - return size; - } + projection.scale = function (_) { + return arguments.length ? (k = +_, recenter()) : k; + }; - function selection_empty() { - return !this.node(); - } + projection.translate = function (_) { + return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y]; + }; - function selection_each(callback) { + projection.center = function (_) { + return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1]; + }; - for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { - for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { - if (node = group[i]) { callback.call(node, node.__data__, i, group); } - } - } + projection.rotate = function (_) { + 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]; + }; - return this; - } + projection.angle = function (_) { + return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees$1; + }; - function attrRemove(name) { - return function() { - this.removeAttribute(name); + projection.reflectX = function (_) { + return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0; }; - } - function attrRemoveNS(fullname) { - return function() { - this.removeAttributeNS(fullname.space, fullname.local); + projection.reflectY = function (_) { + return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0; }; - } - function attrConstant(name, value) { - return function() { - this.setAttribute(name, value); + projection.precision = function (_) { + return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2); }; - } - function attrConstantNS(fullname, value) { - return function() { - this.setAttributeNS(fullname.space, fullname.local, value); + projection.fitExtent = function (extent, object) { + return fitExtent(projection, extent, object); }; - } - function attrFunction(name, value) { - return function() { - var v = value.apply(this, arguments); - if (v == null) { this.removeAttribute(name); } - else { this.setAttribute(name, v); } + projection.fitSize = function (size, object) { + return fitSize(projection, size, object); }; - } - function attrFunctionNS(fullname, value) { - return function() { - var v = value.apply(this, arguments); - if (v == null) { this.removeAttributeNS(fullname.space, fullname.local); } - else { this.setAttributeNS(fullname.space, fullname.local, v); } + projection.fitWidth = function (width, object) { + return fitWidth(projection, width, object); }; - } - function selection_attr(name, value) { - var fullname = namespace(name); + projection.fitHeight = function (height, object) { + return fitHeight(projection, height, object); + }; - if (arguments.length < 2) { - var node = this.node(); - return fullname.local - ? node.getAttributeNS(fullname.space, fullname.local) - : node.getAttribute(fullname); + function recenter() { + var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project(lambda, phi)), + transform = scaleTranslateRotate(k, x - center[0], y - center[1], sx, sy, alpha); + rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma); + projectTransform = compose(project, transform); + projectRotateTransform = compose(rotate, projectTransform); + projectResample = resample(projectTransform, delta2); + return reset(); } - return this.each((value == null - ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function" - ? (fullname.local ? attrFunctionNS : attrFunction) - : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value)); - } - - function defaultView(node) { - return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node - || (node.document && node) // node is a Window - || node.defaultView; // node is a Document - } + function reset() { + cache = cacheStream = null; + return projection; + } - function styleRemove(name) { - return function() { - this.style.removeProperty(name); + return function () { + project = projectAt.apply(this, arguments); + projection.invert = project.invert && invert; + return recenter(); }; } - function styleConstant(name, value, priority) { - return function() { - this.style.setProperty(name, value, priority); - }; + function mercatorRaw(lambda, phi) { + return [lambda, log$1(tan((halfPi + phi) / 2))]; } - function styleFunction(name, value, priority) { - return function() { - var v = value.apply(this, arguments); - if (v == null) { this.style.removeProperty(name); } - else { this.style.setProperty(name, v, priority); } - }; - } + mercatorRaw.invert = function (x, y) { + return [x, 2 * atan(exp$2(y)) - halfPi]; + }; - function selection_style(name, value, priority) { - return arguments.length > 1 - ? this.each((value == null - ? styleRemove : typeof value === "function" - ? styleFunction - : styleConstant)(name, value, priority == null ? "" : priority)) - : styleValue(this.node(), name); + function mercator () { + return mercatorProjection(mercatorRaw).scale(961 / tau); } + function mercatorProjection(project) { + var m = projection(project), + center = m.center, + scale = m.scale, + translate = m.translate, + clipExtent = m.clipExtent, + x0 = null, + y0, + x1, + y1; // clip extent - function styleValue(node, name) { - return node.style.getPropertyValue(name) - || defaultView(node).getComputedStyle(node, null).getPropertyValue(name); - } + m.scale = function (_) { + return arguments.length ? (scale(_), reclip()) : scale(); + }; - function propertyRemove(name) { - return function() { - delete this[name]; + m.translate = function (_) { + return arguments.length ? (translate(_), reclip()) : translate(); }; - } - function propertyConstant(name, value) { - return function() { - this[name] = value; + m.center = function (_) { + return arguments.length ? (center(_), reclip()) : center(); }; - } - function propertyFunction(name, value) { - return function() { - var v = value.apply(this, arguments); - if (v == null) { delete this[name]; } - else { this[name] = v; } + m.clipExtent = function (_) { + 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]]; }; - } - function selection_property(name, value) { - return arguments.length > 1 - ? this.each((value == null - ? propertyRemove : typeof value === "function" - ? propertyFunction - : propertyConstant)(name, value)) - : this.node()[name]; - } + function reclip() { + var k = pi * scale(), + t = m(rotation(m.rotate()).invert([0, 0])); + return clipExtent(x0 == null ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]] : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]); + } - function classArray(string) { - return string.trim().split(/^|\s+/); + return reclip(); } - function classList(node) { - return node.classList || new ClassList(node); - } + function d3_geoIdentity () { + var k = 1, + tx = 0, + ty = 0, + sx = 1, + sy = 1, + // scale, translate and reflect + alpha = 0, + ca, + sa, + // angle + x0 = null, + y0, + x1, + y1, + // clip extent + kx = 1, + ky = 1, + transform = transformer$1({ + point: function point(x, y) { + var p = projection([x, y]); + this.stream.point(p[0], p[1]); + } + }), + postclip = identity$4, + cache, + cacheStream; - function ClassList(node) { - this._node = node; - this._names = classArray(node.getAttribute("class") || ""); - } + function reset() { + kx = k * sx; + ky = k * sy; + cache = cacheStream = null; + return projection; + } - ClassList.prototype = { - add: function(name) { - var i = this._names.indexOf(name); - if (i < 0) { - this._names.push(name); - this._node.setAttribute("class", this._names.join(" ")); - } - }, - remove: function(name) { - var i = this._names.indexOf(name); - if (i >= 0) { - this._names.splice(i, 1); - this._node.setAttribute("class", this._names.join(" ")); + function projection(p) { + var x = p[0] * kx, + y = p[1] * ky; + + if (alpha) { + var t = y * ca - x * sa; + x = x * ca + y * sa; + y = t; } - }, - contains: function(name) { - return this._names.indexOf(name) >= 0; + + return [x + tx, y + ty]; } - }; - function classedAdd(node, names) { - var list = classList(node), i = -1, n = names.length; - while (++i < n) { list.add(names[i]); } - } + projection.invert = function (p) { + var x = p[0] - tx, + y = p[1] - ty; - function classedRemove(node, names) { - var list = classList(node), i = -1, n = names.length; - while (++i < n) { list.remove(names[i]); } - } + if (alpha) { + var t = y * ca + x * sa; + x = x * ca - y * sa; + y = t; + } - function classedTrue(names) { - return function() { - classedAdd(this, names); + return [x / kx, y / ky]; }; - } - function classedFalse(names) { - return function() { - classedRemove(this, names); + projection.stream = function (stream) { + return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream)); }; - } - function classedFunction(names, value) { - return function() { - (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); + projection.postclip = function (_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; }; - } - - function selection_classed(name, value) { - var names = classArray(name + ""); - if (arguments.length < 2) { - var list = classList(this.node()), i = -1, n = names.length; - while (++i < n) { if (!list.contains(names[i])) { return false; } } - return true; - } + projection.clipExtent = function (_) { + 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]]; + }; - return this.each((typeof value === "function" - ? classedFunction : value - ? classedTrue - : classedFalse)(names, value)); - } + projection.scale = function (_) { + return arguments.length ? (k = +_, reset()) : k; + }; - function textRemove() { - this.textContent = ""; - } + projection.translate = function (_) { + return arguments.length ? (tx = +_[0], ty = +_[1], reset()) : [tx, ty]; + }; - function textConstant(value) { - return function() { - this.textContent = value; + projection.angle = function (_) { + return arguments.length ? (alpha = _ % 360 * radians, sa = sin(alpha), ca = cos(alpha), reset()) : alpha * degrees$1; }; - } - function textFunction(value) { - return function() { - var v = value.apply(this, arguments); - this.textContent = v == null ? "" : v; + projection.reflectX = function (_) { + return arguments.length ? (sx = _ ? -1 : 1, reset()) : sx < 0; }; - } - function selection_text(value) { - return arguments.length - ? this.each(value == null - ? textRemove : (typeof value === "function" - ? textFunction - : textConstant)(value)) - : this.node().textContent; - } + projection.reflectY = function (_) { + return arguments.length ? (sy = _ ? -1 : 1, reset()) : sy < 0; + }; - function htmlRemove() { - this.innerHTML = ""; - } + projection.fitExtent = function (extent, object) { + return fitExtent(projection, extent, object); + }; - function htmlConstant(value) { - return function() { - this.innerHTML = value; + projection.fitSize = function (size, object) { + return fitSize(projection, size, object); }; - } - function htmlFunction(value) { - return function() { - var v = value.apply(this, arguments); - this.innerHTML = v == null ? "" : v; + projection.fitWidth = function (width, object) { + return fitWidth(projection, width, object); }; - } - function selection_html(value) { - return arguments.length - ? this.each(value == null - ? htmlRemove : (typeof value === "function" - ? htmlFunction - : htmlConstant)(value)) - : this.node().innerHTML; - } + projection.fitHeight = function (height, object) { + return fitHeight(projection, height, object); + }; - function raise() { - if (this.nextSibling) { this.parentNode.appendChild(this); } + return projection; } - function selection_raise() { - return this.each(raise); + // constants + var TAU = 2 * Math.PI; + var EQUATORIAL_RADIUS = 6356752.314245179; + var POLAR_RADIUS = 6378137.0; + function geoLatToMeters(dLat) { + return dLat * (TAU * POLAR_RADIUS / 360); } - - function lower() { - if (this.previousSibling) { this.parentNode.insertBefore(this, this.parentNode.firstChild); } + function geoLonToMeters(dLon, atLat) { + return Math.abs(atLat) >= 90 ? 0 : dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180))); } - - function selection_lower() { - return this.each(lower); + function geoMetersToLat(m) { + return m / (TAU * POLAR_RADIUS / 360); } - - function selection_append(name) { - var create = typeof name === "function" ? name : creator(name); - return this.select(function() { - return this.appendChild(create.apply(this, arguments)); - }); + function geoMetersToLon(m, atLat) { + return Math.abs(atLat) >= 90 ? 0 : m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180))); } - - function constantNull() { - return null; + function geoMetersToOffset(meters, tileSize) { + tileSize = tileSize || 256; + return [meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS), -meters[1] * tileSize / (TAU * POLAR_RADIUS)]; } + function geoOffsetToMeters(offset, tileSize) { + tileSize = tileSize || 256; + return [offset[0] * TAU * EQUATORIAL_RADIUS / tileSize, -offset[1] * TAU * POLAR_RADIUS / tileSize]; + } // Equirectangular approximation of spherical distances on Earth - function selection_insert(name, before) { - var create = typeof name === "function" ? name : creator(name), - select = before == null ? constantNull : typeof before === "function" ? before : selector(before); - return this.select(function() { - return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null); - }); - } + function geoSphericalDistance(a, b) { + var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2); + var y = geoLatToMeters(a[1] - b[1]); + return Math.sqrt(x * x + y * y); + } // scale to zoom - function remove() { - var parent = this.parentNode; - if (parent) { parent.removeChild(this); } - } + function geoScaleToZoom(k, tileSize) { + tileSize = tileSize || 256; + var log2ts = Math.log(tileSize) * Math.LOG2E; + return Math.log(k * TAU) / Math.LN2 - log2ts; + } // zoom to scale - function selection_remove() { - return this.each(remove); - } + function geoZoomToScale(z, tileSize) { + tileSize = tileSize || 256; + return tileSize * Math.pow(2, z) / TAU; + } // returns info about the node from `nodes` closest to the given `point` - function selection_cloneShallow() { - var clone = this.cloneNode(false), parent = this.parentNode; - return parent ? parent.insertBefore(clone, this.nextSibling) : clone; - } + function geoSphericalClosestNode(nodes, point) { + var minDistance = Infinity, + distance; + var indexOfMin; - function selection_cloneDeep() { - var clone = this.cloneNode(true), parent = this.parentNode; - return parent ? parent.insertBefore(clone, this.nextSibling) : clone; - } + for (var i in nodes) { + distance = geoSphericalDistance(nodes[i].loc, point); - function selection_clone(deep) { - return this.select(deep ? selection_cloneDeep : selection_cloneShallow); - } + if (distance < minDistance) { + minDistance = distance; + indexOfMin = i; + } + } - function selection_datum(value) { - return arguments.length - ? this.property("__data__", value) - : this.node().__data__; + if (indexOfMin !== undefined) { + return { + index: indexOfMin, + distance: minDistance, + node: nodes[indexOfMin] + }; + } else { + return null; + } } - var filterEvents = {}; - - var event = null; - - if (typeof document !== "undefined") { - var element = document.documentElement; - if (!("onmouseenter" in element)) { - filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"}; + function geoExtent(min, max) { + if (!(this instanceof geoExtent)) { + return new geoExtent(min, max); + } else if (min instanceof geoExtent) { + return min; + } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) { + this[0] = min[0]; + this[1] = min[1]; + } else { + this[0] = min || [Infinity, Infinity]; + this[1] = max || min || [-Infinity, -Infinity]; } } + geoExtent.prototype = new Array(2); + Object.assign(geoExtent.prototype, { + equals: function equals(obj) { + return this[0][0] === obj[0][0] && this[0][1] === obj[0][1] && this[1][0] === obj[1][0] && this[1][1] === obj[1][1]; + }, + extend: function extend(obj) { + if (!(obj instanceof geoExtent)) obj = new geoExtent(obj); + return geoExtent([Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])], [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]); + }, + _extend: function _extend(extent) { + this[0][0] = Math.min(extent[0][0], this[0][0]); + this[0][1] = Math.min(extent[0][1], this[0][1]); + this[1][0] = Math.max(extent[1][0], this[1][0]); + this[1][1] = Math.max(extent[1][1], this[1][1]); + }, + area: function area() { + return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1])); + }, + center: function center() { + return [(this[0][0] + this[1][0]) / 2, (this[0][1] + this[1][1]) / 2]; + }, + rectangle: function rectangle() { + return [this[0][0], this[0][1], this[1][0], this[1][1]]; + }, + bbox: function bbox() { + return { + minX: this[0][0], + minY: this[0][1], + maxX: this[1][0], + maxY: this[1][1] + }; + }, + polygon: function polygon() { + return [[this[0][0], this[0][1]], [this[0][0], this[1][1]], [this[1][0], this[1][1]], [this[1][0], this[0][1]], [this[0][0], this[0][1]]]; + }, + contains: function contains(obj) { + if (!(obj instanceof geoExtent)) obj = new geoExtent(obj); + return obj[0][0] >= this[0][0] && obj[0][1] >= this[0][1] && obj[1][0] <= this[1][0] && obj[1][1] <= this[1][1]; + }, + intersects: function intersects(obj) { + if (!(obj instanceof geoExtent)) obj = new geoExtent(obj); + return obj[0][0] <= this[1][0] && obj[0][1] <= this[1][1] && obj[1][0] >= this[0][0] && obj[1][1] >= this[0][1]; + }, + intersection: function intersection(obj) { + if (!this.intersects(obj)) return new geoExtent(); + return new geoExtent([Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])], [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]); + }, + percentContainedIn: function percentContainedIn(obj) { + if (!(obj instanceof geoExtent)) obj = new geoExtent(obj); + var a1 = this.intersection(obj).area(); + var a2 = this.area(); + + if (a1 === Infinity || a2 === Infinity) { + return 0; + } else if (a1 === 0 || a2 === 0) { + if (obj.contains(this)) { + return 1; + } - function filterContextListener(listener, index, group) { - listener = contextListener(listener, index, group); - return function(event) { - var related = event.relatedTarget; - if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) { - listener.call(this, event); + return 0; + } else { + return a1 / a2; } - }; - } + }, + padByMeters: function padByMeters(meters) { + var dLat = geoMetersToLat(meters); + var dLon = geoMetersToLon(meters, this.center()[1]); + return geoExtent([this[0][0] - dLon, this[0][1] - dLat], [this[1][0] + dLon, this[1][1] + dLat]); + }, + toParam: function toParam() { + return this.rectangle().join(','); + } + }); - function contextListener(listener, index, group) { - return function(event1) { - var event0 = event; // Events can be reentrant (e.g., focus). - event = event1; - try { - listener.call(this, this.__data__, index, group); - } finally { - event = event0; - } - }; - } + var $$w = _export; + var $every = arrayIteration.every; + var arrayMethodIsStrict$2 = arrayMethodIsStrict$9; - function parseTypenames$1(typenames) { - return typenames.trim().split(/^|\s+/).map(function(t) { - var name = "", i = t.indexOf("."); - if (i >= 0) { name = t.slice(i + 1), t = t.slice(0, i); } - return {type: t, name: name}; - }); - } + var STRICT_METHOD$2 = arrayMethodIsStrict$2('every'); - function onRemove(typename) { - return function() { - var on = this.__on; - if (!on) { return; } - for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { - if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { - this.removeEventListener(o.type, o.listener, o.capture); - } else { - on[++i] = o; - } - } - if (++i) { on.length = i; } - else { delete this.__on; } - }; - } + // `Array.prototype.every` method + // https://tc39.es/ecma262/#sec-array.prototype.every + $$w({ target: 'Array', proto: true, forced: !STRICT_METHOD$2 }, { + every: function every(callbackfn /* , thisArg */) { + return $every(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } + }); - function onAdd(typename, value, capture) { - var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener; - return function(d, i, group) { - var on = this.__on, o, listener = wrap(value, i, group); - if (on) { for (var j = 0, m = on.length; j < m; ++j) { - if ((o = on[j]).type === typename.type && o.name === typename.name) { - this.removeEventListener(o.type, o.listener, o.capture); - this.addEventListener(o.type, o.listener = listener, o.capture = capture); - o.value = value; - return; - } - } } - this.addEventListener(typename.type, listener, capture); - o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture}; - if (!on) { this.__on = [o]; } - else { on.push(o); } - }; - } + var $$v = _export; + var $reduce = arrayReduce.left; + var arrayMethodIsStrict$1 = arrayMethodIsStrict$9; + var CHROME_VERSION$1 = engineV8Version; + var IS_NODE$1 = engineIsNode; - function selection_on(typename, value, capture) { - var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t; + var STRICT_METHOD$1 = arrayMethodIsStrict$1('reduce'); + // Chrome 80-82 has a critical bug + // https://bugs.chromium.org/p/chromium/issues/detail?id=1049982 + var CHROME_BUG$1 = !IS_NODE$1 && CHROME_VERSION$1 > 79 && CHROME_VERSION$1 < 83; - if (arguments.length < 2) { - var on = this.node().__on; - if (on) { for (var j = 0, m = on.length, o; j < m; ++j) { - for (i = 0, o = on[j]; i < n; ++i) { - if ((t = typenames[i]).type === o.type && t.name === o.name) { - return o.value; - } - } - } } - return; + // `Array.prototype.reduce` method + // https://tc39.es/ecma262/#sec-array.prototype.reduce + $$v({ target: 'Array', proto: true, forced: !STRICT_METHOD$1 || CHROME_BUG$1 }, { + reduce: function reduce(callbackfn /* , initialValue */) { + var length = arguments.length; + return $reduce(this, callbackfn, length, length > 1 ? arguments[1] : undefined); } + }); - on = value ? onAdd : onRemove; - if (capture == null) { capture = false; } - for (i = 0; i < n; ++i) { this.each(on(typenames[i], value, capture)); } - return this; - } + function d3_polygonArea (polygon) { + var i = -1, + n = polygon.length, + a, + b = polygon[n - 1], + area = 0; - function customEvent(event1, listener, that, args) { - var event0 = event; - event1.sourceEvent = event; - event = event1; - try { - return listener.apply(that, args); - } finally { - event = event0; + while (++i < n) { + a = b; + b = polygon[i]; + area += a[1] * b[0] - a[0] * b[1]; } + + return area / 2; } - function dispatchEvent(node, type, params) { - var window = defaultView(node), - event = window.CustomEvent; + function d3_polygonCentroid (polygon) { + var i = -1, + n = polygon.length, + x = 0, + y = 0, + a, + b = polygon[n - 1], + c, + k = 0; - if (typeof event === "function") { - event = new event(type, params); - } else { - event = window.document.createEvent("Event"); - if (params) { event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail; } - else { event.initEvent(type, false, false); } + while (++i < n) { + a = b; + b = polygon[i]; + k += c = a[0] * b[1] - b[0] * a[1]; + x += (a[0] + b[0]) * c; + y += (a[1] + b[1]) * c; } - node.dispatchEvent(event); + return k *= 3, [x / k, y / k]; } - function dispatchConstant(type, params) { - return function() { - return dispatchEvent(this, type, params); - }; + // Returns the 2D cross product of AB and AC vectors, i.e., the z-component of + // the 3D cross product in a quadrant I Cartesian coordinate system (+x is + // right, +y is up). Returns a positive value if ABC is counter-clockwise, + // negative if clockwise, and zero if the points are collinear. + function cross (a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); } - function dispatchFunction(type, params) { - return function() { - return dispatchEvent(this, type, params.apply(this, arguments)); - }; - } + function lexicographicOrder(a, b) { + return a[0] - b[0] || a[1] - b[1]; + } // Computes the upper convex hull per the monotone chain algorithm. + // Assumes points.length >= 3, is sorted by x, unique in y. + // Returns an array of indices into points in left-to-right order. - function selection_dispatch(type, params) { - return this.each((typeof params === "function" - ? dispatchFunction - : dispatchConstant)(type, params)); - } - var root$1 = [null]; + function computeUpperHullIndexes(points) { + var n = points.length, + indexes = [0, 1]; + var size = 2, + i; - function Selection(groups, parents) { - this._groups = groups; - this._parents = parents; - } + for (i = 2; i < n; ++i) { + while (size > 1 && cross(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) { + --size; + } - function selection() { - return new Selection([[document.documentElement]], root$1); + indexes[size++] = i; + } + + return indexes.slice(0, size); // remove popped points } - Selection.prototype = selection.prototype = { - constructor: Selection, - select: selection_select, - selectAll: selection_selectAll, - filter: selection_filter, - data: selection_data, - enter: selection_enter, - exit: selection_exit, - join: selection_join, - merge: selection_merge, - order: selection_order, - sort: selection_sort, - call: selection_call, - nodes: selection_nodes, - node: selection_node, - size: selection_size, - empty: selection_empty, - each: selection_each, - attr: selection_attr, - style: selection_style, - property: selection_property, - classed: selection_classed, - text: selection_text, - html: selection_html, - raise: selection_raise, - lower: selection_lower, - append: selection_append, - insert: selection_insert, - remove: selection_remove, - clone: selection_clone, - datum: selection_datum, - on: selection_on, - dispatch: selection_dispatch - }; + function d3_polygonHull (points) { + if ((n = points.length) < 3) return null; + var i, + n, + sortedPoints = new Array(n), + flippedPoints = new Array(n); - function select(selector) { - return typeof selector === "string" - ? new Selection([[document.querySelector(selector)]], [document.documentElement]) - : new Selection([[selector]], root$1); - } + for (i = 0; i < n; ++i) { + sortedPoints[i] = [+points[i][0], +points[i][1], i]; + } - function sourceEvent() { - var current = event, source; - while (source = current.sourceEvent) { current = source; } - return current; - } + sortedPoints.sort(lexicographicOrder); + + for (i = 0; i < n; ++i) { + flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]]; + } - function point(node, event) { - var svg = node.ownerSVGElement || node; + var upperIndexes = computeUpperHullIndexes(sortedPoints), + lowerIndexes = computeUpperHullIndexes(flippedPoints); // Construct the hull polygon, removing possible duplicate endpoints. + + var skipLeft = lowerIndexes[0] === upperIndexes[0], + skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1], + hull = []; // Add upper hull in right-to-l order. + // Then add lower hull in left-to-right order. - if (svg.createSVGPoint) { - var point = svg.createSVGPoint(); - point.x = event.clientX, point.y = event.clientY; - point = point.matrixTransform(node.getScreenCTM().inverse()); - return [point.x, point.y]; + for (i = upperIndexes.length - 1; i >= 0; --i) { + hull.push(points[sortedPoints[upperIndexes[i]][2]]); } - var rect = node.getBoundingClientRect(); - return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; - } + for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) { + hull.push(points[sortedPoints[lowerIndexes[i]][2]]); + } - function mouse(node) { - var event = sourceEvent(); - if (event.changedTouches) { event = event.changedTouches[0]; } - return point(node, event); + return hull; } - function selectAll(selector) { - return typeof selector === "string" - ? new Selection([document.querySelectorAll(selector)], [document.documentElement]) - : new Selection([selector == null ? [] : selector], root$1); - } + // vector equals + function geoVecEqual(a, b, epsilon) { + if (epsilon) { + return Math.abs(a[0] - b[0]) <= epsilon && Math.abs(a[1] - b[1]) <= epsilon; + } else { + return a[0] === b[0] && a[1] === b[1]; + } + } // vector addition + + function geoVecAdd(a, b) { + return [a[0] + b[0], a[1] + b[1]]; + } // vector subtraction + + function geoVecSubtract(a, b) { + return [a[0] - b[0], a[1] - b[1]]; + } // vector scaling + + function geoVecScale(a, mag) { + return [a[0] * mag, a[1] * mag]; + } // vector rounding (was: geoRoundCoordinates) + + function geoVecFloor(a) { + return [Math.floor(a[0]), Math.floor(a[1])]; + } // linear interpolation + + function geoVecInterp(a, b, t) { + return [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t]; + } // http://jsperf.com/id-dist-optimization + + function geoVecLength(a, b) { + return Math.sqrt(geoVecLengthSquare(a, b)); + } // length of vector raised to the power two + + function geoVecLengthSquare(a, b) { + b = b || [0, 0]; + var x = a[0] - b[0]; + var y = a[1] - b[1]; + return x * x + y * y; + } // get a unit vector + + function geoVecNormalize(a) { + var length = Math.sqrt(a[0] * a[0] + a[1] * a[1]); + + if (length !== 0) { + return geoVecScale(a, 1 / length); + } + + return [0, 0]; + } // Return the counterclockwise angle in the range (-pi, pi) + // between the positive X axis and the line intersecting a and b. + + function geoVecAngle(a, b) { + return Math.atan2(b[1] - a[1], b[0] - a[0]); + } // dot product + + function geoVecDot(a, b, origin) { + origin = origin || [0, 0]; + var p = geoVecSubtract(a, origin); + var q = geoVecSubtract(b, origin); + return p[0] * q[0] + p[1] * q[1]; + } // normalized dot product + + function geoVecNormalizedDot(a, b, origin) { + origin = origin || [0, 0]; + var p = geoVecNormalize(geoVecSubtract(a, origin)); + var q = geoVecNormalize(geoVecSubtract(b, origin)); + return geoVecDot(p, q); + } // 2D cross product of OA and OB vectors, returns magnitude of Z vector + // Returns a positive value, if OAB makes a counter-clockwise turn, + // negative for clockwise turn, and zero if the points are collinear. + + function geoVecCross(a, b, origin) { + origin = origin || [0, 0]; + var p = geoVecSubtract(a, origin); + var q = geoVecSubtract(b, origin); + return p[0] * q[1] - p[1] * q[0]; + } // find closest orthogonal projection of point onto points array + + function geoVecProject(a, points) { + var min = Infinity; + var idx; + var target; + + for (var i = 0; i < points.length - 1; i++) { + var o = points[i]; + var s = geoVecSubtract(points[i + 1], o); + var v = geoVecSubtract(a, o); + var proj = geoVecDot(v, s) / geoVecDot(s, s); + var p; + + if (proj < 0) { + p = o; + } else if (proj > 1) { + p = points[i + 1]; + } else { + p = [o[0] + proj * s[0], o[1] + proj * s[1]]; + } - function touch(node, touches, identifier) { - if (arguments.length < 3) { identifier = touches, touches = sourceEvent().changedTouches; } + var dist = geoVecLength(p, a); - for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) { - if ((touch = touches[i]).identifier === identifier) { - return point(node, touch); + if (dist < min) { + min = dist; + idx = i + 1; + target = p; } } - return null; + if (idx !== undefined) { + return { + index: idx, + distance: min, + target: target + }; + } else { + return null; + } } - function nopropagation() { - event.stopImmediatePropagation(); - } + // between the positive X axis and the line intersecting a and b. - function noevent() { - event.preventDefault(); - event.stopImmediatePropagation(); + function geoAngle(a, b, projection) { + return geoVecAngle(projection(a.loc), projection(b.loc)); } + function geoEdgeEqual(a, b) { + return a[0] === b[0] && a[1] === b[1] || a[0] === b[1] && a[1] === b[0]; + } // Rotate all points counterclockwise around a pivot point by given angle - function dragDisable(view) { - var root = view.document.documentElement, - selection = select(view).on("dragstart.drag", noevent, true); - if ("onselectstart" in root) { - selection.on("selectstart.drag", noevent, true); + function geoRotate(points, angle, around) { + return points.map(function (point) { + var radial = geoVecSubtract(point, around); + return [radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0], radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1]]; + }); + } // Choose the edge with the minimal distance from `point` to its orthogonal + // projection onto that edge, if such a projection exists, or the distance to + // the closest vertex on that edge. Returns an object with the `index` of the + // chosen edge, the chosen `loc` on that edge, and the `distance` to to it. + + function geoChooseEdge(nodes, point, projection, activeID) { + var dist = geoVecLength; + var points = nodes.map(function (n) { + return projection(n.loc); + }); + var ids = nodes.map(function (n) { + return n.id; + }); + var min = Infinity; + var idx; + var loc; + + for (var i = 0; i < points.length - 1; i++) { + if (ids[i] === activeID || ids[i + 1] === activeID) continue; + var o = points[i]; + var s = geoVecSubtract(points[i + 1], o); + var v = geoVecSubtract(point, o); + var proj = geoVecDot(v, s) / geoVecDot(s, s); + var p; + + if (proj < 0) { + p = o; + } else if (proj > 1) { + p = points[i + 1]; + } else { + p = [o[0] + proj * s[0], o[1] + proj * s[1]]; + } + + var d = dist(p, point); + + if (d < min) { + min = d; + idx = i + 1; + loc = projection.invert(p); + } + } + + if (idx !== undefined) { + return { + index: idx, + distance: min, + loc: loc + }; } else { - root.__noselect = root.style.MozUserSelect; - root.style.MozUserSelect = "none"; + return null; + } + } // Test active (dragged or drawing) segments against inactive segments + // This is used to test e.g. multipolygon rings that cross + // `activeNodes` is the ring containing the activeID being dragged. + // `inactiveNodes` is the other ring to test against + + function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) { + var actives = []; + var inactives = []; + var j, k, n1, n2, segment; // gather active segments (only segments in activeNodes that contain the activeID) + + for (j = 0; j < activeNodes.length - 1; j++) { + n1 = activeNodes[j]; + n2 = activeNodes[j + 1]; + segment = [n1.loc, n2.loc]; + + if (n1.id === activeID || n2.id === activeID) { + actives.push(segment); + } + } // gather inactive segments + + + for (j = 0; j < inactiveNodes.length - 1; j++) { + n1 = inactiveNodes[j]; + n2 = inactiveNodes[j + 1]; + segment = [n1.loc, n2.loc]; + inactives.push(segment); + } // test + + + for (j = 0; j < actives.length; j++) { + for (k = 0; k < inactives.length; k++) { + var p = actives[j]; + var q = inactives[k]; + var hit = geoLineIntersection(p, q); + + if (hit) { + return true; + } + } + } + + return false; + } // Test active (dragged or drawing) segments against inactive segments + // This is used to test whether a way intersects with itself. + + function geoHasSelfIntersections(nodes, activeID) { + var actives = []; + var inactives = []; + var j, k; // group active and passive segments along the nodes + + for (j = 0; j < nodes.length - 1; j++) { + var n1 = nodes[j]; + var n2 = nodes[j + 1]; + var segment = [n1.loc, n2.loc]; + + if (n1.id === activeID || n2.id === activeID) { + actives.push(segment); + } else { + inactives.push(segment); + } + } // test + + + for (j = 0; j < actives.length; j++) { + for (k = 0; k < inactives.length; k++) { + var p = actives[j]; + var q = inactives[k]; // skip if segments share an endpoint + + if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) || geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1])) { + continue; + } + + var hit = geoLineIntersection(p, q); + + if (hit) { + var epsilon = 1e-8; // skip if the hit is at the segment's endpoint + + if (geoVecEqual(p[1], hit, epsilon) || geoVecEqual(p[0], hit, epsilon) || geoVecEqual(q[1], hit, epsilon) || geoVecEqual(q[0], hit, epsilon)) { + continue; + } else { + return true; + } + } + } + } + + return false; + } // Return the intersection point of 2 line segments. + // From https://github.com/pgkelley4/line-segments-intersect + // This uses the vector cross product approach described below: + // http://stackoverflow.com/a/565282/786339 + + function geoLineIntersection(a, b) { + var p = [a[0][0], a[0][1]]; + var p2 = [a[1][0], a[1][1]]; + var q = [b[0][0], b[0][1]]; + var q2 = [b[1][0], b[1][1]]; + var r = geoVecSubtract(p2, p); + var s = geoVecSubtract(q2, q); + var uNumerator = geoVecCross(geoVecSubtract(q, p), r); + var denominator = geoVecCross(r, s); + + if (uNumerator && denominator) { + var u = uNumerator / denominator; + var t = geoVecCross(geoVecSubtract(q, p), s) / denominator; + + if (t >= 0 && t <= 1 && u >= 0 && u <= 1) { + return geoVecInterp(p, p2, t); + } } + + return null; } + function geoPathIntersections(path1, path2) { + var intersections = []; - function yesdrag(view, noclick) { - var root = view.document.documentElement, - selection = select(view).on("dragstart.drag", null); - if (noclick) { - selection.on("click.drag", noevent, true); - setTimeout(function() { selection.on("click.drag", null); }, 0); + for (var i = 0; i < path1.length - 1; i++) { + for (var j = 0; j < path2.length - 1; j++) { + var a = [path1[i], path1[i + 1]]; + var b = [path2[j], path2[j + 1]]; + var hit = geoLineIntersection(a, b); + + if (hit) { + intersections.push(hit); + } + } } - if ("onselectstart" in root) { - selection.on("selectstart.drag", null); - } else { - root.style.MozUserSelect = root.__noselect; - delete root.__noselect; + + return intersections; + } + function geoPathHasIntersections(path1, path2) { + for (var i = 0; i < path1.length - 1; i++) { + for (var j = 0; j < path2.length - 1; j++) { + var a = [path1[i], path1[i + 1]]; + var b = [path2[j], path2[j + 1]]; + var hit = geoLineIntersection(a, b); + + if (hit) { + return true; + } + } + } + + return false; + } // Return whether point is contained in polygon. + // + // `point` should be a 2-item array of coordinates. + // `polygon` should be an array of 2-item arrays of coordinates. + // + // From https://github.com/substack/point-in-polygon. + // ray-casting algorithm based on + // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html + // + + function geoPointInPolygon(point, polygon) { + var x = point[0]; + var y = point[1]; + var inside = false; + + for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) { + var xi = polygon[i][0]; + var yi = polygon[i][1]; + var xj = polygon[j][0]; + var yj = polygon[j][1]; + var intersect = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi; + if (intersect) inside = !inside; } + + return inside; } + function geoPolygonContainsPolygon(outer, inner) { + return inner.every(function (point) { + return geoPointInPolygon(point, outer); + }); + } + function geoPolygonIntersectsPolygon(outer, inner, checkSegments) { + function testPoints(outer, inner) { + return inner.some(function (point) { + return geoPointInPolygon(point, outer); + }); + } - function constant$1(x) { - return function() { - return x; + return testPoints(outer, inner) || !!checkSegments && geoPathHasIntersections(outer, inner); + } // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points + // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756 + + function geoGetSmallestSurroundingRectangle(points) { + var hull = d3_polygonHull(points); + var centroid = d3_polygonCentroid(hull); + var minArea = Infinity; + var ssrExtent = []; + var ssrAngle = 0; + var c1 = hull[0]; + + for (var i = 0; i <= hull.length - 1; i++) { + var c2 = i === hull.length - 1 ? hull[0] : hull[i + 1]; + var angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]); + var poly = geoRotate(hull, -angle, centroid); + var extent = poly.reduce(function (extent, point) { + return extent.extend(geoExtent(point)); + }, geoExtent()); + var area = extent.area(); + + if (area < minArea) { + minArea = area; + ssrExtent = extent; + ssrAngle = angle; + } + + c1 = c2; + } + + return { + poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid), + angle: ssrAngle }; } + function geoPathLength(path) { + var length = 0; - function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) { - this.target = target; - this.type = type; - this.subject = subject; - this.identifier = id; - this.active = active; - this.x = x; - this.y = y; - this.dx = dx; - this.dy = dy; - this._ = dispatch; + for (var i = 0; i < path.length - 1; i++) { + length += geoVecLength(path[i], path[i + 1]); + } + + return length; + } // If the given point is at the edge of the padded viewport, + // return a vector that will nudge the viewport in that direction + + function geoViewportEdge(point, dimensions) { + var pad = [80, 20, 50, 20]; // top, right, bottom, left + + var x = 0; + var y = 0; + + if (point[0] > dimensions[0] - pad[1]) { + x = -10; + } + + if (point[0] < pad[3]) { + x = 10; + } + + if (point[1] > dimensions[1] - pad[2]) { + y = -10; + } + + if (point[1] < pad[0]) { + y = 10; + } + + if (x || y) { + return [x, y]; + } else { + return null; + } } - DragEvent.prototype.on = function() { - var value = this._.on.apply(this._, arguments); - return value === this._ ? this : value; + var noop = { + value: function value() {} }; - // Ignore right-click, since that should open the context menu. - function defaultFilter() { - return !event.ctrlKey && !event.button; - } + function dispatch$8() { + for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { + if (!(t = arguments[i] + "") || t in _ || /[\s.]/.test(t)) throw new Error("illegal type: " + t); + _[t] = []; + } - function defaultContainer() { - return this.parentNode; + return new Dispatch(_); } - function defaultSubject(d) { - return d == null ? {x: event.x, y: event.y} : d; + function Dispatch(_) { + this._ = _; } - function defaultTouchable() { - return navigator.maxTouchPoints || ("ontouchstart" in this); + function parseTypenames$1(typenames, types) { + return typenames.trim().split(/^|\s+/).map(function (t) { + var name = "", + i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t); + return { + type: t, + name: name + }; + }); } - function d3_drag() { - var filter = defaultFilter, - container = defaultContainer, - subject = defaultSubject, - touchable = defaultTouchable, - gestures = {}, - listeners = dispatch("start", "drag", "end"), - active = 0, - mousedownx, - mousedowny, - mousemoving, - touchending, - clickDistance2 = 0; + Dispatch.prototype = dispatch$8.prototype = { + constructor: Dispatch, + on: function on(typename, callback) { + var _ = this._, + T = parseTypenames$1(typename + "", _), + t, + i = -1, + n = T.length; // If no callback was specified, return the callback of the given type and name. - function drag(selection) { - selection - .on("mousedown.drag", mousedowned) - .filter(touchable) - .on("touchstart.drag", touchstarted) - .on("touchmove.drag", touchmoved) - .on("touchend.drag touchcancel.drag", touchended) - .style("touch-action", "none") - .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); - } - - function mousedowned() { - if (touchending || !filter.apply(this, arguments)) { return; } - var gesture = beforestart("mouse", container.apply(this, arguments), mouse, this, arguments); - if (!gesture) { return; } - select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true); - dragDisable(event.view); - nopropagation(); - mousemoving = false; - mousedownx = event.clientX; - mousedowny = event.clientY; - gesture("start"); - } + if (arguments.length < 2) { + while (++i < n) { + if ((t = (typename = T[i]).type) && (t = get$2(_[t], typename.name))) return t; + } - function mousemoved() { - noevent(); - if (!mousemoving) { - var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny; - mousemoving = dx * dx + dy * dy > clickDistance2; + return; + } // If a type was specified, set the callback for the given type and name. + // Otherwise, if a null callback was specified, remove callbacks of the given name. + + + if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback); + + while (++i < n) { + if (t = (typename = T[i]).type) _[t] = set$1(_[t], typename.name, callback);else if (callback == null) for (t in _) { + _[t] = set$1(_[t], typename.name, null); + } } - gestures.mouse("drag"); - } - function mouseupped() { - select(event.view).on("mousemove.drag mouseup.drag", null); - yesdrag(event.view, mousemoving); - noevent(); - gestures.mouse("end"); - } + return this; + }, + copy: function copy() { + var copy = {}, + _ = this._; - function touchstarted() { - var arguments$1 = arguments; + for (var t in _) { + copy[t] = _[t].slice(); + } - if (!filter.apply(this, arguments)) { return; } - var touches = event.changedTouches, - c = container.apply(this, arguments), - n = touches.length, i, gesture; + return new Dispatch(copy); + }, + call: function call(type, that) { + if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) { + args[i] = arguments[i + 2]; + } + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); - for (i = 0; i < n; ++i) { - if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments$1)) { - nopropagation(); - gesture("start"); - } + for (t = this._[type], i = 0, n = t.length; i < n; ++i) { + t[i].value.apply(that, args); + } + }, + apply: function apply(type, that, args) { + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + + for (var t = this._[type], i = 0, n = t.length; i < n; ++i) { + t[i].value.apply(that, args); } } + }; - function touchmoved() { - var touches = event.changedTouches, - n = touches.length, i, gesture; + function get$2(type, name) { + for (var i = 0, n = type.length, c; i < n; ++i) { + if ((c = type[i]).name === name) { + return c.value; + } + } + } - for (i = 0; i < n; ++i) { - if (gesture = gestures[touches[i].identifier]) { - noevent(); - gesture("drag"); - } + function set$1(type, name, callback) { + for (var i = 0, n = type.length; i < n; ++i) { + if (type[i].name === name) { + type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1)); + break; } } - function touchended() { - var touches = event.changedTouches, - n = touches.length, i, gesture; + if (callback != null) type.push({ + name: name, + value: callback + }); + return type; + } - if (touchending) { clearTimeout(touchending); } - touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! - for (i = 0; i < n; ++i) { - if (gesture = gestures[touches[i].identifier]) { - nopropagation(); - gesture("end"); + var xhtml = "http://www.w3.org/1999/xhtml"; + var namespaces = { + svg: "http://www.w3.org/2000/svg", + xhtml: xhtml, + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" + }; + + function namespace (name) { + var prefix = name += "", + i = prefix.indexOf(":"); + if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); + return namespaces.hasOwnProperty(prefix) ? { + space: namespaces[prefix], + local: name + } : name; // eslint-disable-line no-prototype-builtins + } + + function creatorInherit(name) { + return function () { + var document = this.ownerDocument, + uri = this.namespaceURI; + return uri === xhtml && document.documentElement.namespaceURI === xhtml ? document.createElement(name) : document.createElementNS(uri, name); + }; + } + + function creatorFixed(fullname) { + return function () { + return this.ownerDocument.createElementNS(fullname.space, fullname.local); + }; + } + + function creator (name) { + var fullname = namespace(name); + return (fullname.local ? creatorFixed : creatorInherit)(fullname); + } + + function none() {} + + function selector (selector) { + return selector == null ? none : function () { + return this.querySelector(selector); + }; + } + + function selection_select (select) { + if (typeof select !== "function") select = selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; } } } - function beforestart(id, container, point, that, args) { - var p = point(container, id), s, dx, dy, - sublisteners = listeners.copy(); + return new Selection$1(subgroups, this._parents); + } - if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() { - if ((event.subject = s = subject.apply(that, args)) == null) { return false; } - dx = s.x - p[0] || 0; - dy = s.y - p[1] || 0; - return true; - })) { return; } + function array (x) { + return _typeof(x) === "object" && "length" in x ? x // Array, TypedArray, NodeList, array-like + : Array.from(x); // Map, Set, iterable, string, or anything else + } - return function gesture(type) { - var p0 = p, n; - switch (type) { - case "start": gestures[id] = gesture, n = active++; break; - case "end": delete gestures[id], --active; // nobreak - case "drag": p = point(container, id), n = active; break; - } - customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]); - }; - } + function empty() { + return []; + } - drag.filter = function(_) { - return arguments.length ? (filter = typeof _ === "function" ? _ : constant$1(!!_), drag) : filter; + function selectorAll (selector) { + return selector == null ? empty : function () { + return this.querySelectorAll(selector); }; + } - drag.container = function(_) { - return arguments.length ? (container = typeof _ === "function" ? _ : constant$1(_), drag) : container; + function arrayAll(select) { + return function () { + var group = select.apply(this, arguments); + return group == null ? [] : array(group); }; + } - drag.subject = function(_) { - return arguments.length ? (subject = typeof _ === "function" ? _ : constant$1(_), drag) : subject; - }; + function selection_selectAll (select) { + if (typeof select === "function") select = arrayAll(select);else select = selectorAll(select); - drag.touchable = function(_) { - return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$1(!!_), drag) : touchable; - }; + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + subgroups.push(select.call(node, node.__data__, i, group)); + parents.push(node); + } + } + } - drag.on = function() { - var value = listeners.on.apply(listeners, arguments); - return value === listeners ? drag : value; + return new Selection$1(subgroups, parents); + } + + var $$u = _export; + var $find = arrayIteration.find; + var addToUnscopables$3 = addToUnscopables$6; + + var FIND = 'find'; + var SKIPS_HOLES$1 = true; + + // Shouldn't skip holes + if (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES$1 = false; }); + + // `Array.prototype.find` method + // https://tc39.es/ecma262/#sec-array.prototype.find + $$u({ target: 'Array', proto: true, forced: SKIPS_HOLES$1 }, { + find: function find(callbackfn /* , that = undefined */) { + return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } + }); + + // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables + addToUnscopables$3(FIND); + + function matcher (selector) { + return function () { + return this.matches(selector); + }; + } + function childMatcher(selector) { + return function (node) { + return node.matches(selector); }; + } - drag.clickDistance = function(_) { - return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2); + var find = Array.prototype.find; + + function childFind(match) { + return function () { + return find.call(this.children, match); }; + } - return drag; + function childFirst() { + return this.firstElementChild; } - function define$1(constructor, factory, prototype) { - constructor.prototype = factory.prototype = prototype; - prototype.constructor = constructor; + function selection_selectChild (match) { + return this.select(match == null ? childFirst : childFind(typeof match === "function" ? match : childMatcher(match))); } - function extend(parent, definition) { - var prototype = Object.create(parent.prototype); - for (var key in definition) { prototype[key] = definition[key]; } - return prototype; + var filter = Array.prototype.filter; + + function children() { + return this.children; } - function Color() {} + function childrenFilter(match) { + return function () { + return filter.call(this.children, match); + }; + } - var darker = 0.7; - var brighter = 1 / darker; + function selection_selectChildren (match) { + return this.selectAll(match == null ? children : childrenFilter(typeof match === "function" ? match : childMatcher(match))); + } - var reI = "\\s*([+-]?\\d+)\\s*", - reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", - reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", - reHex = /^#([0-9a-f]{3,8})$/, - reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"), - reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"), - reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"), - reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"), - reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"), - reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$"); + function selection_filter (match) { + if (typeof match !== "function") match = matcher(match); - var named = { - aliceblue: 0xf0f8ff, - antiquewhite: 0xfaebd7, - aqua: 0x00ffff, - aquamarine: 0x7fffd4, - azure: 0xf0ffff, - beige: 0xf5f5dc, - bisque: 0xffe4c4, - black: 0x000000, - blanchedalmond: 0xffebcd, - blue: 0x0000ff, - blueviolet: 0x8a2be2, - brown: 0xa52a2a, - burlywood: 0xdeb887, - cadetblue: 0x5f9ea0, - chartreuse: 0x7fff00, - chocolate: 0xd2691e, - coral: 0xff7f50, - cornflowerblue: 0x6495ed, - cornsilk: 0xfff8dc, - crimson: 0xdc143c, - cyan: 0x00ffff, - darkblue: 0x00008b, - darkcyan: 0x008b8b, - darkgoldenrod: 0xb8860b, - darkgray: 0xa9a9a9, - darkgreen: 0x006400, - darkgrey: 0xa9a9a9, - darkkhaki: 0xbdb76b, - darkmagenta: 0x8b008b, - darkolivegreen: 0x556b2f, - darkorange: 0xff8c00, - darkorchid: 0x9932cc, - darkred: 0x8b0000, - darksalmon: 0xe9967a, - darkseagreen: 0x8fbc8f, - darkslateblue: 0x483d8b, - darkslategray: 0x2f4f4f, - darkslategrey: 0x2f4f4f, - darkturquoise: 0x00ced1, - darkviolet: 0x9400d3, - deeppink: 0xff1493, - deepskyblue: 0x00bfff, - dimgray: 0x696969, - dimgrey: 0x696969, - dodgerblue: 0x1e90ff, - firebrick: 0xb22222, - floralwhite: 0xfffaf0, - forestgreen: 0x228b22, - fuchsia: 0xff00ff, - gainsboro: 0xdcdcdc, - ghostwhite: 0xf8f8ff, - gold: 0xffd700, - goldenrod: 0xdaa520, - gray: 0x808080, - green: 0x008000, - greenyellow: 0xadff2f, - grey: 0x808080, - honeydew: 0xf0fff0, - hotpink: 0xff69b4, - indianred: 0xcd5c5c, - indigo: 0x4b0082, - ivory: 0xfffff0, - khaki: 0xf0e68c, - lavender: 0xe6e6fa, - lavenderblush: 0xfff0f5, - lawngreen: 0x7cfc00, - lemonchiffon: 0xfffacd, - lightblue: 0xadd8e6, - lightcoral: 0xf08080, - lightcyan: 0xe0ffff, - lightgoldenrodyellow: 0xfafad2, - lightgray: 0xd3d3d3, - lightgreen: 0x90ee90, - lightgrey: 0xd3d3d3, - lightpink: 0xffb6c1, - lightsalmon: 0xffa07a, - lightseagreen: 0x20b2aa, - lightskyblue: 0x87cefa, - lightslategray: 0x778899, - lightslategrey: 0x778899, - lightsteelblue: 0xb0c4de, - lightyellow: 0xffffe0, - lime: 0x00ff00, - limegreen: 0x32cd32, - linen: 0xfaf0e6, - magenta: 0xff00ff, - maroon: 0x800000, - mediumaquamarine: 0x66cdaa, - mediumblue: 0x0000cd, - mediumorchid: 0xba55d3, - mediumpurple: 0x9370db, - mediumseagreen: 0x3cb371, - mediumslateblue: 0x7b68ee, - mediumspringgreen: 0x00fa9a, - mediumturquoise: 0x48d1cc, - mediumvioletred: 0xc71585, - midnightblue: 0x191970, - mintcream: 0xf5fffa, - mistyrose: 0xffe4e1, - moccasin: 0xffe4b5, - navajowhite: 0xffdead, - navy: 0x000080, - oldlace: 0xfdf5e6, - olive: 0x808000, - olivedrab: 0x6b8e23, - orange: 0xffa500, - orangered: 0xff4500, - orchid: 0xda70d6, - palegoldenrod: 0xeee8aa, - palegreen: 0x98fb98, - paleturquoise: 0xafeeee, - palevioletred: 0xdb7093, - papayawhip: 0xffefd5, - peachpuff: 0xffdab9, - peru: 0xcd853f, - pink: 0xffc0cb, - plum: 0xdda0dd, - powderblue: 0xb0e0e6, - purple: 0x800080, - rebeccapurple: 0x663399, - red: 0xff0000, - rosybrown: 0xbc8f8f, - royalblue: 0x4169e1, - saddlebrown: 0x8b4513, - salmon: 0xfa8072, - sandybrown: 0xf4a460, - seagreen: 0x2e8b57, - seashell: 0xfff5ee, - sienna: 0xa0522d, - silver: 0xc0c0c0, - skyblue: 0x87ceeb, - slateblue: 0x6a5acd, - slategray: 0x708090, - slategrey: 0x708090, - snow: 0xfffafa, - springgreen: 0x00ff7f, - steelblue: 0x4682b4, - tan: 0xd2b48c, - teal: 0x008080, - thistle: 0xd8bfd8, - tomato: 0xff6347, - turquoise: 0x40e0d0, - violet: 0xee82ee, - wheat: 0xf5deb3, - white: 0xffffff, - whitesmoke: 0xf5f5f5, - yellow: 0xffff00, - yellowgreen: 0x9acd32 - }; - - define$1(Color, color, { - copy: function(channels) { - return Object.assign(new this.constructor, this, channels); - }, - displayable: function() { - return this.rgb().displayable(); - }, - hex: color_formatHex, // Deprecated! Use color.formatHex. - formatHex: color_formatHex, - formatHsl: color_formatHsl, - formatRgb: color_formatRgb, - toString: color_formatRgb - }); + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } - function color_formatHex() { - return this.rgb().formatHex(); + return new Selection$1(subgroups, this._parents); } - function color_formatHsl() { - return hslConvert(this).formatHsl(); + function sparse (update) { + return new Array(update.length); } - function color_formatRgb() { - return this.rgb().formatRgb(); + function selection_enter () { + return new Selection$1(this._enter || this._groups.map(sparse), this._parents); } - - function color(format) { - var m, l; - format = (format + "").trim().toLowerCase(); - return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000 - : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00 - : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000 - : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000 - : null) // invalid hex - : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) - : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) - : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) - : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1) - : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%) - : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1) - : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins - : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) - : null; + function EnterNode(parent, datum) { + this.ownerDocument = parent.ownerDocument; + this.namespaceURI = parent.namespaceURI; + this._next = null; + this._parent = parent; + this.__data__ = datum; } + EnterNode.prototype = { + constructor: EnterNode, + appendChild: function appendChild(child) { + return this._parent.insertBefore(child, this._next); + }, + insertBefore: function insertBefore(child, next) { + return this._parent.insertBefore(child, next); + }, + querySelector: function querySelector(selector) { + return this._parent.querySelector(selector); + }, + querySelectorAll: function querySelectorAll(selector) { + return this._parent.querySelectorAll(selector); + } + }; - function rgbn(n) { - return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1); + function constant$3 (x) { + return function () { + return x; + }; } - function rgba(r, g, b, a) { - if (a <= 0) { r = g = b = NaN; } - return new Rgb(r, g, b, a); - } + function bindIndex(parent, group, enter, update, exit, data) { + var i = 0, + node, + groupLength = group.length, + dataLength = data.length; // Put any non-null nodes that fit into update. + // Put any null nodes into enter. + // Put any remaining data into enter. - function rgbConvert(o) { - if (!(o instanceof Color)) { o = color(o); } - if (!o) { return new Rgb; } - o = o.rgb(); - return new Rgb(o.r, o.g, o.b, o.opacity); + for (; i < dataLength; ++i) { + if (node = group[i]) { + node.__data__ = data[i]; + update[i] = node; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } // Put any non-null nodes that don’t fit into exit. + + + for (; i < groupLength; ++i) { + if (node = group[i]) { + exit[i] = node; + } + } } - function rgb(r, g, b, opacity) { - return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); + function bindKey(parent, group, enter, update, exit, data, key) { + var i, + node, + nodeByKeyValue = new Map(), + groupLength = group.length, + dataLength = data.length, + keyValues = new Array(groupLength), + keyValue; // Compute the key for each node. + // If multiple nodes have the same key, the duplicates are added to exit. + + for (i = 0; i < groupLength; ++i) { + if (node = group[i]) { + keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + ""; + + if (nodeByKeyValue.has(keyValue)) { + exit[i] = node; + } else { + nodeByKeyValue.set(keyValue, node); + } + } + } // Compute the key for each datum. + // If there a node associated with this key, join and add it to update. + // If there is not (or the key is a duplicate), add it to enter. + + + for (i = 0; i < dataLength; ++i) { + keyValue = key.call(parent, data[i], i, data) + ""; + + if (node = nodeByKeyValue.get(keyValue)) { + update[i] = node; + node.__data__ = data[i]; + nodeByKeyValue["delete"](keyValue); + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } // Add any remaining nodes that were not bound to data to exit. + + + for (i = 0; i < groupLength; ++i) { + if ((node = group[i]) && nodeByKeyValue.get(keyValues[i]) === node) { + exit[i] = node; + } + } } - function Rgb(r, g, b, opacity) { - this.r = +r; - this.g = +g; - this.b = +b; - this.opacity = +opacity; + function datum(node) { + return node.__data__; } - define$1(Rgb, rgb, extend(Color, { - brighter: function(k) { - k = k == null ? brighter : Math.pow(brighter, k); - return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); - }, - darker: function(k) { - k = k == null ? darker : Math.pow(darker, k); - return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); - }, - rgb: function() { - return this; - }, - displayable: function() { - return (-0.5 <= this.r && this.r < 255.5) - && (-0.5 <= this.g && this.g < 255.5) - && (-0.5 <= this.b && this.b < 255.5) - && (0 <= this.opacity && this.opacity <= 1); - }, - hex: rgb_formatHex, // Deprecated! Use color.formatHex. - formatHex: rgb_formatHex, - formatRgb: rgb_formatRgb, - toString: rgb_formatRgb - })); + function selection_data (value, key) { + if (!arguments.length) return Array.from(this, datum); + var bind = key ? bindKey : bindIndex, + parents = this._parents, + groups = this._groups; + if (typeof value !== "function") value = constant$3(value); - function rgb_formatHex() { - return "#" + hex$1(this.r) + hex$1(this.g) + hex$1(this.b); - } + for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) { + var parent = parents[j], + group = groups[j], + groupLength = group.length, + data = array(value.call(parent, parent && parent.__data__, j, parents)), + dataLength = data.length, + enterGroup = enter[j] = new Array(dataLength), + updateGroup = update[j] = new Array(dataLength), + exitGroup = exit[j] = new Array(groupLength); + bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); // Now connect the enter nodes to their following update node, such that + // appendChild can insert the materialized enter node before this node, + // rather than at the end of the parent node. - function rgb_formatRgb() { - var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); - return (a === 1 ? "rgb(" : "rgba(") - + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " - + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " - + Math.max(0, Math.min(255, Math.round(this.b) || 0)) - + (a === 1 ? ")" : ", " + a + ")"); + for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { + if (previous = enterGroup[i0]) { + if (i0 >= i1) i1 = i0 + 1; + + while (!(next = updateGroup[i1]) && ++i1 < dataLength) { + } + + previous._next = next || null; + } + } + } + + update = new Selection$1(update, parents); + update._enter = enter; + update._exit = exit; + return update; } - function hex$1(value) { - value = Math.max(0, Math.min(255, Math.round(value) || 0)); - return (value < 16 ? "0" : "") + value.toString(16); + function selection_exit () { + return new Selection$1(this._exit || this._groups.map(sparse), this._parents); } - function hsla(h, s, l, a) { - if (a <= 0) { h = s = l = NaN; } - else if (l <= 0 || l >= 1) { h = s = NaN; } - else if (s <= 0) { h = NaN; } - return new Hsl(h, s, l, a); + function selection_join (onenter, onupdate, onexit) { + var enter = this.enter(), + update = this, + exit = this.exit(); + enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + ""); + if (onupdate != null) update = onupdate(update); + if (onexit == null) exit.remove();else onexit(exit); + return enter && update ? enter.merge(update).order() : update; } - function hslConvert(o) { - if (o instanceof Hsl) { return new Hsl(o.h, o.s, o.l, o.opacity); } - if (!(o instanceof Color)) { o = color(o); } - if (!o) { return new Hsl; } - if (o instanceof Hsl) { return o; } - o = o.rgb(); - var r = o.r / 255, - g = o.g / 255, - b = o.b / 255, - min = Math.min(r, g, b), - max = Math.max(r, g, b), - h = NaN, - s = max - min, - l = (max + min) / 2; - if (s) { - if (r === max) { h = (g - b) / s + (g < b) * 6; } - else if (g === max) { h = (b - r) / s + 2; } - else { h = (r - g) / s + 4; } - s /= l < 0.5 ? max + min : 2 - max - min; - h *= 60; - } else { - s = l > 0 && l < 1 ? 0 : h; + function selection_merge (selection) { + if (!(selection instanceof Selection$1)) throw new Error("invalid merge"); + + for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } } - return new Hsl(h, s, l, o.opacity); - } - function hsl(h, s, l, opacity) { - return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); - } + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } - function Hsl(h, s, l, opacity) { - this.h = +h; - this.s = +s; - this.l = +l; - this.opacity = +opacity; + return new Selection$1(merges, this._parents); } - define$1(Hsl, hsl, extend(Color, { - brighter: function(k) { - k = k == null ? brighter : Math.pow(brighter, k); - return new Hsl(this.h, this.s, this.l * k, this.opacity); - }, - darker: function(k) { - k = k == null ? darker : Math.pow(darker, k); - return new Hsl(this.h, this.s, this.l * k, this.opacity); - }, - rgb: function() { - var h = this.h % 360 + (this.h < 0) * 360, - s = isNaN(h) || isNaN(this.s) ? 0 : this.s, - l = this.l, - m2 = l + (l < 0.5 ? l : 1 - l) * s, - m1 = 2 * l - m2; - return new Rgb( - hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), - hsl2rgb(h, m1, m2), - hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), - this.opacity - ); - }, - displayable: function() { - return (0 <= this.s && this.s <= 1 || isNaN(this.s)) - && (0 <= this.l && this.l <= 1) - && (0 <= this.opacity && this.opacity <= 1); - }, - formatHsl: function() { - var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); - return (a === 1 ? "hsl(" : "hsla(") - + (this.h || 0) + ", " - + (this.s || 0) * 100 + "%, " - + (this.l || 0) * 100 + "%" - + (a === 1 ? ")" : ", " + a + ")"); + function selection_order () { + for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) { + for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) { + if (node = group[i]) { + if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next); + next = node; + } + } } - })); - /* From FvD 13.37, CSS Color Module Level 3 */ - function hsl2rgb(h, m1, m2) { - return (h < 60 ? m1 + (m2 - m1) * h / 60 - : h < 180 ? m2 - : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 - : m1) * 255; + return this; } - function constant$2(x) { - return function() { - return x; - }; + function selection_sort (compare) { + if (!compare) compare = ascending; + + function compareNode(a, b) { + return a && b ? compare(a.__data__, b.__data__) : !a - !b; + } + + for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group[i]) { + sortgroup[i] = node; + } + } + + sortgroup.sort(compareNode); + } + + return new Selection$1(sortgroups, this._parents).order(); } - function linear(a, d) { - return function(t) { - return a + t * d; - }; + function ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; } - function exponential(a, b, y) { - return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) { - return Math.pow(a + t * b, y); - }; + function selection_call () { + var callback = arguments[0]; + arguments[0] = this; + callback.apply(null, arguments); + return this; } - function gamma(y) { - return (y = +y) === 1 ? nogamma : function(a, b) { - return b - a ? exponential(a, b, y) : constant$2(isNaN(a) ? b : a); - }; + function selection_nodes () { + return Array.from(this); } - function nogamma(a, b) { - var d = b - a; - return d ? linear(a, d) : constant$2(isNaN(a) ? b : a); + function selection_node () { + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { + var node = group[i]; + if (node) return node; + } + } + + return null; } - var d3_interpolateRgb = (function rgbGamma(y) { - var color = gamma(y); + function selection_size () { + var size = 0; - function rgb$1(start, end) { - var r = color((start = rgb(start)).r, (end = rgb(end)).r), - g = color(start.g, end.g), - b = color(start.b, end.b), - opacity = nogamma(start.opacity, end.opacity); - return function(t) { - start.r = r(t); - start.g = g(t); - start.b = b(t); - start.opacity = opacity(t); - return start + ""; - }; - } + var _iterator = _createForOfIteratorHelper(this), + _step; - rgb$1.gamma = rgbGamma; + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var node = _step.value; + ++size; + } // eslint-disable-line no-unused-vars - return rgb$1; - })(1); + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } - function numberArray(a, b) { - if (!b) { b = []; } - var n = a ? Math.min(b.length, a.length) : 0, - c = b.slice(), - i; - return function(t) { - for (i = 0; i < n; ++i) { c[i] = a[i] * (1 - t) + b[i] * t; } - return c; - }; + return size; } - function isNumberArray(x) { - return ArrayBuffer.isView(x) && !(x instanceof DataView); + function selection_empty () { + return !this.node(); } - function genericArray(a, b) { - var nb = b ? b.length : 0, - na = a ? Math.min(nb, a.length) : 0, - x = new Array(na), - c = new Array(nb), - i; + function selection_each (callback) { + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) callback.call(node, node.__data__, i, group); + } + } - for (i = 0; i < na; ++i) { x[i] = interpolate(a[i], b[i]); } - for (; i < nb; ++i) { c[i] = b[i]; } + return this; + } - return function(t) { - for (i = 0; i < na; ++i) { c[i] = x[i](t); } - return c; + function attrRemove$1(name) { + return function () { + this.removeAttribute(name); }; } - function date(a, b) { - var d = new Date; - return a = +a, b = +b, function(t) { - return d.setTime(a * (1 - t) + b * t), d; + function attrRemoveNS$1(fullname) { + return function () { + this.removeAttributeNS(fullname.space, fullname.local); }; } - function d3_interpolateNumber(a, b) { - return a = +a, b = +b, function(t) { - return a * (1 - t) + b * t; + function attrConstant$1(name, value) { + return function () { + this.setAttribute(name, value); }; } - function object(a, b) { - var i = {}, - c = {}, - k; - - if (a === null || typeof a !== "object") { a = {}; } - if (b === null || typeof b !== "object") { b = {}; } - - for (k in b) { - if (k in a) { - i[k] = interpolate(a[k], b[k]); - } else { - c[k] = b[k]; - } - } - - return function(t) { - for (k in i) { c[k] = i[k](t); } - return c; + function attrConstantNS$1(fullname, value) { + return function () { + this.setAttributeNS(fullname.space, fullname.local, value); }; } - var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, - reB = new RegExp(reA.source, "g"); - - function zero(b) { - return function() { - return b; + function attrFunction$1(name, value) { + return function () { + var v = value.apply(this, arguments); + if (v == null) this.removeAttribute(name);else this.setAttribute(name, v); }; } - function one(b) { - return function(t) { - return b(t) + ""; + function attrFunctionNS$1(fullname, value) { + return function () { + var v = value.apply(this, arguments); + if (v == null) this.removeAttributeNS(fullname.space, fullname.local);else this.setAttributeNS(fullname.space, fullname.local, v); }; } - function interpolateString(a, b) { - var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b - am, // current match in a - bm, // current match in b - bs, // string preceding current number in b, if any - i = -1, // index in s - s = [], // string constants and placeholders - q = []; // number interpolators - - // Coerce inputs to strings. - a = a + "", b = b + ""; - - // Interpolate pairs of numbers in a & b. - while ((am = reA.exec(a)) - && (bm = reB.exec(b))) { - if ((bs = bm.index) > bi) { // a string precedes the next number in b - bs = b.slice(bi, bs); - if (s[i]) { s[i] += bs; } // coalesce with previous string - else { s[++i] = bs; } - } - if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match - if (s[i]) { s[i] += bm; } // coalesce with previous string - else { s[++i] = bm; } - } else { // interpolate non-matching numbers - s[++i] = null; - q.push({i: i, x: d3_interpolateNumber(am, bm)}); - } - bi = reB.lastIndex; - } + function selection_attr (name, value) { + var fullname = namespace(name); - // Add remains of b. - if (bi < b.length) { - bs = b.slice(bi); - if (s[i]) { s[i] += bs; } // coalesce with previous string - else { s[++i] = bs; } + if (arguments.length < 2) { + var node = this.node(); + return fullname.local ? node.getAttributeNS(fullname.space, fullname.local) : node.getAttribute(fullname); } - // Special optimization for only a single match. - // Otherwise, interpolate each of the numbers and rejoin the string. - return s.length < 2 ? (q[0] - ? one(q[0].x) - : zero(b)) - : (b = q.length, function(t) { - for (var i = 0, o; i < b; ++i) { s[(o = q[i]).i] = o.x(t); } - return s.join(""); - }); + return this.each((value == null ? fullname.local ? attrRemoveNS$1 : attrRemove$1 : typeof value === "function" ? fullname.local ? attrFunctionNS$1 : attrFunction$1 : fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, value)); } - function interpolate(a, b) { - var t = typeof b, c; - return b == null || t === "boolean" ? constant$2(b) - : (t === "number" ? d3_interpolateNumber - : t === "string" ? ((c = color(b)) ? (b = c, d3_interpolateRgb) : interpolateString) - : b instanceof color ? d3_interpolateRgb - : b instanceof Date ? date - : isNumberArray(b) ? numberArray - : Array.isArray(b) ? genericArray - : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object - : d3_interpolateNumber)(a, b); + function defaultView (node) { + return node.ownerDocument && node.ownerDocument.defaultView // node is a Node + || node.document && node // node is a Window + || node.defaultView; // node is a Document } - function interpolateRound(a, b) { - return a = +a, b = +b, function(t) { - return Math.round(a * (1 - t) + b * t); + function styleRemove$1(name) { + return function () { + this.style.removeProperty(name); }; } - var degrees$1 = 180 / Math.PI; - - var identity$1 = { - translateX: 0, - translateY: 0, - rotate: 0, - skewX: 0, - scaleX: 1, - scaleY: 1 - }; - - function decompose(a, b, c, d, e, f) { - var scaleX, scaleY, skewX; - if (scaleX = Math.sqrt(a * a + b * b)) { a /= scaleX, b /= scaleX; } - if (skewX = a * c + b * d) { c -= a * skewX, d -= b * skewX; } - if (scaleY = Math.sqrt(c * c + d * d)) { c /= scaleY, d /= scaleY, skewX /= scaleY; } - if (a * d < b * c) { a = -a, b = -b, skewX = -skewX, scaleX = -scaleX; } - return { - translateX: e, - translateY: f, - rotate: Math.atan2(b, a) * degrees$1, - skewX: Math.atan(skewX) * degrees$1, - scaleX: scaleX, - scaleY: scaleY + function styleConstant$1(name, value, priority) { + return function () { + this.style.setProperty(name, value, priority); }; } - var cssNode, - cssRoot, - cssView, - svgNode; - - function parseCss(value) { - if (value === "none") { return identity$1; } - if (!cssNode) { cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView; } - cssNode.style.transform = value; - value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform"); - cssRoot.removeChild(cssNode); - value = value.slice(7, -1).split(","); - return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]); + function styleFunction$1(name, value, priority) { + return function () { + var v = value.apply(this, arguments); + if (v == null) this.style.removeProperty(name);else this.style.setProperty(name, v, priority); + }; } - function parseSvg(value) { - if (value == null) { return identity$1; } - if (!svgNode) { svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); } - svgNode.setAttribute("transform", value); - if (!(value = svgNode.transform.baseVal.consolidate())) { return identity$1; } - value = value.matrix; - return decompose(value.a, value.b, value.c, value.d, value.e, value.f); + function selection_style (name, value, priority) { + return arguments.length > 1 ? this.each((value == null ? styleRemove$1 : typeof value === "function" ? styleFunction$1 : styleConstant$1)(name, value, priority == null ? "" : priority)) : styleValue(this.node(), name); + } + function styleValue(node, name) { + return node.style.getPropertyValue(name) || defaultView(node).getComputedStyle(node, null).getPropertyValue(name); } - function interpolateTransform(parse, pxComma, pxParen, degParen) { - - function pop(s) { - return s.length ? s.pop() + " " : ""; - } - - function translate(xa, ya, xb, yb, s, q) { - if (xa !== xb || ya !== yb) { - var i = s.push("translate(", null, pxComma, null, pxParen); - q.push({i: i - 4, x: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_interpolateNumber(ya, yb)}); - } else if (xb || yb) { - s.push("translate(" + xb + pxComma + yb + pxParen); - } - } - - function rotate(a, b, s, q) { - if (a !== b) { - if (a - b > 180) { b += 360; } else if (b - a > 180) { a += 360; } // shortest path - q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: d3_interpolateNumber(a, b)}); - } else if (b) { - s.push(pop(s) + "rotate(" + b + degParen); - } - } - - function skewX(a, b, s, q) { - if (a !== b) { - q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: d3_interpolateNumber(a, b)}); - } else if (b) { - s.push(pop(s) + "skewX(" + b + degParen); - } - } - - function scale(xa, ya, xb, yb, s, q) { - if (xa !== xb || ya !== yb) { - var i = s.push(pop(s) + "scale(", null, ",", null, ")"); - q.push({i: i - 4, x: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_interpolateNumber(ya, yb)}); - } else if (xb !== 1 || yb !== 1) { - s.push(pop(s) + "scale(" + xb + "," + yb + ")"); - } - } - - return function(a, b) { - var s = [], // string constants and placeholders - q = []; // number interpolators - a = parse(a), b = parse(b); - translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); - rotate(a.rotate, b.rotate, s, q); - skewX(a.skewX, b.skewX, s, q); - scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); - a = b = null; // gc - return function(t) { - var i = -1, n = q.length, o; - while (++i < n) { s[(o = q[i]).i] = o.x(t); } - return s.join(""); - }; + function propertyRemove(name) { + return function () { + delete this[name]; }; } - var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); - var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); - - var rho = Math.SQRT2, - rho2 = 2, - rho4 = 4, - epsilon2$1 = 1e-12; - - function cosh(x) { - return ((x = Math.exp(x)) + 1 / x) / 2; + function propertyConstant(name, value) { + return function () { + this[name] = value; + }; } - function sinh(x) { - return ((x = Math.exp(x)) - 1 / x) / 2; + function propertyFunction(name, value) { + return function () { + var v = value.apply(this, arguments); + if (v == null) delete this[name];else this[name] = v; + }; } - function tanh(x) { - return ((x = Math.exp(2 * x)) - 1) / (x + 1); + function selection_property (name, value) { + return arguments.length > 1 ? this.each((value == null ? propertyRemove : typeof value === "function" ? propertyFunction : propertyConstant)(name, value)) : this.node()[name]; } - // p0 = [ux0, uy0, w0] - // p1 = [ux1, uy1, w1] - function interpolateZoom(p0, p1) { - var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], - ux1 = p1[0], uy1 = p1[1], w1 = p1[2], - dx = ux1 - ux0, - dy = uy1 - uy0, - d2 = dx * dx + dy * dy, - i, - S; - - // Special case for u0 ≅ u1. - if (d2 < epsilon2$1) { - S = Math.log(w1 / w0) / rho; - i = function(t) { - return [ - ux0 + t * dx, - uy0 + t * dy, - w0 * Math.exp(rho * t * S) - ]; - }; - } - - // General case. - else { - var d1 = Math.sqrt(d2), - b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), - b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), - r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), - r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); - S = (r1 - r0) / rho; - i = function(t) { - var s = t * S, - coshr0 = cosh(r0), - u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); - return [ - ux0 + u * dx, - uy0 + u * dy, - w0 * coshr0 / cosh(rho * s + r0) - ]; - }; - } - - i.duration = S * 1000; - - return i; + function classArray(string) { + return string.trim().split(/^|\s+/); } - function d3_quantize(interpolator, n) { - var samples = new Array(n); - for (var i = 0; i < n; ++i) { samples[i] = interpolator(i / (n - 1)); } - return samples; + function classList(node) { + return node.classList || new ClassList(node); } - var frame = 0, // is an animation frame pending? - timeout = 0, // is a timeout pending? - interval = 0, // are any timers active? - pokeDelay = 1000, // how frequently we check for clock skew - taskHead, - taskTail, - clockLast = 0, - clockNow = 0, - clockSkew = 0, - clock = typeof performance === "object" && performance.now ? performance : Date, - setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); }; - - function now() { - return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); + function ClassList(node) { + this._node = node; + this._names = classArray(node.getAttribute("class") || ""); } - function clearNow() { - clockNow = 0; - } + ClassList.prototype = { + add: function add(name) { + var i = this._names.indexOf(name); - function Timer() { - this._call = - this._time = - this._next = null; - } + if (i < 0) { + this._names.push(name); - Timer.prototype = timer.prototype = { - constructor: Timer, - restart: function(callback, delay, time) { - if (typeof callback !== "function") { throw new TypeError("callback is not a function"); } - time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); - if (!this._next && taskTail !== this) { - if (taskTail) { taskTail._next = this; } - else { taskHead = this; } - taskTail = this; + this._node.setAttribute("class", this._names.join(" ")); } - this._call = callback; - this._time = time; - sleep(); }, - stop: function() { - if (this._call) { - this._call = null; - this._time = Infinity; - sleep(); + remove: function remove(name) { + var i = this._names.indexOf(name); + + if (i >= 0) { + this._names.splice(i, 1); + + this._node.setAttribute("class", this._names.join(" ")); } + }, + contains: function contains(name) { + return this._names.indexOf(name) >= 0; } }; - function timer(callback, delay, time) { - var t = new Timer; - t.restart(callback, delay, time); - return t; - } + function classedAdd(node, names) { + var list = classList(node), + i = -1, + n = names.length; - function timerFlush() { - now(); // Get the current time, if not already set. - ++frame; // Pretend we’ve set an alarm, if we haven’t already. - var t = taskHead, e; - while (t) { - if ((e = clockNow - t._time) >= 0) { t._call.call(null, e); } - t = t._next; + while (++i < n) { + list.add(names[i]); } - --frame; } - function wake() { - clockNow = (clockLast = clock.now()) + clockSkew; - frame = timeout = 0; - try { - timerFlush(); - } finally { - frame = 0; - nap(); - clockNow = 0; + function classedRemove(node, names) { + var list = classList(node), + i = -1, + n = names.length; + + while (++i < n) { + list.remove(names[i]); } } - function poke() { - var now = clock.now(), delay = now - clockLast; - if (delay > pokeDelay) { clockSkew -= delay, clockLast = now; } + function classedTrue(names) { + return function () { + classedAdd(this, names); + }; } - function nap() { - var t0, t1 = taskHead, t2, time = Infinity; - while (t1) { - if (t1._call) { - if (time > t1._time) { time = t1._time; } - t0 = t1, t1 = t1._next; - } else { - t2 = t1._next, t1._next = null; - t1 = t0 ? t0._next = t2 : taskHead = t2; - } - } - taskTail = t0; - sleep(time); + function classedFalse(names) { + return function () { + classedRemove(this, names); + }; } - function sleep(time) { - if (frame) { return; } // Soonest alarm already set, or will be. - if (timeout) { timeout = clearTimeout(timeout); } - var delay = time - clockNow; // Strictly less than if we recomputed clockNow. - if (delay > 24) { - if (time < Infinity) { timeout = setTimeout(wake, time - clock.now() - clockSkew); } - if (interval) { interval = clearInterval(interval); } - } else { - if (!interval) { clockLast = clock.now(), interval = setInterval(poke, pokeDelay); } - frame = 1, setFrame(wake); - } + function classedFunction(names, value) { + return function () { + (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); + }; } - function d3_timeout(callback, delay, time) { - var t = new Timer; - delay = delay == null ? 0 : +delay; - t.restart(function(elapsed) { - t.stop(); - callback(elapsed + delay); - }, delay, time); - return t; - } + function selection_classed (name, value) { + var names = classArray(name + ""); - var emptyOn = dispatch("start", "end", "cancel", "interrupt"); - var emptyTween = []; + if (arguments.length < 2) { + var list = classList(this.node()), + i = -1, + n = names.length; - var CREATED = 0; - var SCHEDULED = 1; - var STARTING = 2; - var STARTED = 3; - var RUNNING = 4; - var ENDING = 5; - var ENDED = 6; + while (++i < n) { + if (!list.contains(names[i])) return false; + } - function schedule(node, name, id, index, group, timing) { - var schedules = node.__transition; - if (!schedules) { node.__transition = {}; } - else if (id in schedules) { return; } - create$7(node, id, { - name: name, - index: index, // For context during callback. - group: group, // For context during callback. - on: emptyOn, - tween: emptyTween, - time: timing.time, - delay: timing.delay, - duration: timing.duration, - ease: timing.ease, - timer: null, - state: CREATED - }); - } + return true; + } - function init(node, id) { - var schedule = get$2(node, id); - if (schedule.state > CREATED) { throw new Error("too late; already scheduled"); } - return schedule; + return this.each((typeof value === "function" ? classedFunction : value ? classedTrue : classedFalse)(names, value)); } - function set$1(node, id) { - var schedule = get$2(node, id); - if (schedule.state > STARTED) { throw new Error("too late; already running"); } - return schedule; + function textRemove() { + this.textContent = ""; } - function get$2(node, id) { - var schedule = node.__transition; - if (!schedule || !(schedule = schedule[id])) { throw new Error("transition not found"); } - return schedule; + function textConstant$1(value) { + return function () { + this.textContent = value; + }; } - function create$7(node, id, self) { - var schedules = node.__transition, - tween; - - // Initialize the self timer when the transition is created. - // Note the actual delay is not known until the first callback! - schedules[id] = self; - self.timer = timer(schedule, 0, self.time); - - function schedule(elapsed) { - self.state = SCHEDULED; - self.timer.restart(start, self.delay, self.time); + function textFunction$1(value) { + return function () { + var v = value.apply(this, arguments); + this.textContent = v == null ? "" : v; + }; + } - // If the elapsed delay is less than our first sleep, start immediately. - if (self.delay <= elapsed) { start(elapsed - self.delay); } - } + function selection_text (value) { + return arguments.length ? this.each(value == null ? textRemove : (typeof value === "function" ? textFunction$1 : textConstant$1)(value)) : this.node().textContent; + } - function start(elapsed) { - var i, j, n, o; + function htmlRemove() { + this.innerHTML = ""; + } - // If the state is not SCHEDULED, then we previously errored on start. - if (self.state !== SCHEDULED) { return stop(); } + function htmlConstant(value) { + return function () { + this.innerHTML = value; + }; + } - for (i in schedules) { - o = schedules[i]; - if (o.name !== self.name) { continue; } + function htmlFunction(value) { + return function () { + var v = value.apply(this, arguments); + this.innerHTML = v == null ? "" : v; + }; + } - // While this element already has a starting transition during this frame, - // defer starting an interrupting transition until that transition has a - // chance to tick (and possibly end); see d3/d3-transition#54! - if (o.state === STARTED) { return d3_timeout(start); } + function selection_html (value) { + return arguments.length ? this.each(value == null ? htmlRemove : (typeof value === "function" ? htmlFunction : htmlConstant)(value)) : this.node().innerHTML; + } - // Interrupt the active transition, if any. - if (o.state === RUNNING) { - o.state = ENDED; - o.timer.stop(); - o.on.call("interrupt", node, node.__data__, o.index, o.group); - delete schedules[i]; - } + function raise() { + if (this.nextSibling) this.parentNode.appendChild(this); + } - // Cancel any pre-empted transitions. - else if (+i < id) { - o.state = ENDED; - o.timer.stop(); - o.on.call("cancel", node, node.__data__, o.index, o.group); - delete schedules[i]; - } - } + function selection_raise () { + return this.each(raise); + } - // Defer the first tick to end of the current frame; see d3/d3#1576. - // Note the transition may be canceled after start and before the first tick! - // Note this must be scheduled before the start event; see d3/d3-transition#16! - // Assuming this is successful, subsequent callbacks go straight to tick. - d3_timeout(function() { - if (self.state === STARTED) { - self.state = RUNNING; - self.timer.restart(tick, self.delay, self.time); - tick(elapsed); - } - }); + function lower() { + if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild); + } - // Dispatch the start event. - // Note this must be done before the tween are initialized. - self.state = STARTING; - self.on.call("start", node, node.__data__, self.index, self.group); - if (self.state !== STARTING) { return; } // interrupted - self.state = STARTED; + function selection_lower () { + return this.each(lower); + } - // Initialize the tween, deleting null tween. - tween = new Array(n = self.tween.length); - for (i = 0, j = -1; i < n; ++i) { - if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) { - tween[++j] = o; - } - } - tween.length = j + 1; - } + function selection_append (name) { + var create = typeof name === "function" ? name : creator(name); + return this.select(function () { + return this.appendChild(create.apply(this, arguments)); + }); + } - function tick(elapsed) { - var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1), - i = -1, - n = tween.length; + function constantNull() { + return null; + } - while (++i < n) { - tween[i].call(node, t); - } + function selection_insert (name, before) { + var create = typeof name === "function" ? name : creator(name), + select = before == null ? constantNull : typeof before === "function" ? before : selector(before); + return this.select(function () { + return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null); + }); + } - // Dispatch the end event. - if (self.state === ENDING) { - self.on.call("end", node, node.__data__, self.index, self.group); - stop(); - } - } + function remove$7() { + var parent = this.parentNode; + if (parent) parent.removeChild(this); + } - function stop() { - self.state = ENDED; - self.timer.stop(); - delete schedules[id]; - for (var i in schedules) { return; } // eslint-disable-line no-unused-vars - delete node.__transition; - } + function selection_remove () { + return this.each(remove$7); } - function interrupt(node, name) { - var schedules = node.__transition, - schedule, - active, - empty = true, - i; + function selection_cloneShallow() { + var clone = this.cloneNode(false), + parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; + } - if (!schedules) { return; } + function selection_cloneDeep() { + var clone = this.cloneNode(true), + parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; + } - name = name == null ? null : name + ""; + function selection_clone (deep) { + return this.select(deep ? selection_cloneDeep : selection_cloneShallow); + } - for (i in schedules) { - if ((schedule = schedules[i]).name !== name) { empty = false; continue; } - active = schedule.state > STARTING && schedule.state < ENDING; - schedule.state = ENDED; - schedule.timer.stop(); - schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group); - delete schedules[i]; - } + function selection_datum (value) { + return arguments.length ? this.property("__data__", value) : this.node().__data__; + } - if (empty) { delete node.__transition; } + function contextListener(listener) { + return function (event) { + listener.call(this, event, this.__data__); + }; } - function selection_interrupt(name) { - return this.each(function() { - interrupt(this, name); + function parseTypenames(typenames) { + return typenames.trim().split(/^|\s+/).map(function (t) { + var name = "", + i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + return { + type: t, + name: name + }; }); } - function tweenRemove(id, name) { - var tween0, tween1; - return function() { - var schedule = set$1(this, id), - tween = schedule.tween; + function onRemove(typename) { + return function () { + var on = this.__on; + if (!on) return; - // If this node shared tween with the previous node, - // just assign the updated shared tween and we’re done! - // Otherwise, copy-on-write. - if (tween !== tween0) { - tween1 = tween0 = tween; - for (var i = 0, n = tween1.length; i < n; ++i) { - if (tween1[i].name === name) { - tween1 = tween1.slice(); - tween1.splice(i, 1); - break; - } + for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { + if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.options); + } else { + on[++i] = o; } } - schedule.tween = tween1; + if (++i) on.length = i;else delete this.__on; }; } - function tweenFunction(id, name, value) { - var tween0, tween1; - if (typeof value !== "function") { throw new Error; } - return function() { - var schedule = set$1(this, id), - tween = schedule.tween; - - // If this node shared tween with the previous node, - // just assign the updated shared tween and we’re done! - // Otherwise, copy-on-write. - if (tween !== tween0) { - tween1 = (tween0 = tween).slice(); - for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) { - if (tween1[i].name === name) { - tween1[i] = t; - break; - } + function onAdd(typename, value, options) { + return function () { + var on = this.__on, + o, + listener = contextListener(value); + if (on) for (var j = 0, m = on.length; j < m; ++j) { + if ((o = on[j]).type === typename.type && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.options); + this.addEventListener(o.type, o.listener = listener, o.options = options); + o.value = value; + return; } - if (i === n) { tween1.push(t); } } - - schedule.tween = tween1; + this.addEventListener(typename.type, listener, options); + o = { + type: typename.type, + name: typename.name, + value: value, + listener: listener, + options: options + }; + if (!on) this.__on = [o];else on.push(o); }; } - function transition_tween(name, value) { - var id = this._id; - - name += ""; + function selection_on (typename, value, options) { + var typenames = parseTypenames(typename + ""), + i, + n = typenames.length, + t; if (arguments.length < 2) { - var tween = get$2(this.node(), id).tween; - for (var i = 0, n = tween.length, t; i < n; ++i) { - if ((t = tween[i]).name === name) { - return t.value; + var on = this.node().__on; + + if (on) for (var j = 0, m = on.length, o; j < m; ++j) { + for (i = 0, o = on[j]; i < n; ++i) { + if ((t = typenames[i]).type === o.type && t.name === o.name) { + return o.value; + } } } - return null; + return; } - return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value)); - } - - function tweenValue(transition, name, value) { - var id = transition._id; + on = value ? onAdd : onRemove; - transition.each(function() { - var schedule = set$1(this, id); - (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); - }); + for (i = 0; i < n; ++i) { + this.each(on(typenames[i], value, options)); + } - return function(node) { - return get$2(node, id).value[name]; - }; + return this; } - function interpolate$1(a, b) { - var c; - return (typeof b === "number" ? d3_interpolateNumber - : b instanceof color ? d3_interpolateRgb - : (c = color(b)) ? (b = c, d3_interpolateRgb) - : interpolateString)(a, b); - } + function dispatchEvent(node, type, params) { + var window = defaultView(node), + event = window.CustomEvent; - function attrRemove$1(name) { - return function() { - this.removeAttribute(name); - }; - } + if (typeof event === "function") { + event = new event(type, params); + } else { + event = window.document.createEvent("Event"); + if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;else event.initEvent(type, false, false); + } - function attrRemoveNS$1(fullname) { - return function() { - this.removeAttributeNS(fullname.space, fullname.local); - }; + node.dispatchEvent(event); } - function attrConstant$1(name, interpolate, value1) { - var string00, - string1 = value1 + "", - interpolate0; - return function() { - var string0 = this.getAttribute(name); - return string0 === string1 ? null - : string0 === string00 ? interpolate0 - : interpolate0 = interpolate(string00 = string0, value1); + function dispatchConstant(type, params) { + return function () { + return dispatchEvent(this, type, params); }; } - function attrConstantNS$1(fullname, interpolate, value1) { - var string00, - string1 = value1 + "", - interpolate0; - return function() { - var string0 = this.getAttributeNS(fullname.space, fullname.local); - return string0 === string1 ? null - : string0 === string00 ? interpolate0 - : interpolate0 = interpolate(string00 = string0, value1); + function dispatchFunction(type, params) { + return function () { + return dispatchEvent(this, type, params.apply(this, arguments)); }; } - function attrFunction$1(name, interpolate, value) { - var string00, - string10, - interpolate0; - return function() { - var string0, value1 = value(this), string1; - if (value1 == null) { return void this.removeAttribute(name); } - string0 = this.getAttribute(name); - string1 = value1 + ""; - return string0 === string1 ? null - : string0 === string00 && string1 === string10 ? interpolate0 - : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); - }; + function selection_dispatch (type, params) { + return this.each((typeof params === "function" ? dispatchFunction : dispatchConstant)(type, params)); } - function attrFunctionNS$1(fullname, interpolate, value) { - var string00, - string10, - interpolate0; - return function() { - var string0, value1 = value(this), string1; - if (value1 == null) { return void this.removeAttributeNS(fullname.space, fullname.local); } - string0 = this.getAttributeNS(fullname.space, fullname.local); - string1 = value1 + ""; - return string0 === string1 ? null - : string0 === string00 && string1 === string10 ? interpolate0 - : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); - }; - } + var _marked$1 = /*#__PURE__*/regeneratorRuntime.mark(_callee); - function transition_attr(name, value) { - var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate$1; - return this.attrTween(name, typeof value === "function" - ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value)) - : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname) - : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value)); - } + function _callee() { + var groups, j, m, group, i, n, node; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + groups = this._groups, j = 0, m = groups.length; - function attrInterpolate(name, i) { - return function(t) { - this.setAttribute(name, i.call(this, t)); - }; - } + case 1: + if (!(j < m)) { + _context.next = 13; + break; + } - function attrInterpolateNS(fullname, i) { - return function(t) { - this.setAttributeNS(fullname.space, fullname.local, i.call(this, t)); - }; - } + group = groups[j], i = 0, n = group.length; - function attrTweenNS(fullname, value) { - var t0, i0; - function tween() { - var i = value.apply(this, arguments); - if (i !== i0) { t0 = (i0 = i) && attrInterpolateNS(fullname, i); } - return t0; - } - tween._value = value; - return tween; - } + case 3: + if (!(i < n)) { + _context.next = 10; + break; + } - function attrTween(name, value) { - var t0, i0; - function tween() { - var i = value.apply(this, arguments); - if (i !== i0) { t0 = (i0 = i) && attrInterpolate(name, i); } - return t0; - } - tween._value = value; - return tween; - } + if (!(node = group[i])) { + _context.next = 7; + break; + } - function transition_attrTween(name, value) { - var key = "attr." + name; - if (arguments.length < 2) { return (key = this.tween(key)) && key._value; } - if (value == null) { return this.tween(key, null); } - if (typeof value !== "function") { throw new Error; } - var fullname = namespace(name); - return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); - } + _context.next = 7; + return node; - function delayFunction(id, value) { - return function() { - init(this, id).delay = +value.apply(this, arguments); - }; - } + case 7: + ++i; + _context.next = 3; + break; - function delayConstant(id, value) { - return value = +value, function() { - init(this, id).delay = value; - }; - } + case 10: + ++j; + _context.next = 1; + break; - function transition_delay(value) { - var id = this._id; + case 13: + case "end": + return _context.stop(); + } + } + }, _marked$1, this); + } - return arguments.length - ? this.each((typeof value === "function" - ? delayFunction - : delayConstant)(id, value)) - : get$2(this.node(), id).delay; + var root$1 = [null]; + function Selection$1(groups, parents) { + this._groups = groups; + this._parents = parents; } - function durationFunction(id, value) { - return function() { - set$1(this, id).duration = +value.apply(this, arguments); - }; + function selection() { + return new Selection$1([[document.documentElement]], root$1); } - function durationConstant(id, value) { - return value = +value, function() { - set$1(this, id).duration = value; - }; + function selection_selection() { + return this; } - function transition_duration(value) { - var id = this._id; - - return arguments.length - ? this.each((typeof value === "function" - ? durationFunction - : durationConstant)(id, value)) - : get$2(this.node(), id).duration; - } - - function easeConstant(id, value) { - if (typeof value !== "function") { throw new Error; } - return function() { - set$1(this, id).ease = value; - }; - } - - function transition_ease(value) { - var id = this._id; + Selection$1.prototype = selection.prototype = _defineProperty({ + constructor: Selection$1, + select: selection_select, + selectAll: selection_selectAll, + selectChild: selection_selectChild, + selectChildren: selection_selectChildren, + filter: selection_filter, + data: selection_data, + enter: selection_enter, + exit: selection_exit, + join: selection_join, + merge: selection_merge, + selection: selection_selection, + order: selection_order, + sort: selection_sort, + call: selection_call, + nodes: selection_nodes, + node: selection_node, + size: selection_size, + empty: selection_empty, + each: selection_each, + attr: selection_attr, + style: selection_style, + property: selection_property, + classed: selection_classed, + text: selection_text, + html: selection_html, + raise: selection_raise, + lower: selection_lower, + append: selection_append, + insert: selection_insert, + remove: selection_remove, + clone: selection_clone, + datum: selection_datum, + on: selection_on, + dispatch: selection_dispatch + }, Symbol.iterator, _callee); - return arguments.length - ? this.each(easeConstant(id, value)) - : get$2(this.node(), id).ease; + function select (selector) { + return typeof selector === "string" ? new Selection$1([[document.querySelector(selector)]], [document.documentElement]) : new Selection$1([[selector]], root$1); } - function transition_filter(match) { - if (typeof match !== "function") { match = matcher(match); } + function sourceEvent (event) { + var sourceEvent; - for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { - if ((node = group[i]) && match.call(node, node.__data__, i, group)) { - subgroup.push(node); - } - } + while (sourceEvent = event.sourceEvent) { + event = sourceEvent; } - return new Transition(subgroups, this._parents, this._name, this._id); + return event; } - function transition_merge(transition) { - if (transition._id !== this._id) { throw new Error; } + function pointer (event, node) { + event = sourceEvent(event); + if (node === undefined) node = event.currentTarget; - for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { - for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { - if (node = group0[i] || group1[i]) { - merge[i] = node; - } + if (node) { + var svg = node.ownerSVGElement || node; + + if (svg.createSVGPoint) { + var point = svg.createSVGPoint(); + point.x = event.clientX, point.y = event.clientY; + point = point.matrixTransform(node.getScreenCTM().inverse()); + return [point.x, point.y]; } - } - for (; j < m0; ++j) { - merges[j] = groups0[j]; + if (node.getBoundingClientRect) { + var rect = node.getBoundingClientRect(); + return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; + } } - return new Transition(merges, this._parents, this._name, this._id); - } - - function start(name) { - return (name + "").trim().split(/^|\s+/).every(function(t) { - var i = t.indexOf("."); - if (i >= 0) { t = t.slice(0, i); } - return !t || t === "start"; - }); - } - - function onFunction(id, name, listener) { - var on0, on1, sit = start(name) ? init : set$1; - return function() { - var schedule = sit(this, id), - on = schedule.on; - - // If this node shared a dispatch with the previous node, - // just assign the updated shared dispatch and we’re done! - // Otherwise, copy-on-write. - if (on !== on0) { (on1 = (on0 = on).copy()).on(name, listener); } - - schedule.on = on1; - }; + return [event.pageX, event.pageY]; } - function transition_on(name, listener) { - var id = this._id; - - return arguments.length < 2 - ? get$2(this.node(), id).on.on(name) - : this.each(onFunction(id, name, listener)); + function selectAll (selector) { + return typeof selector === "string" ? new Selection$1([document.querySelectorAll(selector)], [document.documentElement]) : new Selection$1([selector == null ? [] : array(selector)], root$1); } - function removeFunction(id) { - return function() { - var parent = this.parentNode; - for (var i in this.__transition) { if (+i !== id) { return; } } - if (parent) { parent.removeChild(this); } - }; + function nopropagation$1(event) { + event.stopImmediatePropagation(); } - - function transition_remove() { - return this.on("end.remove", removeFunction(this._id)); + function noevent$1 (event) { + event.preventDefault(); + event.stopImmediatePropagation(); } - function transition_select(select) { - var name = this._name, - id = this._id; - - if (typeof select !== "function") { select = selector(select); } + function dragDisable (view) { + var root = view.document.documentElement, + selection = select(view).on("dragstart.drag", noevent$1, true); - for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { - if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { - if ("__data__" in node) { subnode.__data__ = node.__data__; } - subgroup[i] = subnode; - schedule(subgroup[i], name, id, i, subgroup, get$2(node, id)); - } - } + if ("onselectstart" in root) { + selection.on("selectstart.drag", noevent$1, true); + } else { + root.__noselect = root.style.MozUserSelect; + root.style.MozUserSelect = "none"; } - - return new Transition(subgroups, this._parents, name, id); } + function yesdrag(view, noclick) { + var root = view.document.documentElement, + selection = select(view).on("dragstart.drag", null); - function transition_selectAll(select) { - var name = this._name, - id = this._id; - - if (typeof select !== "function") { select = selectorAll(select); } - - for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { - if (node = group[i]) { - for (var children = select.call(node, node.__data__, i, group), child, inherit = get$2(node, id), k = 0, l = children.length; k < l; ++k) { - if (child = children[k]) { - schedule(child, name, id, k, children, inherit); - } - } - subgroups.push(children); - parents.push(node); - } - } + if (noclick) { + selection.on("click.drag", noevent$1, true); + setTimeout(function () { + selection.on("click.drag", null); + }, 0); } - return new Transition(subgroups, parents, name, id); - } - - var Selection$1 = selection.prototype.constructor; - - function transition_selection() { - return new Selection$1(this._groups, this._parents); - } - - function styleNull(name, interpolate) { - var string00, - string10, - interpolate0; - return function() { - var string0 = styleValue(this, name), - string1 = (this.style.removeProperty(name), styleValue(this, name)); - return string0 === string1 ? null - : string0 === string00 && string1 === string10 ? interpolate0 - : interpolate0 = interpolate(string00 = string0, string10 = string1); - }; - } - - function styleRemove$1(name) { - return function() { - this.style.removeProperty(name); - }; + if ("onselectstart" in root) { + selection.on("selectstart.drag", null); + } else { + root.style.MozUserSelect = root.__noselect; + delete root.__noselect; + } } - function styleConstant$1(name, interpolate, value1) { - var string00, - string1 = value1 + "", - interpolate0; - return function() { - var string0 = styleValue(this, name); - return string0 === string1 ? null - : string0 === string00 ? interpolate0 - : interpolate0 = interpolate(string00 = string0, value1); + var constant$2 = (function (x) { + return function () { + return x; }; - } + }); - function styleFunction$1(name, interpolate, value) { - var string00, - string10, - interpolate0; - return function() { - var string0 = styleValue(this, name), - value1 = value(this), - string1 = value1 + ""; - if (value1 == null) { string1 = value1 = (this.style.removeProperty(name), styleValue(this, name)); } - return string0 === string1 ? null - : string0 === string00 && string1 === string10 ? interpolate0 - : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); - }; + function DragEvent(type, _ref) { + var sourceEvent = _ref.sourceEvent, + subject = _ref.subject, + target = _ref.target, + identifier = _ref.identifier, + active = _ref.active, + x = _ref.x, + y = _ref.y, + dx = _ref.dx, + dy = _ref.dy, + dispatch = _ref.dispatch; + Object.defineProperties(this, { + type: { + value: type, + enumerable: true, + configurable: true + }, + sourceEvent: { + value: sourceEvent, + enumerable: true, + configurable: true + }, + subject: { + value: subject, + enumerable: true, + configurable: true + }, + target: { + value: target, + enumerable: true, + configurable: true + }, + identifier: { + value: identifier, + enumerable: true, + configurable: true + }, + active: { + value: active, + enumerable: true, + configurable: true + }, + x: { + value: x, + enumerable: true, + configurable: true + }, + y: { + value: y, + enumerable: true, + configurable: true + }, + dx: { + value: dx, + enumerable: true, + configurable: true + }, + dy: { + value: dy, + enumerable: true, + configurable: true + }, + _: { + value: dispatch + } + }); } - function styleMaybeRemove(id, name) { - var on0, on1, listener0, key = "style." + name, event = "end." + key, remove; - return function() { - var schedule = set$1(this, id), - on = schedule.on, - listener = schedule.value[key] == null ? remove || (remove = styleRemove$1(name)) : undefined; + DragEvent.prototype.on = function () { + var value = this._.on.apply(this._, arguments); - // If this node shared a dispatch with the previous node, - // just assign the updated shared dispatch and we’re done! - // Otherwise, copy-on-write. - if (on !== on0 || listener0 !== listener) { (on1 = (on0 = on).copy()).on(event, listener0 = listener); } + return value === this._ ? this : value; + }; - schedule.on = on1; - }; + function defaultFilter$2(event) { + return !event.ctrlKey && !event.button; } - function transition_style(name, value, priority) { - var i = (name += "") === "transform" ? interpolateTransformCss : interpolate$1; - return value == null ? this - .styleTween(name, styleNull(name, i)) - .on("end.style." + name, styleRemove$1(name)) - : typeof value === "function" ? this - .styleTween(name, styleFunction$1(name, i, tweenValue(this, "style." + name, value))) - .each(styleMaybeRemove(this._id, name)) - : this - .styleTween(name, styleConstant$1(name, i, value), priority) - .on("end.style." + name, null); + function defaultContainer() { + return this.parentNode; } - function styleInterpolate(name, i, priority) { - return function(t) { - this.style.setProperty(name, i.call(this, t), priority); - }; + function defaultSubject(event, d) { + return d == null ? { + x: event.x, + y: event.y + } : d; } - function styleTween(name, value, priority) { - var t, i0; - function tween() { - var i = value.apply(this, arguments); - if (i !== i0) { t = (i0 = i) && styleInterpolate(name, i, priority); } - return t; - } - tween._value = value; - return tween; + function defaultTouchable$1() { + return navigator.maxTouchPoints || "ontouchstart" in this; } - function transition_styleTween(name, value, priority) { - var key = "style." + (name += ""); - if (arguments.length < 2) { return (key = this.tween(key)) && key._value; } - if (value == null) { return this.tween(key, null); } - if (typeof value !== "function") { throw new Error; } - return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); - } + function d3_drag () { + var filter = defaultFilter$2, + container = defaultContainer, + subject = defaultSubject, + touchable = defaultTouchable$1, + gestures = {}, + listeners = dispatch$8("start", "drag", "end"), + active = 0, + mousedownx, + mousedowny, + mousemoving, + touchending, + clickDistance2 = 0; - function textConstant$1(value) { - return function() { - this.textContent = value; - }; - } + function drag(selection) { + selection.on("mousedown.drag", mousedowned).filter(touchable).on("touchstart.drag", touchstarted).on("touchmove.drag", touchmoved).on("touchend.drag touchcancel.drag", touchended).style("touch-action", "none").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } - function textFunction$1(value) { - return function() { - var value1 = value(this); - this.textContent = value1 == null ? "" : value1; - }; - } + function mousedowned(event, d) { + if (touchending || !filter.call(this, event, d)) return; + var gesture = beforestart(this, container.call(this, event, d), event, d, "mouse"); + if (!gesture) return; + select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true); + dragDisable(event.view); + nopropagation$1(event); + mousemoving = false; + mousedownx = event.clientX; + mousedowny = event.clientY; + gesture("start", event); + } - function transition_text(value) { - return this.tween("text", typeof value === "function" - ? textFunction$1(tweenValue(this, "text", value)) - : textConstant$1(value == null ? "" : value + "")); - } + function mousemoved(event) { + noevent$1(event); - function textInterpolate(i) { - return function(t) { - this.textContent = i.call(this, t); - }; - } + if (!mousemoving) { + var dx = event.clientX - mousedownx, + dy = event.clientY - mousedowny; + mousemoving = dx * dx + dy * dy > clickDistance2; + } - function textTween(value) { - var t0, i0; - function tween() { - var i = value.apply(this, arguments); - if (i !== i0) { t0 = (i0 = i) && textInterpolate(i); } - return t0; + gestures.mouse("drag", event); } - tween._value = value; - return tween; - } - function transition_textTween(value) { - var key = "text"; - if (arguments.length < 1) { return (key = this.tween(key)) && key._value; } - if (value == null) { return this.tween(key, null); } - if (typeof value !== "function") { throw new Error; } - return this.tween(key, textTween(value)); - } + function mouseupped(event) { + select(event.view).on("mousemove.drag mouseup.drag", null); + yesdrag(event.view, mousemoving); + noevent$1(event); + gestures.mouse("end", event); + } - function transition_transition() { - var name = this._name, - id0 = this._id, - id1 = newId(); + function touchstarted(event, d) { + if (!filter.call(this, event, d)) return; + var touches = event.changedTouches, + c = container.call(this, event, d), + n = touches.length, + i, + gesture; - for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { - if (node = group[i]) { - var inherit = get$2(node, id0); - schedule(node, name, id1, i, group, { - time: inherit.time + inherit.delay + inherit.duration, - delay: 0, - duration: inherit.duration, - ease: inherit.ease - }); + for (i = 0; i < n; ++i) { + if (gesture = beforestart(this, c, event, d, touches[i].identifier, touches[i])) { + nopropagation$1(event); + gesture("start", event, touches[i]); } } } - return new Transition(groups, this._parents, name, id1); - } - - function transition_end() { - var on0, on1, that = this, id = that._id, size = that.size(); - return new Promise(function(resolve, reject) { - var cancel = {value: reject}, - end = {value: function() { if (--size === 0) { resolve(); } }}; - - that.each(function() { - var schedule = set$1(this, id), - on = schedule.on; + function touchmoved(event) { + var touches = event.changedTouches, + n = touches.length, + i, + gesture; - // If this node shared a dispatch with the previous node, - // just assign the updated shared dispatch and we’re done! - // Otherwise, copy-on-write. - if (on !== on0) { - on1 = (on0 = on).copy(); - on1._.cancel.push(cancel); - on1._.interrupt.push(cancel); - on1._.end.push(end); + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + noevent$1(event); + gesture("drag", event, touches[i]); } + } + } - schedule.on = on1; - }); - }); - } - - var id$3 = 0; - - function Transition(groups, parents, name, id) { - this._groups = groups; - this._parents = parents; - this._name = name; - this._id = id; - } - - function transition(name) { - return selection().transition(name); - } - - function newId() { - return ++id$3; - } + function touchended(event) { + var touches = event.changedTouches, + n = touches.length, + i, + gesture; + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function () { + touchending = null; + }, 500); // Ghost clicks are delayed! - var selection_prototype = selection.prototype; + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + nopropagation$1(event); + gesture("end", event, touches[i]); + } + } + } - Transition.prototype = transition.prototype = { - constructor: Transition, - select: transition_select, - selectAll: transition_selectAll, - filter: transition_filter, - merge: transition_merge, - selection: transition_selection, - transition: transition_transition, - call: selection_prototype.call, - nodes: selection_prototype.nodes, - node: selection_prototype.node, - size: selection_prototype.size, - empty: selection_prototype.empty, - each: selection_prototype.each, - on: transition_on, - attr: transition_attr, - attrTween: transition_attrTween, - style: transition_style, - styleTween: transition_styleTween, - text: transition_text, - textTween: transition_textTween, - remove: transition_remove, - tween: transition_tween, - delay: transition_delay, - duration: transition_duration, - ease: transition_ease, - end: transition_end - }; + function beforestart(that, container, event, d, identifier, touch) { + var dispatch = listeners.copy(), + p = pointer(touch || event, container), + dx, + dy, + s; + if ((s = subject.call(that, new DragEvent("beforestart", { + sourceEvent: event, + target: drag, + identifier: identifier, + active: active, + x: p[0], + y: p[1], + dx: 0, + dy: 0, + dispatch: dispatch + }), d)) == null) return; + dx = s.x - p[0] || 0; + dy = s.y - p[1] || 0; + return function gesture(type, event, touch) { + var p0 = p, + n; - function linear$1(t) { - return +t; - } + switch (type) { + case "start": + gestures[identifier] = gesture, n = active++; + break; - function cubicInOut(t) { - return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; - } + case "end": + delete gestures[identifier], --active; + // nobreak - var defaultTiming = { - time: null, // Set on use. - delay: 0, - duration: 250, - ease: cubicInOut - }; + case "drag": + p = pointer(touch || event, container), n = active; + break; + } - function inherit(node, id) { - var timing; - while (!(timing = node.__transition) || !(timing = timing[id])) { - if (!(node = node.parentNode)) { - return defaultTiming.time = now(), defaultTiming; - } + dispatch.call(type, that, new DragEvent(type, { + sourceEvent: event, + subject: s, + target: drag, + identifier: identifier, + active: n, + x: p[0] + dx, + y: p[1] + dy, + dx: p[0] - p0[0], + dy: p[1] - p0[1], + dispatch: dispatch + }), d); + }; } - return timing; - } - function selection_transition(name) { - var id, - timing; + drag.filter = function (_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter; + }; - if (name instanceof Transition) { - id = name._id, name = name._name; - } else { - id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + ""; - } + drag.container = function (_) { + return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container; + }; - for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { - if (node = group[i]) { - schedule(node, name, id, i, group, timing || inherit(node, id)); - } - } - } + drag.subject = function (_) { + return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject; + }; - return new Transition(groups, this._parents, name, id); - } + drag.touchable = function (_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), drag) : touchable; + }; - selection.prototype.interrupt = selection_interrupt; - selection.prototype.transition = selection_transition; + drag.on = function () { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? drag : value; + }; - function constant$3(x) { - return function() { - return x; + drag.clickDistance = function (_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2); }; - } - function ZoomEvent(target, type, transform) { - this.target = target; - this.type = type; - this.transform = transform; + return drag; } - function Transform(k, x, y) { - this.k = k; - this.x = x; - this.y = y; - } + var DESCRIPTORS$4 = descriptors; + var global$b = global$1o; + var uncurryThis$e = functionUncurryThis; + var isForced$1 = isForced_1; + var inheritIfRequired$1 = inheritIfRequired$4; + var createNonEnumerableProperty = createNonEnumerableProperty$b; + var defineProperty$1 = objectDefineProperty.f; + var getOwnPropertyNames$1 = objectGetOwnPropertyNames.f; + var isPrototypeOf$1 = objectIsPrototypeOf; + var isRegExp$1 = isRegexp; + var toString$9 = toString$k; + var regExpFlags$1 = regexpFlags$1; + var stickyHelpers = regexpStickyHelpers; + var redefine$3 = redefine$h.exports; + var fails$a = fails$V; + var hasOwn$2 = hasOwnProperty_1; + var enforceInternalState = internalState.enforce; + var setSpecies = setSpecies$5; + var wellKnownSymbol$1 = wellKnownSymbol$t; + var UNSUPPORTED_DOT_ALL = regexpUnsupportedDotAll; + var UNSUPPORTED_NCG = regexpUnsupportedNcg; + + var MATCH$1 = wellKnownSymbol$1('match'); + var NativeRegExp = global$b.RegExp; + var RegExpPrototype$1 = NativeRegExp.prototype; + var SyntaxError$1 = global$b.SyntaxError; + var getFlags = uncurryThis$e(regExpFlags$1); + var exec$2 = uncurryThis$e(RegExpPrototype$1.exec); + var charAt$1 = uncurryThis$e(''.charAt); + var replace$3 = uncurryThis$e(''.replace); + var stringIndexOf$1 = uncurryThis$e(''.indexOf); + var stringSlice$4 = uncurryThis$e(''.slice); + // TODO: Use only propper RegExpIdentifierName + var IS_NCG = /^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/; + var re1 = /a/g; + var re2 = /a/g; + + // "new" should create a new object, old webkit bug + var CORRECT_NEW = new NativeRegExp(re1) !== re1; + + var MISSED_STICKY = stickyHelpers.MISSED_STICKY; + var UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y; + + var BASE_FORCED = DESCRIPTORS$4 && + (!CORRECT_NEW || MISSED_STICKY || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG || fails$a(function () { + re2[MATCH$1] = false; + // RegExp constructor can alter flags and IsRegExp works correct with @@match + return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i'; + })); + + var handleDotAll = function (string) { + var length = string.length; + var index = 0; + var result = ''; + var brackets = false; + var chr; + for (; index <= length; index++) { + chr = charAt$1(string, index); + if (chr === '\\') { + result += chr + charAt$1(string, ++index); + continue; + } + if (!brackets && chr === '.') { + result += '[\\s\\S]'; + } else { + if (chr === '[') { + brackets = true; + } else if (chr === ']') { + brackets = false; + } result += chr; + } + } return result; + }; - Transform.prototype = { - constructor: Transform, - scale: function(k) { - return k === 1 ? this : new Transform(this.k * k, this.x, this.y); - }, - translate: function(x, y) { - return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y); - }, - apply: function(point) { - return [point[0] * this.k + this.x, point[1] * this.k + this.y]; - }, - applyX: function(x) { - return x * this.k + this.x; - }, - applyY: function(y) { - return y * this.k + this.y; - }, - invert: function(location) { - return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k]; - }, - invertX: function(x) { - return (x - this.x) / this.k; - }, - invertY: function(y) { - return (y - this.y) / this.k; - }, - rescaleX: function(x) { - return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x)); - }, - rescaleY: function(y) { - return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y)); - }, - toString: function() { - return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; - } + var handleNCG = function (string) { + var length = string.length; + var index = 0; + var result = ''; + var named = []; + var names = {}; + var brackets = false; + var ncg = false; + var groupid = 0; + var groupname = ''; + var chr; + for (; index <= length; index++) { + chr = charAt$1(string, index); + if (chr === '\\') { + chr = chr + charAt$1(string, ++index); + } else if (chr === ']') { + brackets = false; + } else if (!brackets) switch (true) { + case chr === '[': + brackets = true; + break; + case chr === '(': + if (exec$2(IS_NCG, stringSlice$4(string, index + 1))) { + index += 2; + ncg = true; + } + result += chr; + groupid++; + continue; + case chr === '>' && ncg: + if (groupname === '' || hasOwn$2(names, groupname)) { + throw new SyntaxError$1('Invalid capture group name'); + } + names[groupname] = true; + named[named.length] = [groupname, groupid]; + ncg = false; + groupname = ''; + continue; + } + if (ncg) groupname += chr; + else result += chr; + } return [result, named]; }; - var identity$2 = new Transform(1, 0, 0); + // `RegExp` constructor + // https://tc39.es/ecma262/#sec-regexp-constructor + if (isForced$1('RegExp', BASE_FORCED)) { + var RegExpWrapper = function RegExp(pattern, flags) { + var thisIsRegExp = isPrototypeOf$1(RegExpPrototype$1, this); + var patternIsRegExp = isRegExp$1(pattern); + var flagsAreUndefined = flags === undefined; + var groups = []; + var rawPattern = pattern; + var rawFlags, dotAll, sticky, handled, result, state; - function nopropagation$1() { - event.stopImmediatePropagation(); - } + if (!thisIsRegExp && patternIsRegExp && flagsAreUndefined && pattern.constructor === RegExpWrapper) { + return pattern; + } - function noevent$1() { - event.preventDefault(); - event.stopImmediatePropagation(); - } + if (patternIsRegExp || isPrototypeOf$1(RegExpPrototype$1, pattern)) { + pattern = pattern.source; + if (flagsAreUndefined) flags = 'flags' in rawPattern ? rawPattern.flags : getFlags(rawPattern); + } - // Ignore right-click, since that should open the context menu. - function defaultFilter$1() { - return !event.ctrlKey && !event.button; - } + pattern = pattern === undefined ? '' : toString$9(pattern); + flags = flags === undefined ? '' : toString$9(flags); + rawPattern = pattern; - function defaultExtent() { - var e = this; - if (e instanceof SVGElement) { - e = e.ownerSVGElement || e; - if (e.hasAttribute("viewBox")) { - e = e.viewBox.baseVal; - return [[e.x, e.y], [e.x + e.width, e.y + e.height]]; + if (UNSUPPORTED_DOT_ALL && 'dotAll' in re1) { + dotAll = !!flags && stringIndexOf$1(flags, 's') > -1; + if (dotAll) flags = replace$3(flags, /s/g, ''); } - return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]]; - } - return [[0, 0], [e.clientWidth, e.clientHeight]]; - } - - function defaultTransform() { - return this.__zoom || identity$2; - } - function defaultWheelDelta() { - return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002); - } + rawFlags = flags; - function defaultTouchable$1() { - return navigator.maxTouchPoints || ("ontouchstart" in this); - } + if (MISSED_STICKY && 'sticky' in re1) { + sticky = !!flags && stringIndexOf$1(flags, 'y') > -1; + if (sticky && UNSUPPORTED_Y) flags = replace$3(flags, /y/g, ''); + } - function defaultConstrain(transform, extent, translateExtent) { - var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0], - dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0], - dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1], - dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1]; - return transform.translate( - dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), - dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1) - ); - } + if (UNSUPPORTED_NCG) { + handled = handleNCG(pattern); + pattern = handled[0]; + groups = handled[1]; + } - function d3_zoom() { - var filter = defaultFilter$1, - extent = defaultExtent, - constrain = defaultConstrain, - wheelDelta = defaultWheelDelta, - touchable = defaultTouchable$1, - scaleExtent = [0, Infinity], - translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], - duration = 250, - interpolate = interpolateZoom, - listeners = dispatch("start", "zoom", "end"), - touchstarting, - touchending, - touchDelay = 500, - wheelDelay = 150, - clickDistance2 = 0; + result = inheritIfRequired$1(NativeRegExp(pattern, flags), thisIsRegExp ? this : RegExpPrototype$1, RegExpWrapper); - function zoom(selection) { - selection - .property("__zoom", defaultTransform) - .on("wheel.zoom", wheeled) - .on("mousedown.zoom", mousedowned) - .on("dblclick.zoom", dblclicked) - .filter(touchable) - .on("touchstart.zoom", touchstarted) - .on("touchmove.zoom", touchmoved) - .on("touchend.zoom touchcancel.zoom", touchended) - .style("touch-action", "none") - .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); - } - - zoom.transform = function(collection, transform, point) { - var selection = collection.selection ? collection.selection() : collection; - selection.property("__zoom", defaultTransform); - if (collection !== selection) { - schedule(collection, transform, point); - } else { - selection.interrupt().each(function() { - gesture(this, arguments) - .start() - .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform) - .end(); - }); + if (dotAll || sticky || groups.length) { + state = enforceInternalState(result); + if (dotAll) { + state.dotAll = true; + state.raw = RegExpWrapper(handleDotAll(pattern), rawFlags); + } + if (sticky) state.sticky = true; + if (groups.length) state.groups = groups; } - }; - zoom.scaleBy = function(selection, k, p) { - zoom.scaleTo(selection, function() { - var k0 = this.__zoom.k, - k1 = typeof k === "function" ? k.apply(this, arguments) : k; - return k0 * k1; - }, p); - }; + if (pattern !== rawPattern) try { + // fails in old engines, but we have no alternatives for unsupported regex syntax + createNonEnumerableProperty(result, 'source', rawPattern === '' ? '(?:)' : rawPattern); + } catch (error) { /* empty */ } - zoom.scaleTo = function(selection, k, p) { - zoom.transform(selection, function() { - var e = extent.apply(this, arguments), - t0 = this.__zoom, - p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, - p1 = t0.invert(p0), - k1 = typeof k === "function" ? k.apply(this, arguments) : k; - return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent); - }, p); + return result; }; - zoom.translateBy = function(selection, x, y) { - zoom.transform(selection, function() { - return constrain(this.__zoom.translate( - typeof x === "function" ? x.apply(this, arguments) : x, - typeof y === "function" ? y.apply(this, arguments) : y - ), extent.apply(this, arguments), translateExtent); + var proxy = function (key) { + key in RegExpWrapper || defineProperty$1(RegExpWrapper, key, { + configurable: true, + get: function () { return NativeRegExp[key]; }, + set: function (it) { NativeRegExp[key] = it; } }); }; - zoom.translateTo = function(selection, x, y, p) { - zoom.transform(selection, function() { - var e = extent.apply(this, arguments), - t = this.__zoom, - p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p; - return constrain(identity$2.translate(p0[0], p0[1]).scale(t.k).translate( - typeof x === "function" ? -x.apply(this, arguments) : -x, - typeof y === "function" ? -y.apply(this, arguments) : -y - ), e, translateExtent); - }, p); - }; - - function scale(transform, k) { - k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k)); - return k === transform.k ? transform : new Transform(k, transform.x, transform.y); + for (var keys$1 = getOwnPropertyNames$1(NativeRegExp), index$1 = 0; keys$1.length > index$1;) { + proxy(keys$1[index$1++]); } - function translate(transform, p0, p1) { - var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k; - return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y); - } + RegExpPrototype$1.constructor = RegExpWrapper; + RegExpWrapper.prototype = RegExpPrototype$1; + redefine$3(global$b, 'RegExp', RegExpWrapper); + } - function centroid(extent) { - return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2]; - } + // https://tc39.es/ecma262/#sec-get-regexp-@@species + setSpecies('RegExp'); - function schedule(transition, transform, point) { - transition - .on("start.zoom", function() { gesture(this, arguments).start(); }) - .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); }) - .tween("zoom", function() { - var that = this, - args = arguments, - g = gesture(that, args), - e = extent.apply(that, args), - p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, - w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), - a = that.__zoom, - b = typeof transform === "function" ? transform.apply(that, args) : transform, - i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k)); - return function(t) { - if (t === 1) { t = b; } // Avoid rounding error on end. - else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); } - g.zoom(null, t); - }; - }); - } + function define (constructor, factory, prototype) { + constructor.prototype = factory.prototype = prototype; + prototype.constructor = constructor; + } + function extend$3(parent, definition) { + var prototype = Object.create(parent.prototype); - function gesture(that, args, clean) { - return (!clean && that.__zooming) || new Gesture(that, args); + for (var key in definition) { + prototype[key] = definition[key]; } - function Gesture(that, args) { - this.that = that; - this.args = args; - this.active = 0; - this.extent = extent.apply(that, args); - this.taps = 0; - } - - Gesture.prototype = { - start: function() { - if (++this.active === 1) { - this.that.__zooming = this; - this.emit("start"); - } - return this; - }, - zoom: function(key, transform) { - if (this.mouse && key !== "mouse") { this.mouse[1] = transform.invert(this.mouse[0]); } - if (this.touch0 && key !== "touch") { this.touch0[1] = transform.invert(this.touch0[0]); } - if (this.touch1 && key !== "touch") { this.touch1[1] = transform.invert(this.touch1[0]); } - this.that.__zoom = transform; - this.emit("zoom"); - return this; - }, - end: function() { - if (--this.active === 0) { - delete this.that.__zooming; - this.emit("end"); - } - return this; - }, - emit: function(type) { - customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]); - } - }; - - function wheeled() { - if (!filter.apply(this, arguments)) { return; } - var g = gesture(this, arguments), - t = this.__zoom, - k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), - p = mouse(this); + return prototype; + } - // If the mouse is in the same location as before, reuse it. - // If there were recent wheel events, reset the wheel idle timeout. - if (g.wheel) { - if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { - g.mouse[1] = t.invert(g.mouse[0] = p); - } - clearTimeout(g.wheel); - } + function Color() {} + var _darker = 0.7; - // If this wheel event won’t trigger a transform change, ignore it. - else if (t.k === k) { return; } + var _brighter = 1 / _darker; + var reI = "\\s*([+-]?\\d+)\\s*", + reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", + reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", + reHex = /^#([0-9a-f]{3,8})$/, + reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"), + reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"), + reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"), + reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"), + reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"), + reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$"); + var named = { + aliceblue: 0xf0f8ff, + antiquewhite: 0xfaebd7, + aqua: 0x00ffff, + aquamarine: 0x7fffd4, + azure: 0xf0ffff, + beige: 0xf5f5dc, + bisque: 0xffe4c4, + black: 0x000000, + blanchedalmond: 0xffebcd, + blue: 0x0000ff, + blueviolet: 0x8a2be2, + brown: 0xa52a2a, + burlywood: 0xdeb887, + cadetblue: 0x5f9ea0, + chartreuse: 0x7fff00, + chocolate: 0xd2691e, + coral: 0xff7f50, + cornflowerblue: 0x6495ed, + cornsilk: 0xfff8dc, + crimson: 0xdc143c, + cyan: 0x00ffff, + darkblue: 0x00008b, + darkcyan: 0x008b8b, + darkgoldenrod: 0xb8860b, + darkgray: 0xa9a9a9, + darkgreen: 0x006400, + darkgrey: 0xa9a9a9, + darkkhaki: 0xbdb76b, + darkmagenta: 0x8b008b, + darkolivegreen: 0x556b2f, + darkorange: 0xff8c00, + darkorchid: 0x9932cc, + darkred: 0x8b0000, + darksalmon: 0xe9967a, + darkseagreen: 0x8fbc8f, + darkslateblue: 0x483d8b, + darkslategray: 0x2f4f4f, + darkslategrey: 0x2f4f4f, + darkturquoise: 0x00ced1, + darkviolet: 0x9400d3, + deeppink: 0xff1493, + deepskyblue: 0x00bfff, + dimgray: 0x696969, + dimgrey: 0x696969, + dodgerblue: 0x1e90ff, + firebrick: 0xb22222, + floralwhite: 0xfffaf0, + forestgreen: 0x228b22, + fuchsia: 0xff00ff, + gainsboro: 0xdcdcdc, + ghostwhite: 0xf8f8ff, + gold: 0xffd700, + goldenrod: 0xdaa520, + gray: 0x808080, + green: 0x008000, + greenyellow: 0xadff2f, + grey: 0x808080, + honeydew: 0xf0fff0, + hotpink: 0xff69b4, + indianred: 0xcd5c5c, + indigo: 0x4b0082, + ivory: 0xfffff0, + khaki: 0xf0e68c, + lavender: 0xe6e6fa, + lavenderblush: 0xfff0f5, + lawngreen: 0x7cfc00, + lemonchiffon: 0xfffacd, + lightblue: 0xadd8e6, + lightcoral: 0xf08080, + lightcyan: 0xe0ffff, + lightgoldenrodyellow: 0xfafad2, + lightgray: 0xd3d3d3, + lightgreen: 0x90ee90, + lightgrey: 0xd3d3d3, + lightpink: 0xffb6c1, + lightsalmon: 0xffa07a, + lightseagreen: 0x20b2aa, + lightskyblue: 0x87cefa, + lightslategray: 0x778899, + lightslategrey: 0x778899, + lightsteelblue: 0xb0c4de, + lightyellow: 0xffffe0, + lime: 0x00ff00, + limegreen: 0x32cd32, + linen: 0xfaf0e6, + magenta: 0xff00ff, + maroon: 0x800000, + mediumaquamarine: 0x66cdaa, + mediumblue: 0x0000cd, + mediumorchid: 0xba55d3, + mediumpurple: 0x9370db, + mediumseagreen: 0x3cb371, + mediumslateblue: 0x7b68ee, + mediumspringgreen: 0x00fa9a, + mediumturquoise: 0x48d1cc, + mediumvioletred: 0xc71585, + midnightblue: 0x191970, + mintcream: 0xf5fffa, + mistyrose: 0xffe4e1, + moccasin: 0xffe4b5, + navajowhite: 0xffdead, + navy: 0x000080, + oldlace: 0xfdf5e6, + olive: 0x808000, + olivedrab: 0x6b8e23, + orange: 0xffa500, + orangered: 0xff4500, + orchid: 0xda70d6, + palegoldenrod: 0xeee8aa, + palegreen: 0x98fb98, + paleturquoise: 0xafeeee, + palevioletred: 0xdb7093, + papayawhip: 0xffefd5, + peachpuff: 0xffdab9, + peru: 0xcd853f, + pink: 0xffc0cb, + plum: 0xdda0dd, + powderblue: 0xb0e0e6, + purple: 0x800080, + rebeccapurple: 0x663399, + red: 0xff0000, + rosybrown: 0xbc8f8f, + royalblue: 0x4169e1, + saddlebrown: 0x8b4513, + salmon: 0xfa8072, + sandybrown: 0xf4a460, + seagreen: 0x2e8b57, + seashell: 0xfff5ee, + sienna: 0xa0522d, + silver: 0xc0c0c0, + skyblue: 0x87ceeb, + slateblue: 0x6a5acd, + slategray: 0x708090, + slategrey: 0x708090, + snow: 0xfffafa, + springgreen: 0x00ff7f, + steelblue: 0x4682b4, + tan: 0xd2b48c, + teal: 0x008080, + thistle: 0xd8bfd8, + tomato: 0xff6347, + turquoise: 0x40e0d0, + violet: 0xee82ee, + wheat: 0xf5deb3, + white: 0xffffff, + whitesmoke: 0xf5f5f5, + yellow: 0xffff00, + yellowgreen: 0x9acd32 + }; + define(Color, color, { + copy: function copy(channels) { + return Object.assign(new this.constructor(), this, channels); + }, + displayable: function displayable() { + return this.rgb().displayable(); + }, + hex: color_formatHex, + // Deprecated! Use color.formatHex. + formatHex: color_formatHex, + formatHsl: color_formatHsl, + formatRgb: color_formatRgb, + toString: color_formatRgb + }); - // Otherwise, capture the mouse point and location at the start. - else { - g.mouse = [p, t.invert(p)]; - interrupt(this); - g.start(); - } + function color_formatHex() { + return this.rgb().formatHex(); + } - noevent$1(); - g.wheel = setTimeout(wheelidled, wheelDelay); - g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent)); + function color_formatHsl() { + return hslConvert(this).formatHsl(); + } - function wheelidled() { - g.wheel = null; - g.end(); - } - } + function color_formatRgb() { + return this.rgb().formatRgb(); + } - function mousedowned() { - if (touchending || !filter.apply(this, arguments)) { return; } - var g = gesture(this, arguments, true), - v = select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), - p = mouse(this), - x0 = event.clientX, - y0 = event.clientY; + function color(format) { + var m, l; + format = (format + "").trim().toLowerCase(); + return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000 + : l === 3 ? new Rgb(m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, (m & 0xf) << 4 | m & 0xf, 1) // #f00 + : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000 + : l === 4 ? rgba(m >> 12 & 0xf | m >> 8 & 0xf0, m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, ((m & 0xf) << 4 | m & 0xf) / 0xff) // #f000 + : null // invalid hex + ) : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) + : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) + : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) + : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1) + : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%) + : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1) + : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins + : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) : null; + } - dragDisable(event.view); - nopropagation$1(); - g.mouse = [p, this.__zoom.invert(p)]; - interrupt(this); - g.start(); + function rgbn(n) { + return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1); + } - function mousemoved() { - noevent$1(); - if (!g.moved) { - var dx = event.clientX - x0, dy = event.clientY - y0; - g.moved = dx * dx + dy * dy > clickDistance2; - } - g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = mouse(g.that), g.mouse[1]), g.extent, translateExtent)); - } + function rgba(r, g, b, a) { + if (a <= 0) r = g = b = NaN; + return new Rgb(r, g, b, a); + } - function mouseupped() { - v.on("mousemove.zoom mouseup.zoom", null); - yesdrag(event.view, g.moved); - noevent$1(); - g.end(); - } - } + function rgbConvert(o) { + if (!(o instanceof Color)) o = color(o); + if (!o) return new Rgb(); + o = o.rgb(); + return new Rgb(o.r, o.g, o.b, o.opacity); + } + function rgb(r, g, b, opacity) { + return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); + } + function Rgb(r, g, b, opacity) { + this.r = +r; + this.g = +g; + this.b = +b; + this.opacity = +opacity; + } + define(Rgb, rgb, extend$3(Color, { + brighter: function brighter(k) { + k = k == null ? _brighter : Math.pow(_brighter, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + darker: function darker(k) { + k = k == null ? _darker : Math.pow(_darker, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + rgb: function rgb() { + return this; + }, + displayable: function displayable() { + return -0.5 <= this.r && this.r < 255.5 && -0.5 <= this.g && this.g < 255.5 && -0.5 <= this.b && this.b < 255.5 && 0 <= this.opacity && this.opacity <= 1; + }, + hex: rgb_formatHex, + // Deprecated! Use color.formatHex. + formatHex: rgb_formatHex, + formatRgb: rgb_formatRgb, + toString: rgb_formatRgb + })); - function dblclicked() { - if (!filter.apply(this, arguments)) { return; } - var t0 = this.__zoom, - p0 = mouse(this), - p1 = t0.invert(p0), - k1 = t0.k * (event.shiftKey ? 0.5 : 2), - t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent); + function rgb_formatHex() { + return "#" + hex$1(this.r) + hex$1(this.g) + hex$1(this.b); + } - noevent$1(); - if (duration > 0) { select(this).transition().duration(duration).call(schedule, t1, p0); } - else { select(this).call(zoom.transform, t1); } - } + function rgb_formatRgb() { + var a = this.opacity; + a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "rgb(" : "rgba(") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (a === 1 ? ")" : ", " + a + ")"); + } - function touchstarted() { - if (!filter.apply(this, arguments)) { return; } - var touches = event.touches, - n = touches.length, - g = gesture(this, arguments, event.changedTouches.length === n), - started, i, t, p; + function hex$1(value) { + value = Math.max(0, Math.min(255, Math.round(value) || 0)); + return (value < 16 ? "0" : "") + value.toString(16); + } - nopropagation$1(); - for (i = 0; i < n; ++i) { - t = touches[i], p = touch(this, touches, t.identifier); - p = [p, this.__zoom.invert(p), t.identifier]; - if (!g.touch0) { g.touch0 = p, started = true, g.taps = 1 + !!touchstarting; } - else if (!g.touch1 && g.touch0[2] !== p[2]) { g.touch1 = p, g.taps = 0; } - } + function hsla(h, s, l, a) { + if (a <= 0) h = s = l = NaN;else if (l <= 0 || l >= 1) h = s = NaN;else if (s <= 0) h = NaN; + return new Hsl(h, s, l, a); + } - if (touchstarting) { touchstarting = clearTimeout(touchstarting); } + function hslConvert(o) { + if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Color)) o = color(o); + if (!o) return new Hsl(); + if (o instanceof Hsl) return o; + o = o.rgb(); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + min = Math.min(r, g, b), + max = Math.max(r, g, b), + h = NaN, + s = max - min, + l = (max + min) / 2; - if (started) { - if (g.taps < 2) { touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay); } - interrupt(this); - g.start(); - } + if (s) { + if (r === max) h = (g - b) / s + (g < b) * 6;else if (g === max) h = (b - r) / s + 2;else h = (r - g) / s + 4; + s /= l < 0.5 ? max + min : 2 - max - min; + h *= 60; + } else { + s = l > 0 && l < 1 ? 0 : h; } - function touchmoved() { - if (!this.__zooming) { return; } - var g = gesture(this, arguments), - touches = event.changedTouches, - n = touches.length, i, t, p, l; - - noevent$1(); - if (touchstarting) { touchstarting = clearTimeout(touchstarting); } - g.taps = 0; - for (i = 0; i < n; ++i) { - t = touches[i], p = touch(this, touches, t.identifier); - if (g.touch0 && g.touch0[2] === t.identifier) { g.touch0[0] = p; } - else if (g.touch1 && g.touch1[2] === t.identifier) { g.touch1[0] = p; } - } - t = g.that.__zoom; - if (g.touch1) { - var p0 = g.touch0[0], l0 = g.touch0[1], - p1 = g.touch1[0], l1 = g.touch1[1], - dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, - dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; - t = scale(t, Math.sqrt(dp / dl)); - p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; - l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; - } - else if (g.touch0) { p = g.touch0[0], l = g.touch0[1]; } - else { return; } - g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent)); - } + return new Hsl(h, s, l, o.opacity); + } + function hsl(h, s, l, opacity) { + return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); + } - function touchended() { - if (!this.__zooming) { return; } - var g = gesture(this, arguments), - touches = event.changedTouches, - n = touches.length, i, t; + function Hsl(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; + } - nopropagation$1(); - if (touchending) { clearTimeout(touchending); } - touchending = setTimeout(function() { touchending = null; }, touchDelay); - for (i = 0; i < n; ++i) { - t = touches[i]; - if (g.touch0 && g.touch0[2] === t.identifier) { delete g.touch0; } - else if (g.touch1 && g.touch1[2] === t.identifier) { delete g.touch1; } - } - if (g.touch1 && !g.touch0) { g.touch0 = g.touch1, delete g.touch1; } - if (g.touch0) { g.touch0[1] = this.__zoom.invert(g.touch0[0]); } - else { - g.end(); - // If this was a dbltap, reroute to the (optional) dblclick.zoom handler. - if (g.taps === 2) { - var p = select(this).on("dblclick.zoom"); - if (p) { p.apply(this, arguments); } - } - } + define(Hsl, hsl, extend$3(Color, { + brighter: function brighter(k) { + k = k == null ? _brighter : Math.pow(_brighter, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + darker: function darker(k) { + k = k == null ? _darker : Math.pow(_darker, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function rgb() { + var h = this.h % 360 + (this.h < 0) * 360, + s = isNaN(h) || isNaN(this.s) ? 0 : this.s, + l = this.l, + m2 = l + (l < 0.5 ? l : 1 - l) * s, + m1 = 2 * l - m2; + return new Rgb(hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), hsl2rgb(h, m1, m2), hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity); + }, + displayable: function displayable() { + return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1; + }, + formatHsl: function formatHsl() { + var a = this.opacity; + a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "hsl(" : "hsla(") + (this.h || 0) + ", " + (this.s || 0) * 100 + "%, " + (this.l || 0) * 100 + "%" + (a === 1 ? ")" : ", " + a + ")"); } + })); + /* From FvD 13.37, CSS Color Module Level 3 */ - zoom.wheelDelta = function(_) { - return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$3(+_), zoom) : wheelDelta; - }; - - zoom.filter = function(_) { - return arguments.length ? (filter = typeof _ === "function" ? _ : constant$3(!!_), zoom) : filter; - }; + function hsl2rgb(h, m1, m2) { + return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255; + } - zoom.touchable = function(_) { - return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$3(!!_), zoom) : touchable; + var constant$1 = (function (x) { + return function () { + return x; }; + }); - zoom.extent = function(_) { - return arguments.length ? (extent = typeof _ === "function" ? _ : constant$3([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; + function linear$2(a, d) { + return function (t) { + return a + t * d; }; + } - zoom.scaleExtent = function(_) { - return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]]; + function exponential(a, b, y) { + return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function (t) { + return Math.pow(a + t * b, y); }; - - zoom.translateExtent = function(_) { - 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]]]; + } + function gamma(y) { + return (y = +y) === 1 ? nogamma : function (a, b) { + return b - a ? exponential(a, b, y) : constant$1(isNaN(a) ? b : a); }; + } + function nogamma(a, b) { + var d = b - a; + return d ? linear$2(a, d) : constant$1(isNaN(a) ? b : a); + } - zoom.constrain = function(_) { - return arguments.length ? (constrain = _, zoom) : constrain; - }; + var d3_interpolateRgb = (function rgbGamma(y) { + var color = gamma(y); - zoom.duration = function(_) { - return arguments.length ? (duration = +_, zoom) : duration; - }; + function rgb$1(start, end) { + var r = color((start = rgb(start)).r, (end = rgb(end)).r), + g = color(start.g, end.g), + b = color(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function (t) { + start.r = r(t); + start.g = g(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; + } - zoom.interpolate = function(_) { - return arguments.length ? (interpolate = _, zoom) : interpolate; - }; + rgb$1.gamma = rgbGamma; + return rgb$1; + })(1); - zoom.on = function() { - var value = listeners.on.apply(listeners, arguments); - return value === listeners ? zoom : value; - }; + function numberArray (a, b) { + if (!b) b = []; + var n = a ? Math.min(b.length, a.length) : 0, + c = b.slice(), + i; + return function (t) { + for (i = 0; i < n; ++i) { + c[i] = a[i] * (1 - t) + b[i] * t; + } - zoom.clickDistance = function(_) { - return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); + return c; }; - - return zoom; + } + function isNumberArray(x) { + return ArrayBuffer.isView(x) && !(x instanceof DataView); } - /* - Bypasses features of D3's default projection stream pipeline that are unnecessary: - * Antimeridian clipping - * Spherical rotation - * Resampling - */ - function geoRawMercator() { - var project = mercatorRaw; - var k = 512 / Math.PI; // scale - var x = 0; - var y = 0; // translate - var clipExtent = [[0, 0], [0, 0]]; - + function genericArray(a, b) { + var nb = b ? b.length : 0, + na = a ? Math.min(nb, a.length) : 0, + x = new Array(na), + c = new Array(nb), + i; - function projection(point) { - point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180); - return [point[0] * k + x, y - point[1] * k]; - } + for (i = 0; i < na; ++i) { + x[i] = interpolate$1(a[i], b[i]); + } + for (; i < nb; ++i) { + c[i] = b[i]; + } - projection.invert = function(point) { - point = project.invert((point[0] - x) / k, (y - point[1]) / k); - return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI]; - }; + return function (t) { + for (i = 0; i < na; ++i) { + c[i] = x[i](t); + } + return c; + }; + } - projection.scale = function(_) { - if (!arguments.length) { return k; } - k = +_; - return projection; - }; + function date (a, b) { + var d = new Date(); + return a = +a, b = +b, function (t) { + return d.setTime(a * (1 - t) + b * t), d; + }; + } + function d3_interpolateNumber (a, b) { + return a = +a, b = +b, function (t) { + return a * (1 - t) + b * t; + }; + } - projection.translate = function(_) { - if (!arguments.length) { return [x, y]; } - x = +_[0]; - y = +_[1]; - return projection; - }; + function object (a, b) { + var i = {}, + c = {}, + k; + if (a === null || _typeof(a) !== "object") a = {}; + if (b === null || _typeof(b) !== "object") b = {}; + for (k in b) { + if (k in a) { + i[k] = interpolate$1(a[k], b[k]); + } else { + c[k] = b[k]; + } + } - projection.clipExtent = function(_) { - if (!arguments.length) { return clipExtent; } - clipExtent = _; - return projection; - }; + return function (t) { + for (k in i) { + c[k] = i[k](t); + } + return c; + }; + } - projection.transform = function(obj) { - if (!arguments.length) { return identity$2.translate(x, y).scale(k); } - x = +obj.x; - y = +obj.y; - k = +obj.k; - return projection; - }; + var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, + reB = new RegExp(reA.source, "g"); + function zero(b) { + return function () { + return b; + }; + } - projection.stream = d3_geoTransform({ - point: function(x, y) { - var vec = projection([x, y]); - this.stream.point(vec[0], vec[1]); - } - }).stream; + function one(b) { + return function (t) { + return b(t) + ""; + }; + } + function interpolateString (a, b) { + var bi = reA.lastIndex = reB.lastIndex = 0, + // scan index for next number in b + am, + // current match in a + bm, + // current match in b + bs, + // string preceding current number in b, if any + i = -1, + // index in s + s = [], + // string constants and placeholders + q = []; // number interpolators + // Coerce inputs to strings. - return projection; - } + a = a + "", b = b + ""; // Interpolate pairs of numbers in a & b. - function geoOrthoNormalizedDotProduct(a, b, origin) { - if (geoVecEqual(origin, a) || geoVecEqual(origin, b)) { - return 1; // coincident points, treat as straight and try to remove + while ((am = reA.exec(a)) && (bm = reB.exec(b))) { + if ((bs = bm.index) > bi) { + // a string precedes the next number in b + bs = b.slice(bi, bs); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; } - return geoVecNormalizedDot(a, b, origin); - } - - function geoOrthoFilterDotProduct(dotp, epsilon, lowerThreshold, upperThreshold, allowStraightAngles) { - var val = Math.abs(dotp); - if (val < epsilon) { - return 0; // already orthogonal - } else if (allowStraightAngles && Math.abs(val-1) < epsilon) { - return 0; // straight angle, which is okay in this case - } else if (val < lowerThreshold || val > upperThreshold) { - return dotp; // can be adjusted + if ((am = am[0]) === (bm = bm[0])) { + // numbers in a & b match + if (s[i]) s[i] += bm; // coalesce with previous string + else s[++i] = bm; } else { - return null; // ignore vertex + // interpolate non-matching numbers + s[++i] = null; + q.push({ + i: i, + x: d3_interpolateNumber(am, bm) + }); } - } + bi = reB.lastIndex; + } // Add remains of b. - function geoOrthoCalcScore(points, isClosed, epsilon, threshold) { - var score = 0; - var first = isClosed ? 0 : 1; - var last = isClosed ? points.length : points.length - 1; - var coords = points.map(function(p) { return p.coord; }); - var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180); - var upperThreshold = Math.cos(threshold * Math.PI / 180); + if (bi < b.length) { + bs = b.slice(bi); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } // Special optimization for only a single match. + // Otherwise, interpolate each of the numbers and rejoin the string. - for (var i = first; i < last; i++) { - var a = coords[(i - 1 + coords.length) % coords.length]; - var origin = coords[i]; - var b = coords[(i + 1) % coords.length]; - var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon, lowerThreshold, upperThreshold); - if (dotp === null) { continue; } // ignore vertex - score = score + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1))); + return s.length < 2 ? q[0] ? one(q[0].x) : zero(b) : (b = q.length, function (t) { + for (var i = 0, o; i < b; ++i) { + s[(o = q[i]).i] = o.x(t); } - return score; + return s.join(""); + }); } - // returns the maximum angle less than `lessThan` between the actual corner and a 0° or 90° corner - function geoOrthoMaxOffsetAngle(coords, isClosed, lessThan) { - var max = -Infinity; - - var first = isClosed ? 0 : 1; - var last = isClosed ? coords.length : coords.length - 1; - - for (var i = first; i < last; i++) { - var a = coords[(i - 1 + coords.length) % coords.length]; - var origin = coords[i]; - var b = coords[(i + 1) % coords.length]; - var normalizedDotP = geoOrthoNormalizedDotProduct(a, b, origin); - - var angle = Math.acos(Math.abs(normalizedDotP)) * 180 / Math.PI; + function interpolate$1 (a, b) { + var t = _typeof(b), + c; - if (angle > 45) { angle = 90 - angle; } - - if (angle >= lessThan) { continue; } - - if (angle > max) { max = angle; } - } - - if (max === -Infinity) { return null; } - - return max; + return b == null || t === "boolean" ? constant$1(b) : (t === "number" ? d3_interpolateNumber : t === "string" ? (c = color(b)) ? (b = c, d3_interpolateRgb) : interpolateString : b instanceof color ? d3_interpolateRgb : b instanceof Date ? date : isNumberArray(b) ? numberArray : Array.isArray(b) ? genericArray : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object : d3_interpolateNumber)(a, b); } + function interpolateRound (a, b) { + return a = +a, b = +b, function (t) { + return Math.round(a * (1 - t) + b * t); + }; + } - // similar to geoOrthoCalcScore, but returns quickly if there is something to do - function geoOrthoCanOrthogonalize(coords, isClosed, epsilon, threshold, allowStraightAngles) { - var score = null; - var first = isClosed ? 0 : 1; - var last = isClosed ? coords.length : coords.length - 1; + var degrees = 180 / Math.PI; + var identity$3 = { + translateX: 0, + translateY: 0, + rotate: 0, + skewX: 0, + scaleX: 1, + scaleY: 1 + }; + function decompose (a, b, c, d, e, f) { + var scaleX, scaleY, skewX; + if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX; + if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX; + if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY; + if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX; + return { + translateX: e, + translateY: f, + rotate: Math.atan2(b, a) * degrees, + skewX: Math.atan(skewX) * degrees, + scaleX: scaleX, + scaleY: scaleY + }; + } - var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180); - var upperThreshold = Math.cos(threshold * Math.PI / 180); + var svgNode; + /* eslint-disable no-undef */ - for (var i = first; i < last; i++) { - var a = coords[(i - 1 + coords.length) % coords.length]; - var origin = coords[i]; - var b = coords[(i + 1) % coords.length]; + function parseCss(value) { + var m = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + ""); + return m.isIdentity ? identity$3 : decompose(m.a, m.b, m.c, m.d, m.e, m.f); + } + function parseSvg(value) { + if (value == null) return identity$3; + if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); + svgNode.setAttribute("transform", value); + if (!(value = svgNode.transform.baseVal.consolidate())) return identity$3; + value = value.matrix; + return decompose(value.a, value.b, value.c, value.d, value.e, value.f); + } + + function interpolateTransform(parse, pxComma, pxParen, degParen) { + function pop(s) { + return s.length ? s.pop() + " " : ""; + } - var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon, lowerThreshold, upperThreshold, allowStraightAngles); - if (dotp === null) { continue; } // ignore vertex - if (Math.abs(dotp) > 0) { return 1; } // something to do - score = 0; // already square + function translate(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push("translate(", null, pxComma, null, pxParen); + q.push({ + i: i - 4, + x: d3_interpolateNumber(xa, xb) + }, { + i: i - 2, + x: d3_interpolateNumber(ya, yb) + }); + } else if (xb || yb) { + s.push("translate(" + xb + pxComma + yb + pxParen); } + } - return score; - } + function rotate(a, b, s, q) { + if (a !== b) { + if (a - b > 180) b += 360;else if (b - a > 180) a += 360; // shortest path - // Returns true if a and b have the same elements at the same indices. - function utilArrayIdentical(a, b) { - // an array is always identical to itself - if (a === b) { return true; } + q.push({ + i: s.push(pop(s) + "rotate(", null, degParen) - 2, + x: d3_interpolateNumber(a, b) + }); + } else if (b) { + s.push(pop(s) + "rotate(" + b + degParen); + } + } - var i = a.length; - if (i !== b.length) { return false; } - while (i--) { - if (a[i] !== b[i]) { return false; } + function skewX(a, b, s, q) { + if (a !== b) { + q.push({ + i: s.push(pop(s) + "skewX(", null, degParen) - 2, + x: d3_interpolateNumber(a, b) + }); + } else if (b) { + s.push(pop(s) + "skewX(" + b + degParen); } - return true; + } + + function scale(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push(pop(s) + "scale(", null, ",", null, ")"); + q.push({ + i: i - 4, + x: d3_interpolateNumber(xa, xb) + }, { + i: i - 2, + x: d3_interpolateNumber(ya, yb) + }); + } else if (xb !== 1 || yb !== 1) { + s.push(pop(s) + "scale(" + xb + "," + yb + ")"); + } + } + + return function (a, b) { + var s = [], + // string constants and placeholders + q = []; // number interpolators + + a = parse(a), b = parse(b); + translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); + rotate(a.rotate, b.rotate, s, q); + skewX(a.skewX, b.skewX, s, q); + scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); + a = b = null; // gc + + return function (t) { + var i = -1, + n = q.length, + o; + + while (++i < n) { + s[(o = q[i]).i] = o.x(t); + } + + return s.join(""); + }; + }; } - // http://2ality.com/2015/01/es6-set-operations.html + var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); + var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); - // Difference (a \ b): create a set that contains those elements of set a that are not in set b. - // This operation is also sometimes called minus (-). - // var a = [1,2,3]; - // var b = [4,3,2]; - // utilArrayDifference(a, b) - // [1] - // utilArrayDifference(b, a) - // [4] - function utilArrayDifference(a, b) { - var other = new Set(b); - return Array.from(new Set(a)) - .filter(function(v) { return !other.has(v); }); + var epsilon2 = 1e-12; + + function cosh(x) { + return ((x = Math.exp(x)) + 1 / x) / 2; } - // Intersection (a ∩ b): create a set that contains those elements of set a that are also in set b. - // var a = [1,2,3]; - // var b = [4,3,2]; - // utilArrayIntersection(a, b) - // [2,3] - function utilArrayIntersection(a, b) { - var other = new Set(b); - return Array.from(new Set(a)) - .filter(function(v) { return other.has(v); }); + function sinh(x) { + return ((x = Math.exp(x)) - 1 / x) / 2; } - // Union (a ∪ b): create a set that contains the elements of both set a and set b. - // var a = [1,2,3]; - // var b = [4,3,2]; - // utilArrayUnion(a, b) - // [1,2,3,4] - function utilArrayUnion(a, b) { - var result = new Set(a); - b.forEach(function(v) { result.add(v); }); - return Array.from(result); + function tanh(x) { + return ((x = Math.exp(2 * x)) - 1) / (x + 1); } - // Returns an Array with all the duplicates removed - // var a = [1,1,2,3,3]; - // utilArrayUniq(a) - // [1,2,3] - function utilArrayUniq(a) { - return Array.from(new Set(a)); + var interpolateZoom = (function zoomRho(rho, rho2, rho4) { + // p0 = [ux0, uy0, w0] + // p1 = [ux1, uy1, w1] + function zoom(p0, p1) { + var ux0 = p0[0], + uy0 = p0[1], + w0 = p0[2], + ux1 = p1[0], + uy1 = p1[1], + w1 = p1[2], + dx = ux1 - ux0, + dy = uy1 - uy0, + d2 = dx * dx + dy * dy, + i, + S; // Special case for u0 ≅ u1. + + if (d2 < epsilon2) { + S = Math.log(w1 / w0) / rho; + + i = function i(t) { + return [ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(rho * t * S)]; + }; + } // General case. + else { + var d1 = Math.sqrt(d2), + b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), + b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), + r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), + r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); + S = (r1 - r0) / rho; + + i = function i(t) { + var s = t * S, + coshr0 = cosh(r0), + u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); + return [ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / cosh(rho * s + r0)]; + }; + } + + i.duration = S * 1000 * rho / Math.SQRT2; + return i; + } + + zoom.rho = function (_) { + var _1 = Math.max(1e-3, +_), + _2 = _1 * _1, + _4 = _2 * _2; + + return zoomRho(_1, _2, _4); + }; + + return zoom; + })(Math.SQRT2, 2, 4); + + function d3_quantize (interpolator, n) { + var samples = new Array(n); + + for (var i = 0; i < n; ++i) { + samples[i] = interpolator(i / (n - 1)); + } + + return samples; } + var $$t = _export; + var bind$4 = functionBind; - // Splits array into chunks of given chunk size - // var a = [1,2,3,4,5,6,7]; - // utilArrayChunk(a, 3); - // [[1,2,3],[4,5,6],[7]]; - function utilArrayChunk(a, chunkSize) { - if (!chunkSize || chunkSize < 0) { return [a.slice()]; } + // `Function.prototype.bind` method + // https://tc39.es/ecma262/#sec-function.prototype.bind + $$t({ target: 'Function', proto: true, forced: Function.bind !== bind$4 }, { + bind: bind$4 + }); - var result = new Array(Math.ceil(a.length / chunkSize)); - return Array.from(result, function(item, i) { - return a.slice(i * chunkSize, i * chunkSize + chunkSize); - }); + var frame = 0, + // is an animation frame pending? + timeout = 0, + // is a timeout pending? + interval = 0, + // are any timers active? + pokeDelay = 1000, + // how frequently we check for clock skew + taskHead, + taskTail, + clockLast = 0, + clockNow = 0, + clockSkew = 0, + clock = (typeof performance === "undefined" ? "undefined" : _typeof(performance)) === "object" && performance.now ? performance : Date, + setFrame = (typeof window === "undefined" ? "undefined" : _typeof(window)) === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function (f) { + setTimeout(f, 17); + }; + function now$1() { + return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); } + function clearNow() { + clockNow = 0; + } - // Flattens two level array into a single level - // var a = [[1,2,3],[4,5,6],[7]]; - // utilArrayFlatten(a); - // [1,2,3,4,5,6,7]; - function utilArrayFlatten(a) { - return a.reduce(function(acc, val) { - return acc.concat(val); - }, []); + function Timer() { + this._call = this._time = this._next = null; } + Timer.prototype = timer.prototype = { + constructor: Timer, + restart: function restart(callback, delay, time) { + if (typeof callback !== "function") throw new TypeError("callback is not a function"); + time = (time == null ? now$1() : +time) + (delay == null ? 0 : +delay); + if (!this._next && taskTail !== this) { + if (taskTail) taskTail._next = this;else taskHead = this; + taskTail = this; + } - // Groups the items of the Array according to the given key - // `key` can be passed as a property or as a key function - // - // var pets = [ - // { type: 'Dog', name: 'Spot' }, - // { type: 'Cat', name: 'Tiger' }, - // { type: 'Dog', name: 'Rover' }, - // { type: 'Cat', name: 'Leo' } - // ]; - // - // utilArrayGroupBy(pets, 'type') - // { - // 'Dog': [{type: 'Dog', name: 'Spot'}, {type: 'Dog', name: 'Rover'}], - // 'Cat': [{type: 'Cat', name: 'Tiger'}, {type: 'Cat', name: 'Leo'}] - // } - // - // utilArrayGroupBy(pets, function(item) { return item.name.length; }) - // { - // 3: [{type: 'Cat', name: 'Leo'}], - // 4: [{type: 'Dog', name: 'Spot'}], - // 5: [{type: 'Cat', name: 'Tiger'}, {type: 'Dog', name: 'Rover'}] - // } - function utilArrayGroupBy(a, key) { - return a.reduce(function(acc, item) { - var group = (typeof key === 'function') ? key(item) : item[key]; - (acc[group] = acc[group] || []).push(item); - return acc; - }, {}); + this._call = callback; + this._time = time; + sleep(); + }, + stop: function stop() { + if (this._call) { + this._call = null; + this._time = Infinity; + sleep(); + } + } + }; + function timer(callback, delay, time) { + var t = new Timer(); + t.restart(callback, delay, time); + return t; } + function timerFlush() { + now$1(); // Get the current time, if not already set. + ++frame; // Pretend we’ve set an alarm, if we haven’t already. - // Returns an Array with all the duplicates removed - // where uniqueness determined by the given key - // `key` can be passed as a property or as a key function - // - // var pets = [ - // { type: 'Dog', name: 'Spot' }, - // { type: 'Cat', name: 'Tiger' }, - // { type: 'Dog', name: 'Rover' }, - // { type: 'Cat', name: 'Leo' } - // ]; - // - // utilArrayUniqBy(pets, 'type') - // [ - // { type: 'Dog', name: 'Spot' }, - // { type: 'Cat', name: 'Tiger' } - // ] - // - // utilArrayUniqBy(pets, function(item) { return item.name.length; }) - // [ - // { type: 'Dog', name: 'Spot' }, - // { type: 'Cat', name: 'Tiger' }, - // { type: 'Cat', name: 'Leo' } - // } - function utilArrayUniqBy(a, key) { - var seen = new Set(); - return a.reduce(function(acc, item) { - var val = (typeof key === 'function') ? key(item) : item[key]; - if (val && !seen.has(val)) { - seen.add(val); - acc.push(item); - } - return acc; - }, []); + var t = taskHead, + e; + + while (t) { + if ((e = clockNow - t._time) >= 0) t._call.call(null, e); + t = t._next; + } + + --frame; } - var remove$1 = removeDiacritics; + function wake() { + clockNow = (clockLast = clock.now()) + clockSkew; + frame = timeout = 0; - var replacementList = [ - { - base: ' ', - chars: "\u00A0", - }, { - base: '0', - chars: "\u07C0", - }, { - base: 'A', - 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", - }, { - base: 'AA', - chars: "\uA732", - }, { - base: 'AE', - chars: "\u00C6\u01FC\u01E2", - }, { - base: 'AO', - chars: "\uA734", - }, { - base: 'AU', - chars: "\uA736", - }, { - base: 'AV', - chars: "\uA738\uA73A", - }, { - base: 'AY', - chars: "\uA73C", - }, { - base: 'B', - chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181", - }, { - base: 'C', - chars: "\u24b8\uff23\uA73E\u1E08\u0106\u0043\u0108\u010A\u010C\u00C7\u0187\u023B", - }, { - base: 'D', - chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779", - }, { - base: 'Dh', - chars: "\u00D0", - }, { - base: 'DZ', - chars: "\u01F1\u01C4", - }, { - base: 'Dz', - chars: "\u01F2\u01C5", - }, { - base: 'E', - 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", - }, { - base: 'F', - chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B", - }, { - base: 'G', - chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262", - }, { - base: 'H', - chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D", - }, { - base: 'I', - chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197", - }, { - base: 'J', - chars: "\u24BF\uFF2A\u0134\u0248\u0237", - }, { - base: 'K', - chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2", - }, { - base: 'L', - chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780", - }, { - base: 'LJ', - chars: "\u01C7", - }, { - base: 'Lj', - chars: "\u01C8", - }, { - base: 'M', - chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB", - }, { - base: 'N', - chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E", - }, { - base: 'NJ', - chars: "\u01CA", - }, { - base: 'Nj', - chars: "\u01CB", - }, { - base: 'O', - 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", - }, { - base: 'OE', - chars: "\u0152", - }, { - base: 'OI', - chars: "\u01A2", - }, { - base: 'OO', - chars: "\uA74E", - }, { - base: 'OU', - chars: "\u0222", - }, { - base: 'P', - chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754", - }, { - base: 'Q', - chars: "\u24C6\uFF31\uA756\uA758\u024A", - }, { - base: 'R', - chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782", - }, { - base: 'S', - chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784", - }, { - base: 'T', - chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786", - }, { - base: 'Th', - chars: "\u00DE", - }, { - base: 'TZ', - chars: "\uA728", - }, { - base: 'U', - 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", - }, { - base: 'V', - chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245", - }, { - base: 'VY', - chars: "\uA760", - }, { - base: 'W', - chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72", - }, { - base: 'X', - chars: "\u24CD\uFF38\u1E8A\u1E8C", - }, { - base: 'Y', - chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE", - }, { - base: 'Z', - chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762", - }, { - base: 'a', - 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", - }, { - base: 'aa', - chars: "\uA733", - }, { - base: 'ae', - chars: "\u00E6\u01FD\u01E3", - }, { - base: 'ao', - chars: "\uA735", - }, { - base: 'au', - chars: "\uA737", - }, { - base: 'av', - chars: "\uA739\uA73B", - }, { - base: 'ay', - chars: "\uA73D", - }, { - base: 'b', - chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182", - }, { - base: 'c', - chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184", - }, { - base: 'd', - chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA", - }, { - base: 'dh', - chars: "\u00F0", - }, { - base: 'dz', - chars: "\u01F3\u01C6", - }, { - base: 'e', - 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", - }, { - base: 'f', - chars: "\u24D5\uFF46\u1E1F\u0192", - }, { - base: 'ff', - chars: "\uFB00", - }, { - base: 'fi', - chars: "\uFB01", - }, { - base: 'fl', - chars: "\uFB02", - }, { - base: 'ffi', - chars: "\uFB03", - }, { - base: 'ffl', - chars: "\uFB04", - }, { - base: 'g', - chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79", - }, { - base: 'h', - chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265", - }, { - base: 'hv', - chars: "\u0195", - }, { - base: 'i', - chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131", - }, { - base: 'j', - chars: "\u24D9\uFF4A\u0135\u01F0\u0249", - }, { - base: 'k', - chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3", - }, { - base: 'l', - chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D", - }, { - base: 'lj', - chars: "\u01C9", - }, { - base: 'm', - chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F", - }, { - base: 'n', - chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509", - }, { - base: 'nj', - chars: "\u01CC", - }, { - base: 'o', - 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", - }, { - base: 'oe', - chars: "\u0153", - }, { - base: 'oi', - chars: "\u01A3", - }, { - base: 'oo', - chars: "\uA74F", - }, { - base: 'ou', - chars: "\u0223", - }, { - base: 'p', - chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1", - }, { - base: 'q', - chars: "\u24E0\uFF51\u024B\uA757\uA759", - }, { - base: 'r', - chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783", - }, { - base: 's', - chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282", - }, { - base: 'ss', - chars: "\xDF", - }, { - base: 't', - chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787", - }, { - base: 'th', - chars: "\u00FE", - }, { - base: 'tz', - chars: "\uA729", - }, { - base: 'u', - 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", - }, { - base: 'v', - chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C", - }, { - base: 'vy', - chars: "\uA761", - }, { - base: 'w', - chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73", - }, { - base: 'x', - chars: "\u24E7\uFF58\u1E8B\u1E8D", - }, { - base: 'y', - chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF", - }, { - base: 'z', - chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763", + try { + timerFlush(); + } finally { + frame = 0; + nap(); + clockNow = 0; } - ]; + } - var diacriticsMap = {}; - for (var i$1 = 0; i$1 < replacementList.length; i$1 += 1) { - var chars = replacementList[i$1].chars; - for (var j = 0; j < chars.length; j += 1) { - diacriticsMap[chars[j]] = replacementList[i$1].base; + function poke() { + var now = clock.now(), + delay = now - clockLast; + if (delay > pokeDelay) clockSkew -= delay, clockLast = now; + } + + function nap() { + var t0, + t1 = taskHead, + t2, + time = Infinity; + + while (t1) { + if (t1._call) { + if (time > t1._time) time = t1._time; + t0 = t1, t1 = t1._next; + } else { + t2 = t1._next, t1._next = null; + t1 = t0 ? t0._next = t2 : taskHead = t2; + } } + + taskTail = t0; + sleep(time); } - function removeDiacritics(str) { - return str.replace(/[^\u0000-\u007e]/g, function(c) { - return diacriticsMap[c] || c; + function sleep(time) { + if (frame) return; // Soonest alarm already set, or will be. + + if (timeout) timeout = clearTimeout(timeout); + var delay = time - clockNow; // Strictly less than if we recomputed clockNow. + + if (delay > 24) { + if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew); + if (interval) interval = clearInterval(interval); + } else { + if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay); + frame = 1, setFrame(wake); + } + } + + function d3_timeout (callback, delay, time) { + var t = new Timer(); + delay = delay == null ? 0 : +delay; + t.restart(function (elapsed) { + t.stop(); + callback(elapsed + delay); + }, delay, time); + return t; + } + + var emptyOn = dispatch$8("start", "end", "cancel", "interrupt"); + var emptyTween = []; + var CREATED = 0; + var SCHEDULED = 1; + var STARTING = 2; + var STARTED = 3; + var RUNNING = 4; + var ENDING = 5; + var ENDED = 6; + function schedule (node, name, id, index, group, timing) { + var schedules = node.__transition; + if (!schedules) node.__transition = {};else if (id in schedules) return; + create$2(node, id, { + name: name, + index: index, + // For context during callback. + group: group, + // For context during callback. + on: emptyOn, + tween: emptyTween, + time: timing.time, + delay: timing.delay, + duration: timing.duration, + ease: timing.ease, + timer: null, + state: CREATED }); } + function init(node, id) { + var schedule = get$1(node, id); + if (schedule.state > CREATED) throw new Error("too late; already scheduled"); + return schedule; + } + function set(node, id) { + var schedule = get$1(node, id); + if (schedule.state > STARTED) throw new Error("too late; already running"); + return schedule; + } + function get$1(node, id) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found"); + return schedule; + } - var replacementList_1 = replacementList; - var diacriticsMap_1 = diacriticsMap; + function create$2(node, id, self) { + var schedules = node.__transition, + tween; // Initialize the self timer when the transition is created. + // Note the actual delay is not known until the first callback! - var diacritics = { - remove: remove$1, - replacementList: replacementList_1, - diacriticsMap: diacriticsMap_1 - }; + schedules[id] = self; + self.timer = timer(schedule, 0, self.time); - var isArabic_1 = createCommonjsModule(function (module, exports) { - Object.defineProperty(exports, "__esModule", { value: true }); - var arabicBlocks = [ - [0x0600, 0x06FF], - [0x0750, 0x077F], - [0x08A0, 0x08FF], - [0xFB50, 0xFDFF], - [0xFE70, 0xFEFF], - [0x10E60, 0x10E7F], - [0x1EC70, 0x1ECBF], - [0x1EE00, 0x1EEFF] // Mathematical Alphabetic symbols https://www.unicode.org/charts/PDF/U1EE00.pdf - ]; - function isArabic(char) { - if (char.length > 1) { - // allow the newer chars? - throw new Error('isArabic works on only one-character strings'); - } - var code = char.charCodeAt(0); - for (var i = 0; i < arabicBlocks.length; i++) { - var block = arabicBlocks[i]; - if (code >= block[0] && code <= block[1]) { - return true; - } + function schedule(elapsed) { + self.state = SCHEDULED; + self.timer.restart(start, self.delay, self.time); // If the elapsed delay is less than our first sleep, start immediately. + + if (self.delay <= elapsed) start(elapsed - self.delay); + } + + function start(elapsed) { + var i, j, n, o; // If the state is not SCHEDULED, then we previously errored on start. + + if (self.state !== SCHEDULED) return stop(); + + for (i in schedules) { + o = schedules[i]; + if (o.name !== self.name) continue; // While this element already has a starting transition during this frame, + // defer starting an interrupting transition until that transition has a + // chance to tick (and possibly end); see d3/d3-transition#54! + + if (o.state === STARTED) return d3_timeout(start); // Interrupt the active transition, if any. + + if (o.state === RUNNING) { + o.state = ENDED; + o.timer.stop(); + o.on.call("interrupt", node, node.__data__, o.index, o.group); + delete schedules[i]; + } // Cancel any pre-empted transitions. + else if (+i < id) { + o.state = ENDED; + o.timer.stop(); + o.on.call("cancel", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + } // Defer the first tick to end of the current frame; see d3/d3#1576. + // Note the transition may be canceled after start and before the first tick! + // Note this must be scheduled before the start event; see d3/d3-transition#16! + // Assuming this is successful, subsequent callbacks go straight to tick. + + + d3_timeout(function () { + if (self.state === STARTED) { + self.state = RUNNING; + self.timer.restart(tick, self.delay, self.time); + tick(elapsed); + } + }); // Dispatch the start event. + // Note this must be done before the tween are initialized. + + self.state = STARTING; + self.on.call("start", node, node.__data__, self.index, self.group); + if (self.state !== STARTING) return; // interrupted + + self.state = STARTED; // Initialize the tween, deleting null tween. + + tween = new Array(n = self.tween.length); + + for (i = 0, j = -1; i < n; ++i) { + if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) { + tween[++j] = o; + } } - return false; + + tween.length = j + 1; + } + + function tick(elapsed) { + var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1), + i = -1, + n = tween.length; + + while (++i < n) { + tween[i].call(node, t); + } // Dispatch the end event. + + + if (self.state === ENDING) { + self.on.call("end", node, node.__data__, self.index, self.group); + stop(); + } + } + + function stop() { + self.state = ENDED; + self.timer.stop(); + delete schedules[id]; + + for (var i in schedules) { + return; + } // eslint-disable-line no-unused-vars + + + delete node.__transition; + } } - exports.isArabic = isArabic; - function isMath(char) { - if (char.length > 2) { - // allow the newer chars? - throw new Error('isMath works on only one-character strings'); + + function interrupt (node, name) { + var schedules = node.__transition, + schedule, + active, + empty = true, + i; + if (!schedules) return; + name = name == null ? null : name + ""; + + for (i in schedules) { + if ((schedule = schedules[i]).name !== name) { + empty = false; + continue; } - var code = char.charCodeAt(0); - return ((code >= 0x660 && code <= 0x66C) || (code >= 0x6F0 && code <= 0x6F9)); + + active = schedule.state > STARTING && schedule.state < ENDING; + schedule.state = ENDED; + schedule.timer.stop(); + schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group); + delete schedules[i]; + } + + if (empty) delete node.__transition; } - exports.isMath = isMath; - }); - var unicodeArabic = createCommonjsModule(function (module, exports) { - Object.defineProperty(exports, "__esModule", { value: true }); - var arabicReference = { - "alef": { - "normal": [ - "\u0627" - ], - "madda_above": { - "normal": [ - "\u0627\u0653", - "\u0622" - ], - "isolated": "\uFE81", - "final": "\uFE82" - }, - "hamza_above": { - "normal": [ - "\u0627\u0654", - "\u0623" - ], - "isolated": "\uFE83", - "final": "\uFE84" - }, - "hamza_below": { - "normal": [ - "\u0627\u0655", - "\u0625" - ], - "isolated": "\uFE87", - "final": "\uFE88" - }, - "wasla": { - "normal": "\u0671", - "isolated": "\uFB50", - "final": "\uFB51" - }, - "wavy_hamza_above": [ - "\u0672" - ], - "wavy_hamza_below": [ - "\u0627\u065F", - "\u0673" - ], - "high_hamza": [ - "\u0675", - "\u0627\u0674" - ], - "indic_two_above": [ - "\u0773" - ], - "indic_three_above": [ - "\u0774" - ], - "fathatan": { - "normal": [ - "\u0627\u064B" - ], - "final": "\uFD3C", - "isolated": "\uFD3D" - }, - "isolated": "\uFE8D", - "final": "\uFE8E" - }, - "beh": { - "normal": [ - "\u0628" - ], - "dotless": [ - "\u066E" - ], - "three_dots_horizontally_below": [ - "\u0750" - ], - "dot_below_three_dots_above": [ - "\u0751" - ], - "three_dots_pointing_upwards_below": [ - "\u0752" - ], - "three_dots_pointing_upwards_below_two_dots_above": [ - "\u0753" - ], - "two_dots_below_dot_above": [ - "\u0754" - ], - "inverted_small_v_below": [ - "\u0755" - ], - "small_v": [ - "\u0756" - ], - "small_v_below": [ - "\u08A0" - ], - "hamza_above": [ - "\u08A1" - ], - "small_meem_above": [ - "\u08B6" - ], - "isolated": "\uFE8F", - "final": "\uFE90", - "initial": "\uFE91", - "medial": "\uFE92" - }, - "teh marbuta": { - "normal": [ - "\u0629" - ], - "isolated": "\uFE93", - "final": "\uFE94" - }, - "teh": { - "normal": [ - "\u062A" - ], - "ring": [ - "\u067C" - ], - "three_dots_above_downwards": [ - "\u067D" - ], - "small_teh_above": [ - "\u08B8" - ], - "isolated": "\uFE95", - "final": "\uFE96", - "initial": "\uFE97", - "medial": "\uFE98" - }, - "theh": { - "normal": [ - "\u062B" - ], - "isolated": "\uFE99", - "final": "\uFE9A", - "initial": "\uFE9B", - "medial": "\uFE9C" - }, - "jeem": { - "normal": [ - "\u062C" - ], - "two_dots_above": [ - "\u08A2" - ], - "isolated": "\uFE9D", - "final": "\uFE9E", - "initial": "\uFE9F", - "medial": "\uFEA0" - }, - "hah": { - "normal": [ - "\u062D" - ], - "hamza_above": [ - "\u0681" - ], - "two_dots_vertical_above": [ - "\u0682" - ], - "three_dots_above": [ - "\u0685" - ], - "two_dots_above": [ - "\u0757" - ], - "three_dots_pointing_upwards_below": [ - "\u0758" - ], - "small_tah_below": [ - "\u076E" - ], - "small_tah_two_dots": [ - "\u076F" - ], - "small_tah_above": [ - "\u0772" - ], - "indic_four_below": [ - "\u077C" - ], - "isolated": "\uFEA1", - "final": "\uFEA2", - "initial": "\uFEA3", - "medial": "\uFEA4" - }, - "khah": { - "normal": [ - "\u062E" - ], - "isolated": "\uFEA5", - "final": "\uFEA6", - "initial": "\uFEA7", - "medial": "\uFEA8" - }, - "dal": { - "normal": [ - "\u062F" - ], - "ring": [ - "\u0689" - ], - "dot_below": [ - "\u068A" - ], - "dot_below_small_tah": [ - "\u068B" - ], - "three_dots_above_downwards": [ - "\u068F" - ], - "four_dots_above": [ - "\u0690" - ], - "inverted_v": [ - "\u06EE" - ], - "two_dots_vertically_below_small_tah": [ - "\u0759" - ], - "inverted_small_v_below": [ - "\u075A" - ], - "three_dots_below": [ - "\u08AE" - ], - "isolated": "\uFEA9", - "final": "\uFEAA" - }, - "thal": { - "normal": [ - "\u0630" - ], - "isolated": "\uFEAB", - "final": "\uFEAC" - }, - "reh": { - "normal": [ - "\u0631" - ], - "small_v": [ - "\u0692" - ], - "ring": [ - "\u0693" - ], - "dot_below": [ - "\u0694" - ], - "small_v_below": [ - "\u0695" - ], - "dot_below_dot_above": [ - "\u0696" - ], - "two_dots_above": [ - "\u0697" - ], - "four_dots_above": [ - "\u0699" - ], - "inverted_v": [ - "\u06EF" - ], - "stroke": [ - "\u075B" - ], - "two_dots_vertically_above": [ - "\u076B" - ], - "hamza_above": [ - "\u076C" - ], - "small_tah_two_dots": [ - "\u0771" - ], - "loop": [ - "\u08AA" - ], - "small_noon_above": [ - "\u08B9" - ], - "isolated": "\uFEAD", - "final": "\uFEAE" - }, - "zain": { - "normal": [ - "\u0632" - ], - "inverted_v_above": [ - "\u08B2" - ], - "isolated": "\uFEAF", - "final": "\uFEB0" - }, - "seen": { - "normal": [ - "\u0633" - ], - "dot_below_dot_above": [ - "\u069A" - ], - "three_dots_below": [ - "\u069B" - ], - "three_dots_below_three_dots_above": [ - "\u069C" - ], - "four_dots_above": [ - "\u075C" - ], - "two_dots_vertically_above": [ - "\u076D" - ], - "small_tah_two_dots": [ - "\u0770" - ], - "indic_four_above": [ - "\u077D" - ], - "inverted_v": [ - "\u077E" - ], - "isolated": "\uFEB1", - "final": "\uFEB2", - "initial": "\uFEB3", - "medial": "\uFEB4" - }, - "sheen": { - "normal": [ - "\u0634" - ], - "dot_below": [ - "\u06FA" - ], - "isolated": "\uFEB5", - "final": "\uFEB6", - "initial": "\uFEB7", - "medial": "\uFEB8" - }, - "sad": { - "normal": [ - "\u0635" - ], - "two_dots_below": [ - "\u069D" - ], - "three_dots_above": [ - "\u069E" - ], - "three_dots_below": [ - "\u08AF" - ], - "isolated": "\uFEB9", - "final": "\uFEBA", - "initial": "\uFEBB", - "medial": "\uFEBC" - }, - "dad": { - "normal": [ - "\u0636" - ], - "dot_below": [ - "\u06FB" - ], - "isolated": "\uFEBD", - "final": "\uFEBE", - "initial": "\uFEBF", - "medial": "\uFEC0" - }, - "tah": { - "normal": [ - "\u0637" - ], - "three_dots_above": [ - "\u069F" - ], - "two_dots_above": [ - "\u08A3" - ], - "isolated": "\uFEC1", - "final": "\uFEC2", - "initial": "\uFEC3", - "medial": "\uFEC4" - }, - "zah": { - "normal": [ - "\u0638" - ], - "isolated": "\uFEC5", - "final": "\uFEC6", - "initial": "\uFEC7", - "medial": "\uFEC8" - }, - "ain": { - "normal": [ - "\u0639" - ], - "three_dots_above": [ - "\u06A0" - ], - "two_dots_above": [ - "\u075D" - ], - "three_dots_pointing_downwards_above": [ - "\u075E" - ], - "two_dots_vertically_above": [ - "\u075F" - ], - "three_dots_below": [ - "\u08B3" - ], - "isolated": "\uFEC9", - "final": "\uFECA", - "initial": "\uFECB", - "medial": "\uFECC" - }, - "ghain": { - "normal": [ - "\u063A" - ], - "dot_below": [ - "\u06FC" - ], - "isolated": "\uFECD", - "final": "\uFECE", - "initial": "\uFECF", - "medial": "\uFED0" - }, - "feh": { - "normal": [ - "\u0641" - ], - "dotless": [ - "\u06A1" - ], - "dot_moved_below": [ - "\u06A2" - ], - "dot_below": [ - "\u06A3" - ], - "three_dots_below": [ - "\u06A5" - ], - "two_dots_below": [ - "\u0760" - ], - "three_dots_pointing_upwards_below": [ - "\u0761" - ], - "dot_below_three_dots_above": [ - "\u08A4" - ], - "isolated": "\uFED1", - "final": "\uFED2", - "initial": "\uFED3", - "medial": "\uFED4" - }, - "qaf": { - "normal": [ - "\u0642" - ], - "dotless": [ - "\u066F" - ], - "dot_above": [ - "\u06A7" - ], - "three_dots_above": [ - "\u06A8" - ], - "dot_below": [ - "\u08A5" - ], - "isolated": "\uFED5", - "final": "\uFED6", - "initial": "\uFED7", - "medial": "\uFED8" - }, - "kaf": { - "normal": [ - "\u0643" - ], - "swash": [ - "\u06AA" - ], - "ring": [ - "\u06AB" - ], - "dot_above": [ - "\u06AC" - ], - "three_dots_below": [ - "\u06AE" - ], - "two_dots_above": [ - "\u077F" - ], - "dot_below": [ - "\u08B4" - ], - "isolated": "\uFED9", - "final": "\uFEDA", - "initial": "\uFEDB", - "medial": "\uFEDC" - }, - "lam": { - "normal": [ - "\u0644" - ], - "small_v": [ - "\u06B5" - ], - "dot_above": [ - "\u06B6" - ], - "three_dots_above": [ - "\u06B7" - ], - "three_dots_below": [ - "\u06B8" - ], - "bar": [ - "\u076A" - ], - "double_bar": [ - "\u08A6" - ], - "isolated": "\uFEDD", - "final": "\uFEDE", - "initial": "\uFEDF", - "medial": "\uFEE0" - }, - "meem": { - "normal": [ - "\u0645" - ], - "dot_above": [ - "\u0765" - ], - "dot_below": [ - "\u0766" - ], - "three_dots_above": [ - "\u08A7" - ], - "isolated": "\uFEE1", - "final": "\uFEE2", - "initial": "\uFEE3", - "medial": "\uFEE4" - }, - "noon": { - "normal": [ - "\u0646" - ], - "dot_below": [ - "\u06B9" - ], - "ring": [ - "\u06BC" - ], - "three_dots_above": [ - "\u06BD" - ], - "two_dots_below": [ - "\u0767" - ], - "small_tah": [ - "\u0768" - ], - "small_v": [ - "\u0769" - ], - "isolated": "\uFEE5", - "final": "\uFEE6", - "initial": "\uFEE7", - "medial": "\uFEE8" - }, - "heh": { - "normal": [ - "\u0647" - ], - "isolated": "\uFEE9", - "final": "\uFEEA", - "initial": "\uFEEB", - "medial": "\uFEEC" - }, - "waw": { - "normal": [ - "\u0648" - ], - "hamza_above": { - "normal": [ - "\u0624", - "\u0648\u0654" - ], - "isolated": "\uFE85", - "final": "\uFE86" - }, - "high_hamza": [ - "\u0676", - "\u0648\u0674" - ], - "ring": [ - "\u06C4" - ], - "two_dots_above": [ - "\u06CA" - ], - "dot_above": [ - "\u06CF" - ], - "indic_two_above": [ - "\u0778" - ], - "indic_three_above": [ - "\u0779" - ], - "dot_within": [ - "\u08AB" - ], - "isolated": "\uFEED", - "final": "\uFEEE" - }, - "alef_maksura": { - "normal": [ - "\u0649" - ], - "hamza_above": [ - "\u0626", - "\u064A\u0654" - ], - "initial": "\uFBE8", - "medial": "\uFBE9", - "isolated": "\uFEEF", - "final": "\uFEF0" - }, - "yeh": { - "normal": [ - "\u064A" - ], - "hamza_above": { - "normal": [ - "\u0626", - "\u0649\u0654" - ], - "isolated": "\uFE89", - "final": "\uFE8A", - "initial": "\uFE8B", - "medial": "\uFE8C" - }, - "two_dots_below_hamza_above": [ - "\u08A8" - ], - "high_hamza": [ - "\u0678", - "\u064A\u0674" - ], - "tail": [ - "\u06CD" - ], - "small_v": [ - "\u06CE" - ], - "three_dots_below": [ - "\u06D1" - ], - "two_dots_below_dot_above": [ - "\u08A9" - ], - "two_dots_below_small_noon_above": [ - "\u08BA" - ], - "isolated": "\uFEF1", - "final": "\uFEF2", - "initial": "\uFEF3", - "medial": "\uFEF4" - }, - "tteh": { - "normal": [ - "\u0679" - ], - "isolated": "\uFB66", - "final": "\uFB67", - "initial": "\uFB68", - "medial": "\uFB69" - }, - "tteheh": { - "normal": [ - "\u067A" - ], - "isolated": "\uFB5E", - "final": "\uFB5F", - "initial": "\uFB60", - "medial": "\uFB61" - }, - "beeh": { - "normal": [ - "\u067B" - ], - "isolated": "\uFB52", - "final": "\uFB53", - "initial": "\uFB54", - "medial": "\uFB55" - }, - "peh": { - "normal": [ - "\u067E" - ], - "small_meem_above": [ - "\u08B7" - ], - "isolated": "\uFB56", - "final": "\uFB57", - "initial": "\uFB58", - "medial": "\uFB59" - }, - "teheh": { - "normal": [ - "\u067F" - ], - "isolated": "\uFB62", - "final": "\uFB63", - "initial": "\uFB64", - "medial": "\uFB65" - }, - "beheh": { - "normal": [ - "\u0680" - ], - "isolated": "\uFB5A", - "final": "\uFB5B", - "initial": "\uFB5C", - "medial": "\uFB5D" - }, - "nyeh": { - "normal": [ - "\u0683" - ], - "isolated": "\uFB76", - "final": "\uFB77", - "initial": "\uFB78", - "medial": "\uFB79" - }, - "dyeh": { - "normal": [ - "\u0684" - ], - "isolated": "\uFB72", - "final": "\uFB73", - "initial": "\uFB74", - "medial": "\uFB75" - }, - "tcheh": { - "normal": [ - "\u0686" - ], - "dot_above": [ - "\u06BF" - ], - "isolated": "\uFB7A", - "final": "\uFB7B", - "initial": "\uFB7C", - "medial": "\uFB7D" - }, - "tcheheh": { - "normal": [ - "\u0687" - ], - "isolated": "\uFB7E", - "final": "\uFB7F", - "initial": "\uFB80", - "medial": "\uFB81" - }, - "ddal": { - "normal": [ - "\u0688" - ], - "isolated": "\uFB88", - "final": "\uFB89" - }, - "dahal": { - "normal": [ - "\u068C" - ], - "isolated": "\uFB84", - "final": "\uFB85" - }, - "ddahal": { - "normal": [ - "\u068D" - ], - "isolated": "\uFB82", - "final": "\uFB83" - }, - "dul": { - "normal": [ - "\u068F", - "\u068E" - ], - "isolated": "\uFB86", - "final": "\uFB87" - }, - "rreh": { - "normal": [ - "\u0691" - ], - "isolated": "\uFB8C", - "final": "\uFB8D" - }, - "jeh": { - "normal": [ - "\u0698" - ], - "isolated": "\uFB8A", - "final": "\uFB8B" - }, - "veh": { - "normal": [ - "\u06A4" - ], - "isolated": "\uFB6A", - "final": "\uFB6B", - "initial": "\uFB6C", - "medial": "\uFB6D" - }, - "peheh": { - "normal": [ - "\u06A6" - ], - "isolated": "\uFB6E", - "final": "\uFB6F", - "initial": "\uFB70", - "medial": "\uFB71" - }, - "keheh": { - "normal": [ - "\u06A9" - ], - "dot_above": [ - "\u0762" - ], - "three_dots_above": [ - "\u0763" - ], - "three_dots_pointing_upwards_below": [ - "\u0764" - ], - "isolated": "\uFB8E", - "final": "\uFB8F", - "initial": "\uFB90", - "medial": "\uFB91" - }, - "ng": { - "normal": [ - "\u06AD" - ], - "isolated": "\uFBD3", - "final": "\uFBD4", - "initial": "\uFBD5", - "medial": "\uFBD6" - }, - "gaf": { - "normal": [ - "\u06AF" - ], - "ring": [ - "\u06B0" - ], - "two_dots_below": [ - "\u06B2" - ], - "three_dots_above": [ - "\u06B4" - ], - "inverted_stroke": [ - "\u08B0" - ], - "isolated": "\uFB92", - "final": "\uFB93", - "initial": "\uFB94", - "medial": "\uFB95" - }, - "ngoeh": { - "normal": [ - "\u06B1" - ], - "isolated": "\uFB9A", - "final": "\uFB9B", - "initial": "\uFB9C", - "medial": "\uFB9D" - }, - "gueh": { - "normal": [ - "\u06B3" - ], - "isolated": "\uFB96", - "final": "\uFB97", - "initial": "\uFB98", - "medial": "\uFB99" - }, - "noon ghunna": { - "normal": [ - "\u06BA" - ], - "isolated": "\uFB9E", - "final": "\uFB9F" - }, - "rnoon": { - "normal": [ - "\u06BB" - ], - "isolated": "\uFBA0", - "final": "\uFBA1", - "initial": "\uFBA2", - "medial": "\uFBA3" - }, - "heh doachashmee": { - "normal": [ - "\u06BE" - ], - "isolated": "\uFBAA", - "final": "\uFBAB", - "initial": "\uFBAC", - "medial": "\uFBAD" - }, - "heh goal": { - "normal": [ - "\u06C1" - ], - "hamza_above": [ - "\u06C1\u0654", - "\u06C2" - ], - "isolated": "\uFBA6", - "final": "\uFBA7", - "initial": "\uFBA8", - "medial": "\uFBA9" - }, - "teh marbuta goal": { - "normal": [ - "\u06C3" - ] - }, - "kirghiz oe": { - "normal": [ - "\u06C5" - ], - "isolated": "\uFBE0", - "final": "\uFBE1" - }, - "oe": { - "normal": [ - "\u06C6" - ], - "isolated": "\uFBD9", - "final": "\uFBDA" - }, - "u": { - "normal": [ - "\u06C7" - ], - "hamza_above": { - "normal": [ - "\u0677", - "\u06C7\u0674" - ], - "isolated": "\uFBDD" - }, - "isolated": "\uFBD7", - "final": "\uFBD8" - }, - "yu": { - "normal": [ - "\u06C8" - ], - "isolated": "\uFBDB", - "final": "\uFBDC" - }, - "kirghiz yu": { - "normal": [ - "\u06C9" - ], - "isolated": "\uFBE2", - "final": "\uFBE3" - }, - "ve": { - "normal": [ - "\u06CB" - ], - "isolated": "\uFBDE", - "final": "\uFBDF" - }, - "farsi yeh": { - "normal": [ - "\u06CC" - ], - "indic_two_above": [ - "\u0775" - ], - "indic_three_above": [ - "\u0776" - ], - "indic_four_above": [ - "\u0777" - ], - "isolated": "\uFBFC", - "final": "\uFBFD", - "initial": "\uFBFE", - "medial": "\uFBFF" - }, - "e": { - "normal": [ - "\u06D0" - ], - "isolated": "\uFBE4", - "final": "\uFBE5", - "initial": "\uFBE6", - "medial": "\uFBE7" - }, - "yeh barree": { - "normal": [ - "\u06D2" - ], - "hamza_above": { - "normal": [ - "\u06D2\u0654", - "\u06D3" - ], - "isolated": "\uFBB0", - "final": "\uFBB1" - }, - "indic_two_above": [ - "\u077A" - ], - "indic_three_above": [ - "\u077B" - ], - "isolated": "\uFBAE", - "final": "\uFBAF" - }, - "ae": { - "normal": [ - "\u06D5" - ], - "isolated": "\u06D5", - "final": "\uFEEA", - "yeh_above": { - "normal": [ - "\u06C0", - "\u06D5\u0654" - ], - "isolated": "\uFBA4", - "final": "\uFBA5" - } - }, - "rohingya yeh": { - "normal": [ - "\u08AC" - ] - }, - "low alef": { - "normal": [ - "\u08AD" - ] - }, - "straight waw": { - "normal": [ - "\u08B1" - ] - }, - "african feh": { - "normal": [ - "\u08BB" - ] - }, - "african qaf": { - "normal": [ - "\u08BC" - ] - }, - "african noon": { - "normal": [ - "\u08BD" - ] - } - }; - exports.default = arabicReference; - }); - - var unicodeLigatures = createCommonjsModule(function (module, exports) { - Object.defineProperty(exports, "__esModule", { value: true }); - var ligatureReference = { - "\u0626\u0627": { - "isolated": "\uFBEA", - "final": "\uFBEB" - }, - "\u0626\u06D5": { - "isolated": "\uFBEC", - "final": "\uFBED" - }, - "\u0626\u0648": { - "isolated": "\uFBEE", - "final": "\uFBEF" - }, - "\u0626\u06C7": { - "isolated": "\uFBF0", - "final": "\uFBF1" - }, - "\u0626\u06C6": { - "isolated": "\uFBF2", - "final": "\uFBF3" - }, - "\u0626\u06C8": { - "isolated": "\uFBF4", - "final": "\uFBF5" - }, - "\u0626\u06D0": { - "isolated": "\uFBF6", - "final": "\uFBF7", - "initial": "\uFBF8" - }, - "\u0626\u0649": { - "uighur_kirghiz": { - "isolated": "\uFBF9", - "final": "\uFBFA", - "initial": "\uFBFB" - }, - "isolated": "\uFC03", - "final": "\uFC68" - }, - "\u0626\u062C": { - "isolated": "\uFC00", - "initial": "\uFC97" - }, - "\u0626\u062D": { - "isolated": "\uFC01", - "initial": "\uFC98" - }, - "\u0626\u0645": { - "isolated": "\uFC02", - "final": "\uFC66", - "initial": "\uFC9A", - "medial": "\uFCDF" - }, - "\u0626\u064A": { - "isolated": "\uFC04", - "final": "\uFC69" - }, - "\u0628\u062C": { - "isolated": "\uFC05", - "initial": "\uFC9C" - }, - "\u0628\u062D": { - "isolated": "\uFC06", - "initial": "\uFC9D" - }, - "\u0628\u062E": { - "isolated": "\uFC07", - "initial": "\uFC9E" - }, - "\u0628\u0645": { - "isolated": "\uFC08", - "final": "\uFC6C", - "initial": "\uFC9F", - "medial": "\uFCE1" - }, - "\u0628\u0649": { - "isolated": "\uFC09", - "final": "\uFC6E" - }, - "\u0628\u064A": { - "isolated": "\uFC0A", - "final": "\uFC6F" - }, - "\u062A\u062C": { - "isolated": "\uFC0B", - "initial": "\uFCA1" - }, - "\u062A\u062D": { - "isolated": "\uFC0C", - "initial": "\uFCA2" - }, - "\u062A\u062E": { - "isolated": "\uFC0D", - "initial": "\uFCA3" - }, - "\u062A\u0645": { - "isolated": "\uFC0E", - "final": "\uFC72", - "initial": "\uFCA4", - "medial": "\uFCE3" - }, - "\u062A\u0649": { - "isolated": "\uFC0F", - "final": "\uFC74" - }, - "\u062A\u064A": { - "isolated": "\uFC10", - "final": "\uFC75" - }, - "\u062B\u062C": { - "isolated": "\uFC11" - }, - "\u062B\u0645": { - "isolated": "\uFC12", - "final": "\uFC78", - "initial": "\uFCA6", - "medial": "\uFCE5" - }, - "\u062B\u0649": { - "isolated": "\uFC13", - "final": "\uFC7A" - }, - "\u062B\u0648": { - "isolated": "\uFC14" - }, - "\u062C\u062D": { - "isolated": "\uFC15", - "initial": "\uFCA7" - }, - "\u062C\u0645": { - "isolated": "\uFC16", - "initial": "\uFCA8" - }, - "\u062D\u062C": { - "isolated": "\uFC17", - "initial": "\uFCA9" - }, - "\u062D\u0645": { - "isolated": "\uFC18", - "initial": "\uFCAA" - }, - "\u062E\u062C": { - "isolated": "\uFC19", - "initial": "\uFCAB" - }, - "\u062E\u062D": { - "isolated": "\uFC1A" - }, - "\u062E\u0645": { - "isolated": "\uFC1B", - "initial": "\uFCAC" - }, - "\u0633\u062C": { - "isolated": "\uFC1C", - "initial": "\uFCAD", - "medial": "\uFD34" - }, - "\u0633\u062D": { - "isolated": "\uFC1D", - "initial": "\uFCAE", - "medial": "\uFD35" - }, - "\u0633\u062E": { - "isolated": "\uFC1E", - "initial": "\uFCAF", - "medial": "\uFD36" - }, - "\u0633\u0645": { - "isolated": "\uFC1F", - "initial": "\uFCB0", - "medial": "\uFCE7" - }, - "\u0635\u062D": { - "isolated": "\uFC20", - "initial": "\uFCB1" - }, - "\u0635\u0645": { - "isolated": "\uFC21", - "initial": "\uFCB3" - }, - "\u0636\u062C": { - "isolated": "\uFC22", - "initial": "\uFCB4" - }, - "\u0636\u062D": { - "isolated": "\uFC23", - "initial": "\uFCB5" - }, - "\u0636\u062E": { - "isolated": "\uFC24", - "initial": "\uFCB6" - }, - "\u0636\u0645": { - "isolated": "\uFC25", - "initial": "\uFCB7" - }, - "\u0637\u062D": { - "isolated": "\uFC26", - "initial": "\uFCB8" - }, - "\u0637\u0645": { - "isolated": "\uFC27", - "initial": "\uFD33", - "medial": "\uFD3A" - }, - "\u0638\u0645": { - "isolated": "\uFC28", - "initial": "\uFCB9", - "medial": "\uFD3B" - }, - "\u0639\u062C": { - "isolated": "\uFC29", - "initial": "\uFCBA" - }, - "\u0639\u0645": { - "isolated": "\uFC2A", - "initial": "\uFCBB" - }, - "\u063A\u062C": { - "isolated": "\uFC2B", - "initial": "\uFCBC" - }, - "\u063A\u0645": { - "isolated": "\uFC2C", - "initial": "\uFCBD" - }, - "\u0641\u062C": { - "isolated": "\uFC2D", - "initial": "\uFCBE" - }, - "\u0641\u062D": { - "isolated": "\uFC2E", - "initial": "\uFCBF" - }, - "\u0641\u062E": { - "isolated": "\uFC2F", - "initial": "\uFCC0" - }, - "\u0641\u0645": { - "isolated": "\uFC30", - "initial": "\uFCC1" - }, - "\u0641\u0649": { - "isolated": "\uFC31", - "final": "\uFC7C" - }, - "\u0641\u064A": { - "isolated": "\uFC32", - "final": "\uFC7D" - }, - "\u0642\u062D": { - "isolated": "\uFC33", - "initial": "\uFCC2" - }, - "\u0642\u0645": { - "isolated": "\uFC34", - "initial": "\uFCC3" - }, - "\u0642\u0649": { - "isolated": "\uFC35", - "final": "\uFC7E" - }, - "\u0642\u064A": { - "isolated": "\uFC36", - "final": "\uFC7F" - }, - "\u0643\u0627": { - "isolated": "\uFC37", - "final": "\uFC80" - }, - "\u0643\u062C": { - "isolated": "\uFC38", - "initial": "\uFCC4" - }, - "\u0643\u062D": { - "isolated": "\uFC39", - "initial": "\uFCC5" - }, - "\u0643\u062E": { - "isolated": "\uFC3A", - "initial": "\uFCC6" - }, - "\u0643\u0644": { - "isolated": "\uFC3B", - "final": "\uFC81", - "initial": "\uFCC7", - "medial": "\uFCEB" - }, - "\u0643\u0645": { - "isolated": "\uFC3C", - "final": "\uFC82", - "initial": "\uFCC8", - "medial": "\uFCEC" - }, - "\u0643\u0649": { - "isolated": "\uFC3D", - "final": "\uFC83" - }, - "\u0643\u064A": { - "isolated": "\uFC3E", - "final": "\uFC84" - }, - "\u0644\u062C": { - "isolated": "\uFC3F", - "initial": "\uFCC9" - }, - "\u0644\u062D": { - "isolated": "\uFC40", - "initial": "\uFCCA" - }, - "\u0644\u062E": { - "isolated": "\uFC41", - "initial": "\uFCCB" - }, - "\u0644\u0645": { - "isolated": "\uFC42", - "final": "\uFC85", - "initial": "\uFCCC", - "medial": "\uFCED" - }, - "\u0644\u0649": { - "isolated": "\uFC43", - "final": "\uFC86" - }, - "\u0644\u064A": { - "isolated": "\uFC44", - "final": "\uFC87" - }, - "\u0645\u062C": { - "isolated": "\uFC45", - "initial": "\uFCCE" - }, - "\u0645\u062D": { - "isolated": "\uFC46", - "initial": "\uFCCF" - }, - "\u0645\u062E": { - "isolated": "\uFC47", - "initial": "\uFCD0" - }, - "\u0645\u0645": { - "isolated": "\uFC48", - "final": "\uFC89", - "initial": "\uFCD1" - }, - "\u0645\u0649": { - "isolated": "\uFC49" - }, - "\u0645\u064A": { - "isolated": "\uFC4A" - }, - "\u0646\u062C": { - "isolated": "\uFC4B", - "initial": "\uFCD2" - }, - "\u0646\u062D": { - "isolated": "\uFC4C", - "initial": "\uFCD3" - }, - "\u0646\u062E": { - "isolated": "\uFC4D", - "initial": "\uFCD4" - }, - "\u0646\u0645": { - "isolated": "\uFC4E", - "final": "\uFC8C", - "initial": "\uFCD5", - "medial": "\uFCEE" - }, - "\u0646\u0649": { - "isolated": "\uFC4F", - "final": "\uFC8E" - }, - "\u0646\u064A": { - "isolated": "\uFC50", - "final": "\uFC8F" - }, - "\u0647\u062C": { - "isolated": "\uFC51", - "initial": "\uFCD7" - }, - "\u0647\u0645": { - "isolated": "\uFC52", - "initial": "\uFCD8" - }, - "\u0647\u0649": { - "isolated": "\uFC53" - }, - "\u0647\u064A": { - "isolated": "\uFC54" - }, - "\u064A\u062C": { - "isolated": "\uFC55", - "initial": "\uFCDA" - }, - "\u064A\u062D": { - "isolated": "\uFC56", - "initial": "\uFCDB" - }, - "\u064A\u062E": { - "isolated": "\uFC57", - "initial": "\uFCDC" - }, - "\u064A\u0645": { - "isolated": "\uFC58", - "final": "\uFC93", - "initial": "\uFCDD", - "medial": "\uFCF0" - }, - "\u064A\u0649": { - "isolated": "\uFC59", - "final": "\uFC95" - }, - "\u064A\u064A": { - "isolated": "\uFC5A", - "final": "\uFC96" - }, - "\u0630\u0670": { - "isolated": "\uFC5B" - }, - "\u0631\u0670": { - "isolated": "\uFC5C" - }, - "\u0649\u0670": { - "isolated": "\uFC5D", - "final": "\uFC90" - }, - "\u064C\u0651": { - "isolated": "\uFC5E" - }, - "\u064D\u0651": { - "isolated": "\uFC5F" - }, - "\u064E\u0651": { - "isolated": "\uFC60" - }, - "\u064F\u0651": { - "isolated": "\uFC61" - }, - "\u0650\u0651": { - "isolated": "\uFC62" - }, - "\u0651\u0670": { - "isolated": "\uFC63" - }, - "\u0626\u0631": { - "final": "\uFC64" - }, - "\u0626\u0632": { - "final": "\uFC65" - }, - "\u0626\u0646": { - "final": "\uFC67" - }, - "\u0628\u0631": { - "final": "\uFC6A" - }, - "\u0628\u0632": { - "final": "\uFC6B" - }, - "\u0628\u0646": { - "final": "\uFC6D" - }, - "\u062A\u0631": { - "final": "\uFC70" - }, - "\u062A\u0632": { - "final": "\uFC71" - }, - "\u062A\u0646": { - "final": "\uFC73" - }, - "\u062B\u0631": { - "final": "\uFC76" - }, - "\u062B\u0632": { - "final": "\uFC77" - }, - "\u062B\u0646": { - "final": "\uFC79" - }, - "\u062B\u064A": { - "final": "\uFC7B" - }, - "\u0645\u0627": { - "final": "\uFC88" - }, - "\u0646\u0631": { - "final": "\uFC8A" - }, - "\u0646\u0632": { - "final": "\uFC8B" - }, - "\u0646\u0646": { - "final": "\uFC8D" - }, - "\u064A\u0631": { - "final": "\uFC91" - }, - "\u064A\u0632": { - "final": "\uFC92" - }, - "\u064A\u0646": { - "final": "\uFC94" - }, - "\u0626\u062E": { - "initial": "\uFC99" - }, - "\u0626\u0647": { - "initial": "\uFC9B", - "medial": "\uFCE0" - }, - "\u0628\u0647": { - "initial": "\uFCA0", - "medial": "\uFCE2" - }, - "\u062A\u0647": { - "initial": "\uFCA5", - "medial": "\uFCE4" - }, - "\u0635\u062E": { - "initial": "\uFCB2" - }, - "\u0644\u0647": { - "initial": "\uFCCD" - }, - "\u0646\u0647": { - "initial": "\uFCD6", - "medial": "\uFCEF" - }, - "\u0647\u0670": { - "initial": "\uFCD9" - }, - "\u064A\u0647": { - "initial": "\uFCDE", - "medial": "\uFCF1" - }, - "\u062B\u0647": { - "medial": "\uFCE6" - }, - "\u0633\u0647": { - "medial": "\uFCE8", - "initial": "\uFD31" - }, - "\u0634\u0645": { - "medial": "\uFCE9", - "isolated": "\uFD0C", - "final": "\uFD28", - "initial": "\uFD30" - }, - "\u0634\u0647": { - "medial": "\uFCEA", - "initial": "\uFD32" - }, - "\u0640\u064E\u0651": { - "medial": "\uFCF2" - }, - "\u0640\u064F\u0651": { - "medial": "\uFCF3" - }, - "\u0640\u0650\u0651": { - "medial": "\uFCF4" - }, - "\u0637\u0649": { - "isolated": "\uFCF5", - "final": "\uFD11" - }, - "\u0637\u064A": { - "isolated": "\uFCF6", - "final": "\uFD12" - }, - "\u0639\u0649": { - "isolated": "\uFCF7", - "final": "\uFD13" - }, - "\u0639\u064A": { - "isolated": "\uFCF8", - "final": "\uFD14" - }, - "\u063A\u0649": { - "isolated": "\uFCF9", - "final": "\uFD15" - }, - "\u063A\u064A": { - "isolated": "\uFCFA", - "final": "\uFD16" - }, - "\u0633\u0649": { - "isolated": "\uFCFB" - }, - "\u0633\u064A": { - "isolated": "\uFCFC", - "final": "\uFD18" - }, - "\u0634\u0649": { - "isolated": "\uFCFD", - "final": "\uFD19" - }, - "\u0634\u064A": { - "isolated": "\uFCFE", - "final": "\uFD1A" - }, - "\u062D\u0649": { - "isolated": "\uFCFF", - "final": "\uFD1B" - }, - "\u062D\u064A": { - "isolated": "\uFD00", - "final": "\uFD1C" - }, - "\u062C\u0649": { - "isolated": "\uFD01", - "final": "\uFD1D" - }, - "\u062C\u064A": { - "isolated": "\uFD02", - "final": "\uFD1E" - }, - "\u062E\u0649": { - "isolated": "\uFD03", - "final": "\uFD1F" - }, - "\u062E\u064A": { - "isolated": "\uFD04", - "final": "\uFD20" - }, - "\u0635\u0649": { - "isolated": "\uFD05", - "final": "\uFD21" - }, - "\u0635\u064A": { - "isolated": "\uFD06", - "final": "\uFD22" - }, - "\u0636\u0649": { - "isolated": "\uFD07", - "final": "\uFD23" - }, - "\u0636\u064A": { - "isolated": "\uFD08", - "final": "\uFD24" - }, - "\u0634\u062C": { - "isolated": "\uFD09", - "final": "\uFD25", - "initial": "\uFD2D", - "medial": "\uFD37" - }, - "\u0634\u062D": { - "isolated": "\uFD0A", - "final": "\uFD26", - "initial": "\uFD2E", - "medial": "\uFD38" - }, - "\u0634\u062E": { - "isolated": "\uFD0B", - "final": "\uFD27", - "initial": "\uFD2F", - "medial": "\uFD39" - }, - "\u0634\u0631": { - "isolated": "\uFD0D", - "final": "\uFD29" - }, - "\u0633\u0631": { - "isolated": "\uFD0E", - "final": "\uFD2A" - }, - "\u0635\u0631": { - "isolated": "\uFD0F", - "final": "\uFD2B" - }, - "\u0636\u0631": { - "isolated": "\uFD10", - "final": "\uFD2C" - }, - "\u0633\u0639": { - "final": "\uFD17" - }, - "\u062A\u062C\u0645": { - "initial": "\uFD50" - }, - "\u062A\u062D\u062C": { - "final": "\uFD51", - "initial": "\uFD52" - }, - "\u062A\u062D\u0645": { - "initial": "\uFD53" - }, - "\u062A\u062E\u0645": { - "initial": "\uFD54" - }, - "\u062A\u0645\u062C": { - "initial": "\uFD55" - }, - "\u062A\u0645\u062D": { - "initial": "\uFD56" - }, - "\u062A\u0645\u062E": { - "initial": "\uFD57" - }, - "\u062C\u0645\u062D": { - "final": "\uFD58", - "initial": "\uFD59" - }, - "\u062D\u0645\u064A": { - "final": "\uFD5A" - }, - "\u062D\u0645\u0649": { - "final": "\uFD5B" - }, - "\u0633\u062D\u062C": { - "initial": "\uFD5C" - }, - "\u0633\u062C\u062D": { - "initial": "\uFD5D" - }, - "\u0633\u062C\u0649": { - "final": "\uFD5E" - }, - "\u0633\u0645\u062D": { - "final": "\uFD5F", - "initial": "\uFD60" - }, - "\u0633\u0645\u062C": { - "initial": "\uFD61" - }, - "\u0633\u0645\u0645": { - "final": "\uFD62", - "initial": "\uFD63" - }, - "\u0635\u062D\u062D": { - "final": "\uFD64", - "initial": "\uFD65" - }, - "\u0635\u0645\u0645": { - "final": "\uFD66", - "initial": "\uFDC5" - }, - "\u0634\u062D\u0645": { - "final": "\uFD67", - "initial": "\uFD68" - }, - "\u0634\u062C\u064A": { - "final": "\uFD69" - }, - "\u0634\u0645\u062E": { - "final": "\uFD6A", - "initial": "\uFD6B" - }, - "\u0634\u0645\u0645": { - "final": "\uFD6C", - "initial": "\uFD6D" - }, - "\u0636\u062D\u0649": { - "final": "\uFD6E" - }, - "\u0636\u062E\u0645": { - "final": "\uFD6F", - "initial": "\uFD70" - }, - "\u0636\u0645\u062D": { - "final": "\uFD71" - }, - "\u0637\u0645\u062D": { - "initial": "\uFD72" - }, - "\u0637\u0645\u0645": { - "initial": "\uFD73" - }, - "\u0637\u0645\u064A": { - "final": "\uFD74" - }, - "\u0639\u062C\u0645": { - "final": "\uFD75", - "initial": "\uFDC4" - }, - "\u0639\u0645\u0645": { - "final": "\uFD76", - "initial": "\uFD77" - }, - "\u0639\u0645\u0649": { - "final": "\uFD78" - }, - "\u063A\u0645\u0645": { - "final": "\uFD79" - }, - "\u063A\u0645\u064A": { - "final": "\uFD7A" - }, - "\u063A\u0645\u0649": { - "final": "\uFD7B" - }, - "\u0641\u062E\u0645": { - "final": "\uFD7C", - "initial": "\uFD7D" - }, - "\u0642\u0645\u062D": { - "final": "\uFD7E", - "initial": "\uFDB4" - }, - "\u0642\u0645\u0645": { - "final": "\uFD7F" - }, - "\u0644\u062D\u0645": { - "final": "\uFD80", - "initial": "\uFDB5" - }, - "\u0644\u062D\u064A": { - "final": "\uFD81" - }, - "\u0644\u062D\u0649": { - "final": "\uFD82" - }, - "\u0644\u062C\u062C": { - "initial": "\uFD83", - "final": "\uFD84" - }, - "\u0644\u062E\u0645": { - "final": "\uFD85", - "initial": "\uFD86" - }, - "\u0644\u0645\u062D": { - "final": "\uFD87", - "initial": "\uFD88" - }, - "\u0645\u062D\u062C": { - "initial": "\uFD89" - }, - "\u0645\u062D\u0645": { - "initial": "\uFD8A" - }, - "\u0645\u062D\u064A": { - "final": "\uFD8B" - }, - "\u0645\u062C\u062D": { - "initial": "\uFD8C" - }, - "\u0645\u062C\u0645": { - "initial": "\uFD8D" - }, - "\u0645\u062E\u062C": { - "initial": "\uFD8E" - }, - "\u0645\u062E\u0645": { - "initial": "\uFD8F" - }, - "\u0645\u062C\u062E": { - "initial": "\uFD92" - }, - "\u0647\u0645\u062C": { - "initial": "\uFD93" - }, - "\u0647\u0645\u0645": { - "initial": "\uFD94" - }, - "\u0646\u062D\u0645": { - "initial": "\uFD95" - }, - "\u0646\u062D\u0649": { - "final": "\uFD96" - }, - "\u0646\u062C\u0645": { - "final": "\uFD97", - "initial": "\uFD98" - }, - "\u0646\u062C\u0649": { - "final": "\uFD99" - }, - "\u0646\u0645\u064A": { - "final": "\uFD9A" - }, - "\u0646\u0645\u0649": { - "final": "\uFD9B" - }, - "\u064A\u0645\u0645": { - "final": "\uFD9C", - "initial": "\uFD9D" - }, - "\u0628\u062E\u064A": { - "final": "\uFD9E" - }, - "\u062A\u062C\u064A": { - "final": "\uFD9F" - }, - "\u062A\u062C\u0649": { - "final": "\uFDA0" - }, - "\u062A\u062E\u064A": { - "final": "\uFDA1" - }, - "\u062A\u062E\u0649": { - "final": "\uFDA2" - }, - "\u062A\u0645\u064A": { - "final": "\uFDA3" - }, - "\u062A\u0645\u0649": { - "final": "\uFDA4" - }, - "\u062C\u0645\u064A": { - "final": "\uFDA5" - }, - "\u062C\u062D\u0649": { - "final": "\uFDA6" - }, - "\u062C\u0645\u0649": { - "final": "\uFDA7" - }, - "\u0633\u062E\u0649": { - "final": "\uFDA8" - }, - "\u0635\u062D\u064A": { - "final": "\uFDA9" - }, - "\u0634\u062D\u064A": { - "final": "\uFDAA" - }, - "\u0636\u062D\u064A": { - "final": "\uFDAB" - }, - "\u0644\u062C\u064A": { - "final": "\uFDAC" - }, - "\u0644\u0645\u064A": { - "final": "\uFDAD" - }, - "\u064A\u062D\u064A": { - "final": "\uFDAE" - }, - "\u064A\u062C\u064A": { - "final": "\uFDAF" - }, - "\u064A\u0645\u064A": { - "final": "\uFDB0" - }, - "\u0645\u0645\u064A": { - "final": "\uFDB1" - }, - "\u0642\u0645\u064A": { - "final": "\uFDB2" - }, - "\u0646\u062D\u064A": { - "final": "\uFDB3" - }, - "\u0639\u0645\u064A": { - "final": "\uFDB6" - }, - "\u0643\u0645\u064A": { - "final": "\uFDB7" - }, - "\u0646\u062C\u062D": { - "initial": "\uFDB8", - "final": "\uFDBD" - }, - "\u0645\u062E\u064A": { - "final": "\uFDB9" - }, - "\u0644\u062C\u0645": { - "initial": "\uFDBA", - "final": "\uFDBC" - }, - "\u0643\u0645\u0645": { - "final": "\uFDBB", - "initial": "\uFDC3" - }, - "\u062C\u062D\u064A": { - "final": "\uFDBE" - }, - "\u062D\u062C\u064A": { - "final": "\uFDBF" - }, - "\u0645\u062C\u064A": { - "final": "\uFDC0" - }, - "\u0641\u0645\u064A": { - "final": "\uFDC1" - }, - "\u0628\u062D\u064A": { - "final": "\uFDC2" - }, - "\u0633\u062E\u064A": { - "final": "\uFDC6" - }, - "\u0646\u062C\u064A": { - "final": "\uFDC7" - }, - "\u0644\u0622": { - "isolated": "\uFEF5", - "final": "\uFEF6" - }, - "\u0644\u0623": { - "isolated": "\uFEF7", - "final": "\uFEF8" - }, - "\u0644\u0625": { - "isolated": "\uFEF9", - "final": "\uFEFA" - }, - "\u0644\u0627": { - "isolated": "\uFEFB", - "final": "\uFEFC" - }, - "words": { - "\u0635\u0644\u06D2": "\uFDF0", - "\u0642\u0644\u06D2": "\uFDF1", - "\u0627\u0644\u0644\u0647": "\uFDF2", - "\u0627\u0643\u0628\u0631": "\uFDF3", - "\u0645\u062D\u0645\u062F": "\uFDF4", - "\u0635\u0644\u0639\u0645": "\uFDF5", - "\u0631\u0633\u0648\u0644": "\uFDF6", - "\u0639\u0644\u064A\u0647": "\uFDF7", - "\u0648\u0633\u0644\u0645": "\uFDF8", - "\u0635\u0644\u0649": "\uFDF9", - "\u0635\u0644\u0649\u0627\u0644\u0644\u0647\u0639\u0644\u064A\u0647\u0648\u0633\u0644\u0645": "\uFDFA", - "\u062C\u0644\u062C\u0644\u0627\u0644\u0647": "\uFDFB", - "\u0631\u06CC\u0627\u0644": "\uFDFC" - } - }; - exports.default = ligatureReference; - }); - - var reference = createCommonjsModule(function (module, exports) { - Object.defineProperty(exports, "__esModule", { value: true }); - - - var letterList = Object.keys(unicodeArabic.default); - exports.letterList = letterList; - var ligatureList = Object.keys(unicodeLigatures.default); - exports.ligatureList = ligatureList; - var ligatureWordList = Object.keys(unicodeLigatures.default.words); - exports.ligatureWordList = ligatureWordList; - var lams = '\u0644\u06B5\u06B6\u06B7\u06B8'; - exports.lams = lams; - var alefs = '\u0627\u0622\u0623\u0625\u0671\u0672\u0673\u0675\u0773\u0774'; - exports.alefs = alefs; - // for (var l = 1; l < lams.length; l++) { - // console.log('-'); - // for (var a = 0; a < alefs.length; a++) { - // console.log(a + ': ' + lams[l] + alefs[a]); - // } - // } - var tashkeel = '\u0605\u0640\u0670\u0674\u06DF\u06E7\u06E8'; - exports.tashkeel = tashkeel; - function addToTashkeel(start, finish) { - for (var i = start; i <= finish; i++) { - exports.tashkeel = tashkeel += String.fromCharCode(i); - } - } - addToTashkeel(0x0610, 0x061A); - addToTashkeel(0x064B, 0x065F); - addToTashkeel(0x06D6, 0x06DC); - addToTashkeel(0x06E0, 0x06E4); - addToTashkeel(0x06EA, 0x06ED); - addToTashkeel(0x08D3, 0x08E1); - addToTashkeel(0x08E3, 0x08FF); - addToTashkeel(0xFE70, 0xFE7F); - var lineBreakers = '\u0627\u0629\u0648\u06C0\u06CF\u06FD\u06FE\u076B\u076C\u0771\u0773\u0774\u0778\u0779\u08E2\u08B1\u08B2\u08B9'; - exports.lineBreakers = lineBreakers; - function addToLineBreakers(start, finish) { - for (var i = start; i <= finish; i++) { - exports.lineBreakers = lineBreakers += String.fromCharCode(i); - } + function selection_interrupt (name) { + return this.each(function () { + interrupt(this, name); + }); } - addToLineBreakers(0x0600, 0x061F); // it's OK to include tashkeel in this range as it is ignored - addToLineBreakers(0x0621, 0x0625); - addToLineBreakers(0x062F, 0x0632); - addToLineBreakers(0x0660, 0x066D); // numerals, math - addToLineBreakers(0x0671, 0x0677); - addToLineBreakers(0x0688, 0x0699); - addToLineBreakers(0x06C3, 0x06CB); - addToLineBreakers(0x06D2, 0x06F9); - addToLineBreakers(0x0759, 0x075B); - addToLineBreakers(0x08AA, 0x08AE); - addToLineBreakers(0xFB50, 0xFDFD); // presentation forms look like they could connect, but never do - // Presentation Forms A includes diacritics but they are meant to stand alone - addToLineBreakers(0xFE80, 0xFEFC); // presentation forms look like they could connect, but never do - // numerals, math - addToLineBreakers(0x10E60, 0x10E7F); - addToLineBreakers(0x1EC70, 0x1ECBF); - addToLineBreakers(0x1EE00, 0x1EEFF); - }); - var GlyphSplitter_1 = createCommonjsModule(function (module, exports) { - Object.defineProperty(exports, "__esModule", { value: true }); + function tweenRemove(id, name) { + var tween0, tween1; + return function () { + var schedule = set(this, id), + tween = schedule.tween; // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = tween0 = tween; - function GlyphSplitter(word) { - var letters = []; - var lastLetter = ''; - word.split('').forEach(function (letter) { - if (isArabic_1.isArabic(letter)) { - if (reference.tashkeel.indexOf(letter) > -1) { - letters[letters.length - 1] += letter; - } - else if (lastLetter.length && ((reference.lams.indexOf(lastLetter) === 0 && reference.alefs.indexOf(letter) > -1) || (reference.lams.indexOf(lastLetter) > 0 && reference.alefs.indexOf(letter) === 0))) { - // valid LA forms - letters[letters.length - 1] += letter; - } - else { - letters.push(letter); - } - } - else { - letters.push(letter); - } - if (reference.tashkeel.indexOf(letter) === -1) { - lastLetter = letter; + for (var i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1 = tween1.slice(); + tween1.splice(i, 1); + break; } - }); - return letters; - } - exports.GlyphSplitter = GlyphSplitter; - }); - - var BaselineSplitter_1 = createCommonjsModule(function (module, exports) { - Object.defineProperty(exports, "__esModule", { value: true }); - + } + } - function BaselineSplitter(word) { - var letters = []; - var lastLetter = ''; - word.split('').forEach(function (letter) { - if (isArabic_1.isArabic(letter) && isArabic_1.isArabic(lastLetter)) { - if (lastLetter.length && reference.tashkeel.indexOf(letter) > -1) { - letters[letters.length - 1] += letter; - } - else if (reference.lineBreakers.indexOf(lastLetter) > -1) { - letters.push(letter); - } - else { - letters[letters.length - 1] += letter; - } - } - else { - letters.push(letter); - } - if (reference.tashkeel.indexOf(letter) === -1) { - // don't allow tashkeel to hide line break - lastLetter = letter; - } - }); - return letters; + schedule.tween = tween1; + }; } - exports.BaselineSplitter = BaselineSplitter; - }); - - var Normalization = createCommonjsModule(function (module, exports) { - Object.defineProperty(exports, "__esModule", { value: true }); - + function tweenFunction(id, name, value) { + var tween0, tween1; + if (typeof value !== "function") throw new Error(); + return function () { + var schedule = set(this, id), + tween = schedule.tween; // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = (tween0 = tween).slice(); - function Normal(word, breakPresentationForm) { - // default is to turn initial/isolated/medial/final presentation form to generic - if (typeof breakPresentationForm === 'undefined') { - breakPresentationForm = true; - } - var returnable = ''; - word.split('').forEach(function (letter) { - if (!isArabic_1.isArabic(letter)) { - returnable += letter; - return; - } - for (var w = 0; w < reference.letterList.length; w++) { - // ok so we are checking this potential lettertron - var letterForms = unicodeArabic.default[reference.letterList[w]]; - var versions = Object.keys(letterForms); - for (var v = 0; v < versions.length; v++) { - var localVersion = letterForms[versions[v]]; - if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') { - // look at this embedded object - var embeddedForms = Object.keys(localVersion); - for (var ef = 0; ef < embeddedForms.length; ef++) { - var form = localVersion[embeddedForms[ef]]; - if (form === letter || (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1)) { - // match - // console.log('embedded match'); - if (form === letter) { - // match exact - if (breakPresentationForm && localVersion['normal'] && ['isolated', 'initial', 'medial', 'final'].indexOf(embeddedForms[ef]) > -1) { - // replace presentation form - // console.log('keeping normal form of the letter'); - if (typeof localVersion['normal'] === 'object') { - returnable += localVersion['normal'][0]; - } - else { - returnable += localVersion['normal']; - } - return; - } - // console.log('keeping this letter'); - returnable += letter; - return; - } - else if (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1) { - // match - returnable += form[0]; - // console.log('added the first letter from the same array'); - return; - } - } - } - } - else if (localVersion === letter) { - // match exact - if (breakPresentationForm && letterForms['normal'] && ['isolated', 'initial', 'medial', 'final'].indexOf(versions[v]) > -1) { - // replace presentation form - // console.log('keeping normal form of the letter'); - if (typeof letterForms['normal'] === 'object') { - returnable += letterForms['normal'][0]; - } - else { - returnable += letterForms['normal']; - } - return; - } - // console.log('keeping this letter'); - returnable += letter; - return; - } - else if (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1) { - // match - returnable += localVersion[0]; - // console.log('added the first letter from the same array'); - return; - } - } - } - // try ligatures - for (var v2 = 0; v2 < reference.ligatureList.length; v2++) { - var normalForm = reference.ligatureList[v2]; - if (normalForm !== 'words') { - var ligForms = Object.keys(unicodeLigatures.default[normalForm]); - for (var f = 0; f < ligForms.length; f++) { - if (unicodeLigatures.default[normalForm][ligForms[f]] === letter) { - returnable += normalForm; - return; - } - } - } - } - // try words ligatures - for (var v3 = 0; v3 < reference.ligatureWordList.length; v3++) { - var normalForm$1 = reference.ligatureWordList[v3]; - if (unicodeLigatures.default.words[normalForm$1] === letter) { - returnable += normalForm$1; - return; - } + for (var t = { + name: name, + value: value + }, i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1[i] = t; + break; } - returnable += letter; - // console.log('kept the letter') - }); - return returnable; - } - exports.Normal = Normal; - }); - - var CharShaper_1 = createCommonjsModule(function (module, exports) { - Object.defineProperty(exports, "__esModule", { value: true }); - - + } - function CharShaper(letter, form) { - if (!isArabic_1.isArabic(letter)) { - // fail not Arabic - throw new Error('Not Arabic'); - } - if (letter === "\u0621") { - // hamza alone - return "\u0621"; - } - for (var w = 0; w < reference.letterList.length; w++) { - // ok so we are checking this potential lettertron - var letterForms = unicodeArabic.default[reference.letterList[w]]; - var versions = Object.keys(letterForms); - for (var v = 0; v < versions.length; v++) { - var localVersion = letterForms[versions[v]]; - if ((localVersion === letter) || - (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1)) { - if (versions.indexOf(form) > -1) { - return letterForms[form]; - } - } - else if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') { - // check embedded - var embeddedVersions = Object.keys(localVersion); - for (var ev = 0; ev < embeddedVersions.length; ev++) { - if ((localVersion[embeddedVersions[ev]] === letter) || - (typeof localVersion[embeddedVersions[ev]] === 'object' && localVersion[embeddedVersions[ev]].indexOf && localVersion[embeddedVersions[ev]].indexOf(letter) > -1)) { - if (embeddedVersions.indexOf(form) > -1) { - return localVersion[form]; - } - } - } - } - } + if (i === n) tween1.push(t); } - } - exports.CharShaper = CharShaper; - }); - - var WordShaper_1 = createCommonjsModule(function (module, exports) { - Object.defineProperty(exports, "__esModule", { value: true }); + schedule.tween = tween1; + }; + } + function transition_tween (name, value) { + var id = this._id; + name += ""; + if (arguments.length < 2) { + var tween = get$1(this.node(), id).tween; - function WordShaper(word) { - var state = 'initial'; - var output = ''; - for (var w = 0; w < word.length; w++) { - var nextLetter = ' '; - for (var nxw = w + 1; nxw < word.length; nxw++) { - if (!isArabic_1.isArabic(word[nxw])) { - break; - } - if (reference.tashkeel.indexOf(word[nxw]) === -1) { - nextLetter = word[nxw]; - break; - } - } - if (!isArabic_1.isArabic(word[w]) || isArabic_1.isMath(word[w])) { - // space or other non-Arabic - output += word[w]; - state = 'initial'; - } - else if (reference.tashkeel.indexOf(word[w]) > -1) { - // tashkeel - add without changing state - output += word[w]; - } - else if ((nextLetter === ' ') // last Arabic letter in this word - || (reference.lineBreakers.indexOf(word[w]) > -1)) { // the current letter is known to break lines - output += CharShaper_1.CharShaper(word[w], state === 'initial' ? 'isolated' : 'final'); - state = 'initial'; - } - else if (reference.lams.indexOf(word[w]) > -1 && reference.alefs.indexOf(nextLetter) > -1) { - // LA letters - advance an additional letter after this - output += unicodeLigatures.default[word[w] + nextLetter][(state === 'initial' ? 'isolated' : 'final')]; - while (word[w] !== nextLetter) { - w++; - } - state = 'initial'; - } - else { - output += CharShaper_1.CharShaper(word[w], state); - state = 'medial'; - } + for (var i = 0, n = tween.length, t; i < n; ++i) { + if ((t = tween[i]).name === name) { + return t.value; + } } - return output; - } - exports.WordShaper = WordShaper; - }); - - var ParentLetter_1 = createCommonjsModule(function (module, exports) { - Object.defineProperty(exports, "__esModule", { value: true }); - + return null; + } - function ParentLetter(letter) { - if (!isArabic_1.isArabic(letter)) { - throw new Error('Not an Arabic letter'); - } - for (var w = 0; w < reference.letterList.length; w++) { - // ok so we are checking this potential lettertron - var letterForms = unicodeArabic.default[reference.letterList[w]]; - var versions = Object.keys(letterForms); - for (var v = 0; v < versions.length; v++) { - var localVersion = letterForms[versions[v]]; - if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') { - // look at this embedded object - var embeddedForms = Object.keys(localVersion); - for (var ef = 0; ef < embeddedForms.length; ef++) { - var form = localVersion[embeddedForms[ef]]; - if (form === letter || (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1)) { - // match - return localVersion; - } - } - } - else if (localVersion === letter || (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1)) { - // match - return letterForms; - } - } - return null; - } + return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value)); } - exports.ParentLetter = ParentLetter; - function GrandparentLetter(letter) { - if (!isArabic_1.isArabic(letter)) { - throw new Error('Not an Arabic letter'); - } - for (var w = 0; w < reference.letterList.length; w++) { - // ok so we are checking this potential lettertron - var letterForms = unicodeArabic.default[reference.letterList[w]]; - var versions = Object.keys(letterForms); - for (var v = 0; v < versions.length; v++) { - var localVersion = letterForms[versions[v]]; - if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') { - // look at this embedded object - var embeddedForms = Object.keys(localVersion); - for (var ef = 0; ef < embeddedForms.length; ef++) { - var form = localVersion[embeddedForms[ef]]; - if (form === letter || (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1)) { - // match - return letterForms; - } - } - } - else if (localVersion === letter || (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1)) { - // match - return letterForms; - } - } - return null; - } + function tweenValue(transition, name, value) { + var id = transition._id; + transition.each(function () { + var schedule = set(this, id); + (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); + }); + return function (node) { + return get$1(node, id).value[name]; + }; } - exports.GrandparentLetter = GrandparentLetter; - }); - - var lib$1 = createCommonjsModule(function (module, exports) { - Object.defineProperty(exports, "__esModule", { value: true }); - - exports.isArabic = isArabic_1.isArabic; - - exports.GlyphSplitter = GlyphSplitter_1.GlyphSplitter; - - exports.BaselineSplitter = BaselineSplitter_1.BaselineSplitter; - - exports.Normal = Normalization.Normal; - - exports.CharShaper = CharShaper_1.CharShaper; - - exports.WordShaper = WordShaper_1.WordShaper; - exports.ParentLetter = ParentLetter_1.ParentLetter; - exports.GrandparentLetter = ParentLetter_1.GrandparentLetter; - }); - - // see https://github.com/openstreetmap/iD/pull/3707 - - var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0750-\u07BF\u08A0–\u08BF]/; - - function fixRTLTextForSvg(inputText) { - var ret = '', rtlBuffer = []; - var arabicRegex = /[\u0600-\u06FF]/g; - var arabicDiacritics = /[\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06ED]/g; - var arabicMath = /[\u0660-\u066C\u06F0-\u06F9]+/g; - var thaanaVowel = /[\u07A6-\u07B0]/; - var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/; - - // Arabic word shaping - if (arabicRegex.test(inputText)) { - inputText = lib$1.WordShaper(inputText); - } - - for (var n = 0; n < inputText.length; n++) { - var c = inputText[n]; - if (arabicMath.test(c)) { - // Arabic numbers go LTR - ret += rtlBuffer.reverse().join(''); - rtlBuffer = [c]; - } else { - if (rtlBuffer.length && arabicMath.test(rtlBuffer[rtlBuffer.length - 1])) { - ret += rtlBuffer.reverse().join(''); - rtlBuffer = []; - } - if ((thaanaVowel.test(c) || hebrewSign.test(c) || arabicDiacritics.test(c)) && rtlBuffer.length) { - rtlBuffer[rtlBuffer.length - 1] += c; - } else if (rtlRegex.test(c) - // include Arabic presentation forms - || (c.charCodeAt(0) >= 64336 && c.charCodeAt(0) <= 65023) - || (c.charCodeAt(0) >= 65136 && c.charCodeAt(0) <= 65279)) { - rtlBuffer.push(c); - } else if (c === ' ' && rtlBuffer.length) { - // whitespace within RTL text - rtlBuffer = [rtlBuffer.reverse().join('') + ' ']; - } else { - // non-RTL character - ret += rtlBuffer.reverse().join('') + c; - rtlBuffer = []; - } - } - } - ret += rtlBuffer.reverse().join(''); - return ret; + function interpolate (a, b) { + var c; + return (typeof b === "number" ? d3_interpolateNumber : b instanceof color ? d3_interpolateRgb : (c = color(b)) ? (b = c, d3_interpolateRgb) : interpolateString)(a, b); } - // https://github.com/openstreetmap/iD/issues/772 - // http://mathiasbynens.be/notes/localstorage-pattern#comment-9 - var _storage; - try { _storage = localStorage; } catch (e) {} // eslint-disable-line no-empty - _storage = _storage || (function () { - var s = {}; - return { - getItem: function (k) { return s[k]; }, - setItem: function (k, v) { return s[k] = v; }, - removeItem: function (k) { return delete s[k]; } + function attrRemove(name) { + return function () { + this.removeAttribute(name); }; - })(); - - // - // corePreferences is an interface for persisting basic key-value strings - // within and between iD sessions on the same site. - // - function corePreferences(k, v) { + } - try { - if (arguments.length === 1) { return _storage.getItem(k); } - else if (v === null) { _storage.removeItem(k); } - else { _storage.setItem(k, v); } - } catch (e) { - /* eslint-disable no-console */ - if (typeof console !== 'undefined') { - console.error('localStorage quota exceeded'); - } - /* eslint-enable no-console */ - } + function attrRemoveNS(fullname) { + return function () { + this.removeAttributeNS(fullname.space, fullname.local); + }; + } + function attrConstant(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function () { + var string0 = this.getAttribute(name); + return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1); + }; } - function responseText(response) { - if (!response.ok) { throw new Error(response.status + " " + response.statusText); } - return response.text(); + function attrConstantNS(fullname, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function () { + var string0 = this.getAttributeNS(fullname.space, fullname.local); + return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1); + }; } - function d3_text(input, init) { - return fetch(input, init).then(responseText); + function attrFunction(name, interpolate, value) { + var string00, string10, interpolate0; + return function () { + var string0, + value1 = value(this), + string1; + if (value1 == null) return void this.removeAttribute(name); + string0 = this.getAttribute(name); + string1 = value1 + ""; + return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; } - function responseJson(response) { - if (!response.ok) { throw new Error(response.status + " " + response.statusText); } - if (response.status === 204 || response.status === 205) { return; } - return response.json(); + function attrFunctionNS(fullname, interpolate, value) { + var string00, string10, interpolate0; + return function () { + var string0, + value1 = value(this), + string1; + if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local); + string0 = this.getAttributeNS(fullname.space, fullname.local); + string1 = value1 + ""; + return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; } - function d3_json(input, init) { - return fetch(input, init).then(responseJson); + function transition_attr (name, value) { + var fullname = namespace(name), + i = fullname === "transform" ? interpolateTransformSvg : interpolate; + return this.attrTween(name, typeof value === "function" ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, "attr." + name, value)) : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname) : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value)); } - function parser(type) { - return function(input, init) { - return d3_text(input, init).then(function(text) { - return (new DOMParser).parseFromString(text, type); - }); + function attrInterpolate(name, i) { + return function (t) { + this.setAttribute(name, i.call(this, t)); }; } - var d3_xml = parser("application/xml"); + function attrInterpolateNS(fullname, i) { + return function (t) { + this.setAttributeNS(fullname.space, fullname.local, i.call(this, t)); + }; + } - var svg = parser("image/svg+xml"); + function attrTweenNS(fullname, value) { + var t0, i0; - var _mainFileFetcher = coreFileFetcher(); // singleton + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i); + return t0; + } - // - // coreFileFetcher asynchronously fetches data from JSON files - // - function coreFileFetcher() { - var _this = {}; - var _inflight = {}; - var _fileMap = { - 'address_formats': 'data/address_formats.min.json', - 'deprecated': 'data/deprecated.min.json', - 'discarded': 'data/discarded.min.json', - 'imagery': 'data/imagery.min.json', - 'intro_graph': 'data/intro_graph.min.json', - 'keepRight': 'data/keepRight.min.json', - 'languages': 'data/languages.min.json', - 'locales': 'data/locales.min.json', - 'nsi_brands': 'https://cdn.jsdelivr.net/npm/name-suggestion-index@4/dist/brands.min.json', - 'nsi_filters': 'https://cdn.jsdelivr.net/npm/name-suggestion-index@4/dist/filters.min.json', - 'oci_features': 'https://cdn.jsdelivr.net/npm/osm-community-index@2/dist/features.min.json', - 'oci_resources': 'https://cdn.jsdelivr.net/npm/osm-community-index@2/dist/resources.min.json', - 'preset_categories': 'data/preset_categories.min.json', - 'preset_defaults': 'data/preset_defaults.min.json', - 'preset_fields': 'data/preset_fields.min.json', - 'preset_presets': 'data/preset_presets.min.json', - 'phone_formats': 'data/phone_formats.min.json', - 'qa_data': 'data/qa_data.min.json', - 'shortcuts': 'data/shortcuts.min.json', - 'territory_languages': 'data/territory_languages.min.json', - 'wmf_sitematrix': 'https://cdn.jsdelivr.net/npm/wmf-sitematrix@0.1/wikipedia.min.json' - }; + tween._value = value; + return tween; + } - var _cachedData = {}; - // expose the cache; useful for tests - _this.cache = function () { return _cachedData; }; + function attrTween(name, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i); + return t0; + } - // Returns a Promise to fetch data - // (resolved with the data if we have it already) - _this.get = function (which) { - if (_cachedData[which]) { - return Promise.resolve(_cachedData[which]); - } + tween._value = value; + return tween; + } - var file = _fileMap[which]; - var url = file && _this.asset(file); - if (!url) { - return Promise.reject(("Unknown data file for \"" + which + "\"")); - } + function transition_attrTween (name, value) { + var key = "attr." + name; + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error(); + var fullname = namespace(name); + return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); + } - var prom = _inflight[url]; - if (!prom) { - _inflight[url] = prom = d3_json(url) - .then(function (result) { - delete _inflight[url]; - if (!result) { - throw new Error(("No data loaded for \"" + which + "\"")); - } - _cachedData[which] = result; - return result; - }) - .catch(function (err) { - delete _inflight[url]; - throw err; - }); - } + function delayFunction(id, value) { + return function () { + init(this, id).delay = +value.apply(this, arguments); + }; + } - return prom; + function delayConstant(id, value) { + return value = +value, function () { + init(this, id).delay = value; }; + } + function transition_delay (value) { + var id = this._id; + return arguments.length ? this.each((typeof value === "function" ? delayFunction : delayConstant)(id, value)) : get$1(this.node(), id).delay; + } - // Accessor for the file map - _this.fileMap = function(val) { - if (!arguments.length) { return _fileMap; } - _fileMap = val; - return _this; + function durationFunction(id, value) { + return function () { + set(this, id).duration = +value.apply(this, arguments); }; + } - var _assetPath = ''; - _this.assetPath = function(val) { - if (!arguments.length) { return _assetPath; } - _assetPath = val; - return _this; + function durationConstant(id, value) { + return value = +value, function () { + set(this, id).duration = value; }; + } - var _assetMap = {}; - _this.assetMap = function(val) { - if (!arguments.length) { return _assetMap; } - _assetMap = val; - return _this; - }; + function transition_duration (value) { + var id = this._id; + return arguments.length ? this.each((typeof value === "function" ? durationFunction : durationConstant)(id, value)) : get$1(this.node(), id).duration; + } - _this.asset = function (val) { - if (/^http(s)?:\/\//i.test(val)) { return val; } - var filename = _assetPath + val; - return _assetMap[filename] || filename; + function easeConstant(id, value) { + if (typeof value !== "function") throw new Error(); + return function () { + set(this, id).ease = value; }; + } - return _this; + function transition_ease (value) { + var id = this._id; + return arguments.length ? this.each(easeConstant(id, value)) : get$1(this.node(), id).ease; } - var _detected; + function easeVarying(id, value) { + return function () { + var v = value.apply(this, arguments); + if (typeof v !== "function") throw new Error(); + set(this, id).ease = v; + }; + } - function utilDetect(refresh) { - if (_detected && !refresh) { return _detected; } - _detected = {}; + function transition_easeVarying (value) { + if (typeof value !== "function") throw new Error(); + return this.each(easeVarying(this._id, value)); + } - var ua = navigator.userAgent; - var m = null; + function transition_filter (match) { + if (typeof match !== "function") match = matcher(match); - /* Browser */ - m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i); // Edge - if (m !== null) { - _detected.browser = m[1]; - _detected.version = m[2]; - } - if (!_detected.browser) { - m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i); // IE11 - if (m !== null) { - _detected.browser = 'msie'; - _detected.version = m[1]; - } - } - if (!_detected.browser) { - m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i); // Opera 15+ - if (m !== null) { - _detected.browser = 'Opera'; - _detected.version = m[2]; - } - } - if (!_detected.browser) { - m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i); - if (m !== null) { - _detected.browser = m[1]; - _detected.version = m[2]; - m = ua.match(/version\/([\.\d]+)/i); - if (m !== null) { _detected.version = m[1]; } + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } } } - if (!_detected.browser) { - _detected.browser = navigator.appName; - _detected.version = navigator.appVersion; - } - - // keep major.minor version only.. - _detected.version = _detected.version.split(/\W/).slice(0,2).join('.'); - - // detect other browser capabilities - // Legacy Opera has incomplete svg style support. See #715 - _detected.opera = (_detected.browser.toLowerCase() === 'opera' && parseFloat(_detected.version) < 15 ); - if (_detected.browser.toLowerCase() === 'msie') { - _detected.ie = true; - _detected.browser = 'Internet Explorer'; - _detected.support = parseFloat(_detected.version) >= 11; - } else { - _detected.ie = false; - _detected.support = true; - } - - _detected.filedrop = (window.FileReader && 'ondrop' in window); - _detected.download = !(_detected.ie || _detected.browser.toLowerCase() === 'edge'); - _detected.cssfilters = !(_detected.ie || _detected.browser.toLowerCase() === 'edge'); + return new Transition(subgroups, this._parents, this._name, this._id); + } + function transition_merge (transition) { + if (transition._id !== this._id) throw new Error(); - /* Platform */ - if (/Win/.test(ua)) { - _detected.os = 'win'; - _detected.platform = 'Windows'; - } else if (/Mac/.test(ua)) { - _detected.os = 'mac'; - _detected.platform = 'Macintosh'; - } else if (/X11/.test(ua) || /Linux/.test(ua)) { - _detected.os = 'linux'; - _detected.platform = 'Linux'; - } else { - _detected.os = 'win'; - _detected.platform = 'Unknown'; + for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } } - _detected.isMobileWebKit = (/\b(iPad|iPhone|iPod)\b/.test(ua) || - // HACK: iPadOS 13+ requests desktop sites by default by using a Mac user agent, - // so assume any "mac" with multitouch is actually iOS - (navigator.platform === 'MacIntel' && 'maxTouchPoints' in navigator && navigator.maxTouchPoints > 1)) && - /WebKit/.test(ua) && - !/Edge/.test(ua) && - !window.MSStream; - - - /* Locale */ - // An array of locales requested by the browser in priority order. - _detected.browserLocales = Array.from(new Set( // remove duplicates - [navigator.language] - .concat(navigator.languages || []) - .concat([ - // old property for backwards compatibility - navigator.userLanguage, - // fallback to English - 'en' - ]) - // remove any undefined values - .filter(Boolean) - )); - - - /* Host */ - var loc = window.top.location; - var origin = loc.origin; - if (!origin) { // for unpatched IE11 - origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port: ''); + for (; j < m0; ++j) { + merges[j] = groups0[j]; } - _detected.host = origin + loc.pathname; - + return new Transition(merges, this._parents, this._name, this._id); + } - return _detected; + function start(name) { + return (name + "").trim().split(/^|\s+/).every(function (t) { + var i = t.indexOf("."); + if (i >= 0) t = t.slice(0, i); + return !t || t === "start"; + }); } - var aesJs = createCommonjsModule(function (module, exports) { - /*! MIT License. Copyright 2015-2018 Richard Moore . See LICENSE.txt. */ - (function(root) { + function onFunction(id, name, listener) { + var on0, + on1, + sit = start(name) ? init : set; + return function () { + var schedule = sit(this, id), + on = schedule.on; // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. - function checkInt(value) { - return (parseInt(value) === value); - } + if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener); + schedule.on = on1; + }; + } - function checkInts(arrayish) { - if (!checkInt(arrayish.length)) { return false; } + function transition_on (name, listener) { + var id = this._id; + return arguments.length < 2 ? get$1(this.node(), id).on.on(name) : this.each(onFunction(id, name, listener)); + } - for (var i = 0; i < arrayish.length; i++) { - if (!checkInt(arrayish[i]) || arrayish[i] < 0 || arrayish[i] > 255) { - return false; - } - } + function removeFunction(id) { + return function () { + var parent = this.parentNode; - return true; + for (var i in this.__transition) { + if (+i !== id) return; } - function coerceArray(arg, copy) { + if (parent) parent.removeChild(this); + }; + } - // ArrayBuffer view - if (arg.buffer && arg.name === 'Uint8Array') { + function transition_remove () { + return this.on("end.remove", removeFunction(this._id)); + } - if (copy) { - if (arg.slice) { - arg = arg.slice(); - } else { - arg = Array.prototype.slice.call(arg); - } - } + function transition_select (select) { + var name = this._name, + id = this._id; + if (typeof select !== "function") select = selector(select); - return arg; - } + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + schedule(subgroup[i], name, id, i, subgroup, get$1(node, id)); + } + } + } - // It's an array; check it is a valid representation of a byte - if (Array.isArray(arg)) { - if (!checkInts(arg)) { - throw new Error('Array contains invalid value: ' + arg); - } + return new Transition(subgroups, this._parents, name, id); + } - return new Uint8Array(arg); - } + function transition_selectAll (select) { + var name = this._name, + id = this._id; + if (typeof select !== "function") select = selectorAll(select); - // Something else, but behaves like an array (maybe a Buffer? Arguments?) - if (checkInt(arg.length) && checkInts(arg)) { - return new Uint8Array(arg); + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + for (var children = select.call(node, node.__data__, i, group), child, inherit = get$1(node, id), k = 0, l = children.length; k < l; ++k) { + if (child = children[k]) { + schedule(child, name, id, k, children, inherit); + } } - throw new Error('unsupported array-like object'); - } - - function createArray(length) { - return new Uint8Array(length); - } - - function copyArray(sourceArray, targetArray, targetStart, sourceStart, sourceEnd) { - if (sourceStart != null || sourceEnd != null) { - if (sourceArray.slice) { - sourceArray = sourceArray.slice(sourceStart, sourceEnd); - } else { - sourceArray = Array.prototype.slice.call(sourceArray, sourceStart, sourceEnd); - } - } - targetArray.set(sourceArray, targetStart); + subgroups.push(children); + parents.push(node); + } } + } + return new Transition(subgroups, parents, name, id); + } + var Selection = selection.prototype.constructor; + function transition_selection () { + return new Selection(this._groups, this._parents); + } - var convertUtf8 = (function() { - function toBytes(text) { - var result = [], i = 0; - text = encodeURI(text); - while (i < text.length) { - var c = text.charCodeAt(i++); - - // if it is a % sign, encode the following 2 bytes as a hex value - if (c === 37) { - result.push(parseInt(text.substr(i, 2), 16)); - i += 2; - - // otherwise, just the actual byte - } else { - result.push(c); - } - } + function styleNull(name, interpolate) { + var string00, string10, interpolate0; + return function () { + var string0 = styleValue(this, name), + string1 = (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : interpolate0 = interpolate(string00 = string0, string10 = string1); + }; + } - return coerceArray(result); - } + function styleRemove(name) { + return function () { + this.style.removeProperty(name); + }; + } - function fromBytes(bytes) { - var result = [], i = 0; + function styleConstant(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function () { + var string0 = styleValue(this, name); + return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1); + }; + } - while (i < bytes.length) { - var c = bytes[i]; + function styleFunction(name, interpolate, value) { + var string00, string10, interpolate0; + return function () { + var string0 = styleValue(this, name), + value1 = value(this), + string1 = value1 + ""; + if (value1 == null) string1 = value1 = (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; + } - if (c < 128) { - result.push(String.fromCharCode(c)); - i++; - } else if (c > 191 && c < 224) { - result.push(String.fromCharCode(((c & 0x1f) << 6) | (bytes[i + 1] & 0x3f))); - i += 2; - } else { - result.push(String.fromCharCode(((c & 0x0f) << 12) | ((bytes[i + 1] & 0x3f) << 6) | (bytes[i + 2] & 0x3f))); - i += 3; - } - } + function styleMaybeRemove(id, name) { + var on0, + on1, + listener0, + key = "style." + name, + event = "end." + key, + remove; + return function () { + var schedule = set(this, id), + on = schedule.on, + listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined; // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. - return result.join(''); - } + if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener); + schedule.on = on1; + }; + } - return { - toBytes: toBytes, - fromBytes: fromBytes, - } - })(); + function transition_style (name, value, priority) { + var i = (name += "") === "transform" ? interpolateTransformCss : interpolate; + return value == null ? this.styleTween(name, styleNull(name, i)).on("end.style." + name, styleRemove(name)) : typeof value === "function" ? this.styleTween(name, styleFunction(name, i, tweenValue(this, "style." + name, value))).each(styleMaybeRemove(this._id, name)) : this.styleTween(name, styleConstant(name, i, value), priority).on("end.style." + name, null); + } - var convertHex = (function() { - function toBytes(text) { - var result = []; - for (var i = 0; i < text.length; i += 2) { - result.push(parseInt(text.substr(i, 2), 16)); - } + function styleInterpolate(name, i, priority) { + return function (t) { + this.style.setProperty(name, i.call(this, t), priority); + }; + } - return result; - } + function styleTween(name, value, priority) { + var t, i0; - // http://ixti.net/development/javascript/2011/11/11/base64-encodedecode-of-utf8-in-browser-with-js.html - var Hex = '0123456789abcdef'; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority); + return t; + } - function fromBytes(bytes) { - var result = []; - for (var i = 0; i < bytes.length; i++) { - var v = bytes[i]; - result.push(Hex[(v & 0xf0) >> 4] + Hex[v & 0x0f]); - } - return result.join(''); - } + tween._value = value; + return tween; + } - return { - toBytes: toBytes, - fromBytes: fromBytes, - } - })(); + function transition_styleTween (name, value, priority) { + var key = "style." + (name += ""); + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error(); + return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); + } + function textConstant(value) { + return function () { + this.textContent = value; + }; + } - // Number of rounds by keysize - var numberOfRounds = {16: 10, 24: 12, 32: 14}; + function textFunction(value) { + return function () { + var value1 = value(this); + this.textContent = value1 == null ? "" : value1; + }; + } - // Round constant words - var rcon = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91]; + function transition_text (value) { + return this.tween("text", typeof value === "function" ? textFunction(tweenValue(this, "text", value)) : textConstant(value == null ? "" : value + "")); + } - // S-box and Inverse S-box (S is for Substitution) - var S = [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]; - var Si =[0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]; + function textInterpolate(i) { + return function (t) { + this.textContent = i.call(this, t); + }; + } - // Transformations for encryption - var T1 = [0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a]; - var T2 = [0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616]; - var T3 = [0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16]; - var T4 = [0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c]; + function textTween(value) { + var t0, i0; - // Transformations for decryption - var T5 = [0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742]; - var T6 = [0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857]; - var T7 = [0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8]; - var T8 = [0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0]; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && textInterpolate(i); + return t0; + } - // Transformations for decryption key expansion - var U1 = [0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]; - var U2 = [0x00000000, 0x0b0e090d, 0x161c121a, 0x1d121b17, 0x2c382434, 0x27362d39, 0x3a24362e, 0x312a3f23, 0x58704868, 0x537e4165, 0x4e6c5a72, 0x4562537f, 0x74486c5c, 0x7f466551, 0x62547e46, 0x695a774b, 0xb0e090d0, 0xbbee99dd, 0xa6fc82ca, 0xadf28bc7, 0x9cd8b4e4, 0x97d6bde9, 0x8ac4a6fe, 0x81caaff3, 0xe890d8b8, 0xe39ed1b5, 0xfe8ccaa2, 0xf582c3af, 0xc4a8fc8c, 0xcfa6f581, 0xd2b4ee96, 0xd9bae79b, 0x7bdb3bbb, 0x70d532b6, 0x6dc729a1, 0x66c920ac, 0x57e31f8f, 0x5ced1682, 0x41ff0d95, 0x4af10498, 0x23ab73d3, 0x28a57ade, 0x35b761c9, 0x3eb968c4, 0x0f9357e7, 0x049d5eea, 0x198f45fd, 0x12814cf0, 0xcb3bab6b, 0xc035a266, 0xdd27b971, 0xd629b07c, 0xe7038f5f, 0xec0d8652, 0xf11f9d45, 0xfa119448, 0x934be303, 0x9845ea0e, 0x8557f119, 0x8e59f814, 0xbf73c737, 0xb47dce3a, 0xa96fd52d, 0xa261dc20, 0xf6ad766d, 0xfda37f60, 0xe0b16477, 0xebbf6d7a, 0xda955259, 0xd19b5b54, 0xcc894043, 0xc787494e, 0xaedd3e05, 0xa5d33708, 0xb8c12c1f, 0xb3cf2512, 0x82e51a31, 0x89eb133c, 0x94f9082b, 0x9ff70126, 0x464de6bd, 0x4d43efb0, 0x5051f4a7, 0x5b5ffdaa, 0x6a75c289, 0x617bcb84, 0x7c69d093, 0x7767d99e, 0x1e3daed5, 0x1533a7d8, 0x0821bccf, 0x032fb5c2, 0x32058ae1, 0x390b83ec, 0x241998fb, 0x2f1791f6, 0x8d764dd6, 0x867844db, 0x9b6a5fcc, 0x906456c1, 0xa14e69e2, 0xaa4060ef, 0xb7527bf8, 0xbc5c72f5, 0xd50605be, 0xde080cb3, 0xc31a17a4, 0xc8141ea9, 0xf93e218a, 0xf2302887, 0xef223390, 0xe42c3a9d, 0x3d96dd06, 0x3698d40b, 0x2b8acf1c, 0x2084c611, 0x11aef932, 0x1aa0f03f, 0x07b2eb28, 0x0cbce225, 0x65e6956e, 0x6ee89c63, 0x73fa8774, 0x78f48e79, 0x49deb15a, 0x42d0b857, 0x5fc2a340, 0x54ccaa4d, 0xf741ecda, 0xfc4fe5d7, 0xe15dfec0, 0xea53f7cd, 0xdb79c8ee, 0xd077c1e3, 0xcd65daf4, 0xc66bd3f9, 0xaf31a4b2, 0xa43fadbf, 0xb92db6a8, 0xb223bfa5, 0x83098086, 0x8807898b, 0x9515929c, 0x9e1b9b91, 0x47a17c0a, 0x4caf7507, 0x51bd6e10, 0x5ab3671d, 0x6b99583e, 0x60975133, 0x7d854a24, 0x768b4329, 0x1fd13462, 0x14df3d6f, 0x09cd2678, 0x02c32f75, 0x33e91056, 0x38e7195b, 0x25f5024c, 0x2efb0b41, 0x8c9ad761, 0x8794de6c, 0x9a86c57b, 0x9188cc76, 0xa0a2f355, 0xabacfa58, 0xb6bee14f, 0xbdb0e842, 0xd4ea9f09, 0xdfe49604, 0xc2f68d13, 0xc9f8841e, 0xf8d2bb3d, 0xf3dcb230, 0xeecea927, 0xe5c0a02a, 0x3c7a47b1, 0x37744ebc, 0x2a6655ab, 0x21685ca6, 0x10426385, 0x1b4c6a88, 0x065e719f, 0x0d507892, 0x640a0fd9, 0x6f0406d4, 0x72161dc3, 0x791814ce, 0x48322bed, 0x433c22e0, 0x5e2e39f7, 0x552030fa, 0x01ec9ab7, 0x0ae293ba, 0x17f088ad, 0x1cfe81a0, 0x2dd4be83, 0x26dab78e, 0x3bc8ac99, 0x30c6a594, 0x599cd2df, 0x5292dbd2, 0x4f80c0c5, 0x448ec9c8, 0x75a4f6eb, 0x7eaaffe6, 0x63b8e4f1, 0x68b6edfc, 0xb10c0a67, 0xba02036a, 0xa710187d, 0xac1e1170, 0x9d342e53, 0x963a275e, 0x8b283c49, 0x80263544, 0xe97c420f, 0xe2724b02, 0xff605015, 0xf46e5918, 0xc544663b, 0xce4a6f36, 0xd3587421, 0xd8567d2c, 0x7a37a10c, 0x7139a801, 0x6c2bb316, 0x6725ba1b, 0x560f8538, 0x5d018c35, 0x40139722, 0x4b1d9e2f, 0x2247e964, 0x2949e069, 0x345bfb7e, 0x3f55f273, 0x0e7fcd50, 0x0571c45d, 0x1863df4a, 0x136dd647, 0xcad731dc, 0xc1d938d1, 0xdccb23c6, 0xd7c52acb, 0xe6ef15e8, 0xede11ce5, 0xf0f307f2, 0xfbfd0eff, 0x92a779b4, 0x99a970b9, 0x84bb6bae, 0x8fb562a3, 0xbe9f5d80, 0xb591548d, 0xa8834f9a, 0xa38d4697]; - var U3 = [0x00000000, 0x0d0b0e09, 0x1a161c12, 0x171d121b, 0x342c3824, 0x3927362d, 0x2e3a2436, 0x23312a3f, 0x68587048, 0x65537e41, 0x724e6c5a, 0x7f456253, 0x5c74486c, 0x517f4665, 0x4662547e, 0x4b695a77, 0xd0b0e090, 0xddbbee99, 0xcaa6fc82, 0xc7adf28b, 0xe49cd8b4, 0xe997d6bd, 0xfe8ac4a6, 0xf381caaf, 0xb8e890d8, 0xb5e39ed1, 0xa2fe8cca, 0xaff582c3, 0x8cc4a8fc, 0x81cfa6f5, 0x96d2b4ee, 0x9bd9bae7, 0xbb7bdb3b, 0xb670d532, 0xa16dc729, 0xac66c920, 0x8f57e31f, 0x825ced16, 0x9541ff0d, 0x984af104, 0xd323ab73, 0xde28a57a, 0xc935b761, 0xc43eb968, 0xe70f9357, 0xea049d5e, 0xfd198f45, 0xf012814c, 0x6bcb3bab, 0x66c035a2, 0x71dd27b9, 0x7cd629b0, 0x5fe7038f, 0x52ec0d86, 0x45f11f9d, 0x48fa1194, 0x03934be3, 0x0e9845ea, 0x198557f1, 0x148e59f8, 0x37bf73c7, 0x3ab47dce, 0x2da96fd5, 0x20a261dc, 0x6df6ad76, 0x60fda37f, 0x77e0b164, 0x7aebbf6d, 0x59da9552, 0x54d19b5b, 0x43cc8940, 0x4ec78749, 0x05aedd3e, 0x08a5d337, 0x1fb8c12c, 0x12b3cf25, 0x3182e51a, 0x3c89eb13, 0x2b94f908, 0x269ff701, 0xbd464de6, 0xb04d43ef, 0xa75051f4, 0xaa5b5ffd, 0x896a75c2, 0x84617bcb, 0x937c69d0, 0x9e7767d9, 0xd51e3dae, 0xd81533a7, 0xcf0821bc, 0xc2032fb5, 0xe132058a, 0xec390b83, 0xfb241998, 0xf62f1791, 0xd68d764d, 0xdb867844, 0xcc9b6a5f, 0xc1906456, 0xe2a14e69, 0xefaa4060, 0xf8b7527b, 0xf5bc5c72, 0xbed50605, 0xb3de080c, 0xa4c31a17, 0xa9c8141e, 0x8af93e21, 0x87f23028, 0x90ef2233, 0x9de42c3a, 0x063d96dd, 0x0b3698d4, 0x1c2b8acf, 0x112084c6, 0x3211aef9, 0x3f1aa0f0, 0x2807b2eb, 0x250cbce2, 0x6e65e695, 0x636ee89c, 0x7473fa87, 0x7978f48e, 0x5a49deb1, 0x5742d0b8, 0x405fc2a3, 0x4d54ccaa, 0xdaf741ec, 0xd7fc4fe5, 0xc0e15dfe, 0xcdea53f7, 0xeedb79c8, 0xe3d077c1, 0xf4cd65da, 0xf9c66bd3, 0xb2af31a4, 0xbfa43fad, 0xa8b92db6, 0xa5b223bf, 0x86830980, 0x8b880789, 0x9c951592, 0x919e1b9b, 0x0a47a17c, 0x074caf75, 0x1051bd6e, 0x1d5ab367, 0x3e6b9958, 0x33609751, 0x247d854a, 0x29768b43, 0x621fd134, 0x6f14df3d, 0x7809cd26, 0x7502c32f, 0x5633e910, 0x5b38e719, 0x4c25f502, 0x412efb0b, 0x618c9ad7, 0x6c8794de, 0x7b9a86c5, 0x769188cc, 0x55a0a2f3, 0x58abacfa, 0x4fb6bee1, 0x42bdb0e8, 0x09d4ea9f, 0x04dfe496, 0x13c2f68d, 0x1ec9f884, 0x3df8d2bb, 0x30f3dcb2, 0x27eecea9, 0x2ae5c0a0, 0xb13c7a47, 0xbc37744e, 0xab2a6655, 0xa621685c, 0x85104263, 0x881b4c6a, 0x9f065e71, 0x920d5078, 0xd9640a0f, 0xd46f0406, 0xc372161d, 0xce791814, 0xed48322b, 0xe0433c22, 0xf75e2e39, 0xfa552030, 0xb701ec9a, 0xba0ae293, 0xad17f088, 0xa01cfe81, 0x832dd4be, 0x8e26dab7, 0x993bc8ac, 0x9430c6a5, 0xdf599cd2, 0xd25292db, 0xc54f80c0, 0xc8448ec9, 0xeb75a4f6, 0xe67eaaff, 0xf163b8e4, 0xfc68b6ed, 0x67b10c0a, 0x6aba0203, 0x7da71018, 0x70ac1e11, 0x539d342e, 0x5e963a27, 0x498b283c, 0x44802635, 0x0fe97c42, 0x02e2724b, 0x15ff6050, 0x18f46e59, 0x3bc54466, 0x36ce4a6f, 0x21d35874, 0x2cd8567d, 0x0c7a37a1, 0x017139a8, 0x166c2bb3, 0x1b6725ba, 0x38560f85, 0x355d018c, 0x22401397, 0x2f4b1d9e, 0x642247e9, 0x692949e0, 0x7e345bfb, 0x733f55f2, 0x500e7fcd, 0x5d0571c4, 0x4a1863df, 0x47136dd6, 0xdccad731, 0xd1c1d938, 0xc6dccb23, 0xcbd7c52a, 0xe8e6ef15, 0xe5ede11c, 0xf2f0f307, 0xfffbfd0e, 0xb492a779, 0xb999a970, 0xae84bb6b, 0xa38fb562, 0x80be9f5d, 0x8db59154, 0x9aa8834f, 0x97a38d46]; - var U4 = [0x00000000, 0x090d0b0e, 0x121a161c, 0x1b171d12, 0x24342c38, 0x2d392736, 0x362e3a24, 0x3f23312a, 0x48685870, 0x4165537e, 0x5a724e6c, 0x537f4562, 0x6c5c7448, 0x65517f46, 0x7e466254, 0x774b695a, 0x90d0b0e0, 0x99ddbbee, 0x82caa6fc, 0x8bc7adf2, 0xb4e49cd8, 0xbde997d6, 0xa6fe8ac4, 0xaff381ca, 0xd8b8e890, 0xd1b5e39e, 0xcaa2fe8c, 0xc3aff582, 0xfc8cc4a8, 0xf581cfa6, 0xee96d2b4, 0xe79bd9ba, 0x3bbb7bdb, 0x32b670d5, 0x29a16dc7, 0x20ac66c9, 0x1f8f57e3, 0x16825ced, 0x0d9541ff, 0x04984af1, 0x73d323ab, 0x7ade28a5, 0x61c935b7, 0x68c43eb9, 0x57e70f93, 0x5eea049d, 0x45fd198f, 0x4cf01281, 0xab6bcb3b, 0xa266c035, 0xb971dd27, 0xb07cd629, 0x8f5fe703, 0x8652ec0d, 0x9d45f11f, 0x9448fa11, 0xe303934b, 0xea0e9845, 0xf1198557, 0xf8148e59, 0xc737bf73, 0xce3ab47d, 0xd52da96f, 0xdc20a261, 0x766df6ad, 0x7f60fda3, 0x6477e0b1, 0x6d7aebbf, 0x5259da95, 0x5b54d19b, 0x4043cc89, 0x494ec787, 0x3e05aedd, 0x3708a5d3, 0x2c1fb8c1, 0x2512b3cf, 0x1a3182e5, 0x133c89eb, 0x082b94f9, 0x01269ff7, 0xe6bd464d, 0xefb04d43, 0xf4a75051, 0xfdaa5b5f, 0xc2896a75, 0xcb84617b, 0xd0937c69, 0xd99e7767, 0xaed51e3d, 0xa7d81533, 0xbccf0821, 0xb5c2032f, 0x8ae13205, 0x83ec390b, 0x98fb2419, 0x91f62f17, 0x4dd68d76, 0x44db8678, 0x5fcc9b6a, 0x56c19064, 0x69e2a14e, 0x60efaa40, 0x7bf8b752, 0x72f5bc5c, 0x05bed506, 0x0cb3de08, 0x17a4c31a, 0x1ea9c814, 0x218af93e, 0x2887f230, 0x3390ef22, 0x3a9de42c, 0xdd063d96, 0xd40b3698, 0xcf1c2b8a, 0xc6112084, 0xf93211ae, 0xf03f1aa0, 0xeb2807b2, 0xe2250cbc, 0x956e65e6, 0x9c636ee8, 0x877473fa, 0x8e7978f4, 0xb15a49de, 0xb85742d0, 0xa3405fc2, 0xaa4d54cc, 0xecdaf741, 0xe5d7fc4f, 0xfec0e15d, 0xf7cdea53, 0xc8eedb79, 0xc1e3d077, 0xdaf4cd65, 0xd3f9c66b, 0xa4b2af31, 0xadbfa43f, 0xb6a8b92d, 0xbfa5b223, 0x80868309, 0x898b8807, 0x929c9515, 0x9b919e1b, 0x7c0a47a1, 0x75074caf, 0x6e1051bd, 0x671d5ab3, 0x583e6b99, 0x51336097, 0x4a247d85, 0x4329768b, 0x34621fd1, 0x3d6f14df, 0x267809cd, 0x2f7502c3, 0x105633e9, 0x195b38e7, 0x024c25f5, 0x0b412efb, 0xd7618c9a, 0xde6c8794, 0xc57b9a86, 0xcc769188, 0xf355a0a2, 0xfa58abac, 0xe14fb6be, 0xe842bdb0, 0x9f09d4ea, 0x9604dfe4, 0x8d13c2f6, 0x841ec9f8, 0xbb3df8d2, 0xb230f3dc, 0xa927eece, 0xa02ae5c0, 0x47b13c7a, 0x4ebc3774, 0x55ab2a66, 0x5ca62168, 0x63851042, 0x6a881b4c, 0x719f065e, 0x78920d50, 0x0fd9640a, 0x06d46f04, 0x1dc37216, 0x14ce7918, 0x2bed4832, 0x22e0433c, 0x39f75e2e, 0x30fa5520, 0x9ab701ec, 0x93ba0ae2, 0x88ad17f0, 0x81a01cfe, 0xbe832dd4, 0xb78e26da, 0xac993bc8, 0xa59430c6, 0xd2df599c, 0xdbd25292, 0xc0c54f80, 0xc9c8448e, 0xf6eb75a4, 0xffe67eaa, 0xe4f163b8, 0xedfc68b6, 0x0a67b10c, 0x036aba02, 0x187da710, 0x1170ac1e, 0x2e539d34, 0x275e963a, 0x3c498b28, 0x35448026, 0x420fe97c, 0x4b02e272, 0x5015ff60, 0x5918f46e, 0x663bc544, 0x6f36ce4a, 0x7421d358, 0x7d2cd856, 0xa10c7a37, 0xa8017139, 0xb3166c2b, 0xba1b6725, 0x8538560f, 0x8c355d01, 0x97224013, 0x9e2f4b1d, 0xe9642247, 0xe0692949, 0xfb7e345b, 0xf2733f55, 0xcd500e7f, 0xc45d0571, 0xdf4a1863, 0xd647136d, 0x31dccad7, 0x38d1c1d9, 0x23c6dccb, 0x2acbd7c5, 0x15e8e6ef, 0x1ce5ede1, 0x07f2f0f3, 0x0efffbfd, 0x79b492a7, 0x70b999a9, 0x6bae84bb, 0x62a38fb5, 0x5d80be9f, 0x548db591, 0x4f9aa883, 0x4697a38d]; + tween._value = value; + return tween; + } - function convertToInt32(bytes) { - var result = []; - for (var i = 0; i < bytes.length; i += 4) { - result.push( - (bytes[i ] << 24) | - (bytes[i + 1] << 16) | - (bytes[i + 2] << 8) | - bytes[i + 3] - ); - } - return result; - } + function transition_textTween (value) { + var key = "text"; + if (arguments.length < 1) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error(); + return this.tween(key, textTween(value)); + } - var AES = function(key) { - if (!(this instanceof AES)) { - throw Error('AES must be instanitated with `new`'); - } + function transition_transition () { + var name = this._name, + id0 = this._id, + id1 = newId(); - Object.defineProperty(this, 'key', { - value: coerceArray(key, true) + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + var inherit = get$1(node, id0); + schedule(node, name, id1, i, group, { + time: inherit.time + inherit.delay + inherit.duration, + delay: 0, + duration: inherit.duration, + ease: inherit.ease }); + } + } + } + + return new Transition(groups, this._parents, name, id1); + } - this._prepare(); + function transition_end () { + var on0, + on1, + that = this, + id = that._id, + size = that.size(); + return new Promise(function (resolve, reject) { + var cancel = { + value: reject + }, + end = { + value: function value() { + if (--size === 0) resolve(); + } }; + that.each(function () { + var schedule = set(this, id), + on = schedule.on; // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) { + on1 = (on0 = on).copy(); - AES.prototype._prepare = function() { + on1._.cancel.push(cancel); - var rounds = numberOfRounds[this.key.length]; - if (rounds == null) { - throw new Error('invalid key size (must be 16, 24 or 32 bytes)'); - } + on1._.interrupt.push(cancel); - // encryption round keys - this._Ke = []; + on1._.end.push(end); + } - // decryption round keys - this._Kd = []; + schedule.on = on1; + }); // The selection was empty, resolve end immediately - for (var i = 0; i <= rounds; i++) { - this._Ke.push([0, 0, 0, 0]); - this._Kd.push([0, 0, 0, 0]); - } + if (size === 0) resolve(); + }); + } - var roundKeyCount = (rounds + 1) * 4; - var KC = this.key.length / 4; + var id = 0; + function Transition(groups, parents, name, id) { + this._groups = groups; + this._parents = parents; + this._name = name; + this._id = id; + } + function newId() { + return ++id; + } + var selection_prototype = selection.prototype; + Transition.prototype = _defineProperty({ + constructor: Transition, + select: transition_select, + selectAll: transition_selectAll, + filter: transition_filter, + merge: transition_merge, + selection: transition_selection, + transition: transition_transition, + call: selection_prototype.call, + nodes: selection_prototype.nodes, + node: selection_prototype.node, + size: selection_prototype.size, + empty: selection_prototype.empty, + each: selection_prototype.each, + on: transition_on, + attr: transition_attr, + attrTween: transition_attrTween, + style: transition_style, + styleTween: transition_styleTween, + text: transition_text, + textTween: transition_textTween, + remove: transition_remove, + tween: transition_tween, + delay: transition_delay, + duration: transition_duration, + ease: transition_ease, + easeVarying: transition_easeVarying, + end: transition_end + }, Symbol.iterator, selection_prototype[Symbol.iterator]); - // convert the key into ints - var tk = convertToInt32(this.key); + var linear$1 = function linear(t) { + return +t; + }; - // copy values into round key arrays - var index; - for (var i = 0; i < KC; i++) { - index = i >> 2; - this._Ke[index][i % 4] = tk[i]; - this._Kd[rounds - index][i % 4] = tk[i]; - } + function cubicInOut(t) { + return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; + } - // key expansion (fips-197 section 5.2) - var rconpointer = 0; - var t = KC, tt; - while (t < roundKeyCount) { - tt = tk[KC - 1]; - tk[0] ^= ((S[(tt >> 16) & 0xFF] << 24) ^ - (S[(tt >> 8) & 0xFF] << 16) ^ - (S[ tt & 0xFF] << 8) ^ - S[(tt >> 24) & 0xFF] ^ - (rcon[rconpointer] << 24)); - rconpointer += 1; + var defaultTiming = { + time: null, + // Set on use. + delay: 0, + duration: 250, + ease: cubicInOut + }; - // key expansion (for non-256 bit) - if (KC != 8) { - for (var i = 1; i < KC; i++) { - tk[i] ^= tk[i - 1]; - } + function inherit(node, id) { + var timing; - // key expansion for 256-bit keys is "slightly different" (fips-197) - } else { - for (var i = 1; i < (KC / 2); i++) { - tk[i] ^= tk[i - 1]; - } - tt = tk[(KC / 2) - 1]; + while (!(timing = node.__transition) || !(timing = timing[id])) { + if (!(node = node.parentNode)) { + throw new Error("transition ".concat(id, " not found")); + } + } - tk[KC / 2] ^= (S[ tt & 0xFF] ^ - (S[(tt >> 8) & 0xFF] << 8) ^ - (S[(tt >> 16) & 0xFF] << 16) ^ - (S[(tt >> 24) & 0xFF] << 24)); + return timing; + } - for (var i = (KC / 2) + 1; i < KC; i++) { - tk[i] ^= tk[i - 1]; - } - } + function selection_transition (name) { + var id, timing; - // copy values into round key arrays - var i = 0, r, c; - while (i < KC && t < roundKeyCount) { - r = t >> 2; - c = t % 4; - this._Ke[r][c] = tk[i]; - this._Kd[rounds - r][c] = tk[i++]; - t++; - } - } + if (name instanceof Transition) { + id = name._id, name = name._name; + } else { + id = newId(), (timing = defaultTiming).time = now$1(), name = name == null ? null : name + ""; + } - // inverse-cipher-ify the decryption round key (fips-197 section 5.3) - for (var r = 1; r < rounds; r++) { - for (var c = 0; c < 4; c++) { - tt = this._Kd[r][c]; - this._Kd[r][c] = (U1[(tt >> 24) & 0xFF] ^ - U2[(tt >> 16) & 0xFF] ^ - U3[(tt >> 8) & 0xFF] ^ - U4[ tt & 0xFF]); - } - } - }; + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + schedule(node, name, id, i, group, timing || inherit(node, id)); + } + } + } - AES.prototype.encrypt = function(plaintext) { - if (plaintext.length != 16) { - throw new Error('invalid plaintext size (must be 16 bytes)'); - } + return new Transition(groups, this._parents, name, id); + } - var rounds = this._Ke.length - 1; - var a = [0, 0, 0, 0]; + selection.prototype.interrupt = selection_interrupt; + selection.prototype.transition = selection_transition; - // convert plaintext to (ints ^ key) - var t = convertToInt32(plaintext); - for (var i = 0; i < 4; i++) { - t[i] ^= this._Ke[0][i]; - } + var constant = (function (x) { + return function () { + return x; + }; + }); - // apply round transforms - for (var r = 1; r < rounds; r++) { - for (var i = 0; i < 4; i++) { - a[i] = (T1[(t[ i ] >> 24) & 0xff] ^ - T2[(t[(i + 1) % 4] >> 16) & 0xff] ^ - T3[(t[(i + 2) % 4] >> 8) & 0xff] ^ - T4[ t[(i + 3) % 4] & 0xff] ^ - this._Ke[r][i]); - } - t = a.slice(); - } + function ZoomEvent(type, _ref) { + var sourceEvent = _ref.sourceEvent, + target = _ref.target, + transform = _ref.transform, + dispatch = _ref.dispatch; + Object.defineProperties(this, { + type: { + value: type, + enumerable: true, + configurable: true + }, + sourceEvent: { + value: sourceEvent, + enumerable: true, + configurable: true + }, + target: { + value: target, + enumerable: true, + configurable: true + }, + transform: { + value: transform, + enumerable: true, + configurable: true + }, + _: { + value: dispatch + } + }); + } - // the last round is special - var result = createArray(16), tt; - for (var i = 0; i < 4; i++) { - tt = this._Ke[rounds][i]; - result[4 * i ] = (S[(t[ i ] >> 24) & 0xff] ^ (tt >> 24)) & 0xff; - result[4 * i + 1] = (S[(t[(i + 1) % 4] >> 16) & 0xff] ^ (tt >> 16)) & 0xff; - result[4 * i + 2] = (S[(t[(i + 2) % 4] >> 8) & 0xff] ^ (tt >> 8)) & 0xff; - result[4 * i + 3] = (S[ t[(i + 3) % 4] & 0xff] ^ tt ) & 0xff; - } + function Transform(k, x, y) { + this.k = k; + this.x = x; + this.y = y; + } + Transform.prototype = { + constructor: Transform, + scale: function scale(k) { + return k === 1 ? this : new Transform(this.k * k, this.x, this.y); + }, + translate: function translate(x, y) { + return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y); + }, + apply: function apply(point) { + return [point[0] * this.k + this.x, point[1] * this.k + this.y]; + }, + applyX: function applyX(x) { + return x * this.k + this.x; + }, + applyY: function applyY(y) { + return y * this.k + this.y; + }, + invert: function invert(location) { + return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k]; + }, + invertX: function invertX(x) { + return (x - this.x) / this.k; + }, + invertY: function invertY(y) { + return (y - this.y) / this.k; + }, + rescaleX: function rescaleX(x) { + return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x)); + }, + rescaleY: function rescaleY(y) { + return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y)); + }, + toString: function toString() { + return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; + } + }; + var identity$2 = new Transform(1, 0, 0); - return result; - }; + function nopropagation(event) { + event.stopImmediatePropagation(); + } + function noevent (event) { + event.preventDefault(); + event.stopImmediatePropagation(); + } - AES.prototype.decrypt = function(ciphertext) { - if (ciphertext.length != 16) { - throw new Error('invalid ciphertext size (must be 16 bytes)'); - } + // except for pinch-to-zoom, which is sent as a wheel+ctrlKey event - var rounds = this._Kd.length - 1; - var a = [0, 0, 0, 0]; + function defaultFilter$1(event) { + return (!event.ctrlKey || event.type === 'wheel') && !event.button; + } - // convert plaintext to (ints ^ key) - var t = convertToInt32(ciphertext); - for (var i = 0; i < 4; i++) { - t[i] ^= this._Kd[0][i]; - } + function defaultExtent$1() { + var e = this; - // apply round transforms - for (var r = 1; r < rounds; r++) { - for (var i = 0; i < 4; i++) { - a[i] = (T5[(t[ i ] >> 24) & 0xff] ^ - T6[(t[(i + 3) % 4] >> 16) & 0xff] ^ - T7[(t[(i + 2) % 4] >> 8) & 0xff] ^ - T8[ t[(i + 1) % 4] & 0xff] ^ - this._Kd[r][i]); - } - t = a.slice(); - } + if (e instanceof SVGElement) { + e = e.ownerSVGElement || e; - // the last round is special - var result = createArray(16), tt; - for (var i = 0; i < 4; i++) { - tt = this._Kd[rounds][i]; - result[4 * i ] = (Si[(t[ i ] >> 24) & 0xff] ^ (tt >> 24)) & 0xff; - result[4 * i + 1] = (Si[(t[(i + 3) % 4] >> 16) & 0xff] ^ (tt >> 16)) & 0xff; - result[4 * i + 2] = (Si[(t[(i + 2) % 4] >> 8) & 0xff] ^ (tt >> 8)) & 0xff; - result[4 * i + 3] = (Si[ t[(i + 1) % 4] & 0xff] ^ tt ) & 0xff; - } + if (e.hasAttribute("viewBox")) { + e = e.viewBox.baseVal; + return [[e.x, e.y], [e.x + e.width, e.y + e.height]]; + } - return result; - }; + return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]]; + } + return [[0, 0], [e.clientWidth, e.clientHeight]]; + } - /** - * Mode Of Operation - Electonic Codebook (ECB) - */ - var ModeOfOperationECB = function(key) { - if (!(this instanceof ModeOfOperationECB)) { - throw Error('AES must be instanitated with `new`'); - } + function defaultTransform() { + return this.__zoom || identity$2; + } - this.description = "Electronic Code Block"; - this.name = "ecb"; + function defaultWheelDelta$1(event) { + return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * (event.ctrlKey ? 10 : 1); + } - this._aes = new AES(key); - }; + function defaultTouchable() { + return navigator.maxTouchPoints || "ontouchstart" in this; + } - ModeOfOperationECB.prototype.encrypt = function(plaintext) { - plaintext = coerceArray(plaintext); + function defaultConstrain$1(transform, extent, translateExtent) { + var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0], + dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0], + dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1], + dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1]; + return transform.translate(dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)); + } - if ((plaintext.length % 16) !== 0) { - throw new Error('invalid plaintext size (must be multiple of 16 bytes)'); - } + function d3_zoom () { + var filter = defaultFilter$1, + extent = defaultExtent$1, + constrain = defaultConstrain$1, + wheelDelta = defaultWheelDelta$1, + touchable = defaultTouchable, + scaleExtent = [0, Infinity], + translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], + duration = 250, + interpolate = interpolateZoom, + listeners = dispatch$8("start", "zoom", "end"), + touchstarting, + touchfirst, + touchending, + touchDelay = 500, + wheelDelay = 150, + clickDistance2 = 0, + tapDistance = 10; - var ciphertext = createArray(plaintext.length); - var block = createArray(16); + function zoom(selection) { + selection.property("__zoom", defaultTransform).on("wheel.zoom", wheeled).on("mousedown.zoom", mousedowned).on("dblclick.zoom", dblclicked).filter(touchable).on("touchstart.zoom", touchstarted).on("touchmove.zoom", touchmoved).on("touchend.zoom touchcancel.zoom", touchended).style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } - for (var i = 0; i < plaintext.length; i += 16) { - copyArray(plaintext, block, 0, i, i + 16); - block = this._aes.encrypt(block); - copyArray(block, ciphertext, i); - } + zoom.transform = function (collection, transform, point, event) { + var selection = collection.selection ? collection.selection() : collection; + selection.property("__zoom", defaultTransform); - return ciphertext; - }; + if (collection !== selection) { + schedule(collection, transform, point, event); + } else { + selection.interrupt().each(function () { + gesture(this, arguments).event(event).start().zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform).end(); + }); + } + }; - ModeOfOperationECB.prototype.decrypt = function(ciphertext) { - ciphertext = coerceArray(ciphertext); + zoom.scaleBy = function (selection, k, p, event) { + zoom.scaleTo(selection, function () { + var k0 = this.__zoom.k, + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return k0 * k1; + }, p, event); + }; - if ((ciphertext.length % 16) !== 0) { - throw new Error('invalid ciphertext size (must be multiple of 16 bytes)'); - } + zoom.scaleTo = function (selection, k, p, event) { + zoom.transform(selection, function () { + var e = extent.apply(this, arguments), + t0 = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, + p1 = t0.invert(p0), + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent); + }, p, event); + }; - var plaintext = createArray(ciphertext.length); - var block = createArray(16); + zoom.translateBy = function (selection, x, y, event) { + zoom.transform(selection, function () { + return constrain(this.__zoom.translate(typeof x === "function" ? x.apply(this, arguments) : x, typeof y === "function" ? y.apply(this, arguments) : y), extent.apply(this, arguments), translateExtent); + }, null, event); + }; - for (var i = 0; i < ciphertext.length; i += 16) { - copyArray(ciphertext, block, 0, i, i + 16); - block = this._aes.decrypt(block); - copyArray(block, plaintext, i); - } + zoom.translateTo = function (selection, x, y, p, event) { + zoom.transform(selection, function () { + var e = extent.apply(this, arguments), + t = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p; + return constrain(identity$2.translate(p0[0], p0[1]).scale(t.k).translate(typeof x === "function" ? -x.apply(this, arguments) : -x, typeof y === "function" ? -y.apply(this, arguments) : -y), e, translateExtent); + }, p, event); + }; - return plaintext; - }; + function scale(transform, k) { + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k)); + return k === transform.k ? transform : new Transform(k, transform.x, transform.y); + } + function translate(transform, p0, p1) { + var x = p0[0] - p1[0] * transform.k, + y = p0[1] - p1[1] * transform.k; + return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y); + } - /** - * Mode Of Operation - Cipher Block Chaining (CBC) - */ - var ModeOfOperationCBC = function(key, iv) { - if (!(this instanceof ModeOfOperationCBC)) { - throw Error('AES must be instanitated with `new`'); - } + function centroid(extent) { + return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2]; + } - this.description = "Cipher Block Chaining"; - this.name = "cbc"; + function schedule(transition, transform, point, event) { + transition.on("start.zoom", function () { + gesture(this, arguments).event(event).start(); + }).on("interrupt.zoom end.zoom", function () { + gesture(this, arguments).event(event).end(); + }).tween("zoom", function () { + var that = this, + args = arguments, + g = gesture(that, args).event(event), + e = extent.apply(that, args), + p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, + w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), + a = that.__zoom, + b = typeof transform === "function" ? transform.apply(that, args) : transform, + i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k)); + return function (t) { + if (t === 1) t = b; // Avoid rounding error on end. + else { + var l = i(t), + k = w / l[2]; + t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); + } + g.zoom(null, t); + }; + }); + } - if (!iv) { - iv = createArray(16); + function gesture(that, args, clean) { + return !clean && that.__zooming || new Gesture(that, args); + } - } else if (iv.length != 16) { - throw new Error('invalid initialation vector size (must be 16 bytes)'); - } + function Gesture(that, args) { + this.that = that; + this.args = args; + this.active = 0; + this.sourceEvent = null; + this.extent = extent.apply(that, args); + this.taps = 0; + } - this._lastCipherblock = coerceArray(iv, true); + Gesture.prototype = { + event: function event(_event) { + if (_event) this.sourceEvent = _event; + return this; + }, + start: function start() { + if (++this.active === 1) { + this.that.__zooming = this; + this.emit("start"); + } - this._aes = new AES(key); - }; + return this; + }, + zoom: function zoom(key, transform) { + if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]); + if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]); + if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]); + this.that.__zoom = transform; + this.emit("zoom"); + return this; + }, + end: function end() { + if (--this.active === 0) { + delete this.that.__zooming; + this.emit("end"); + } - ModeOfOperationCBC.prototype.encrypt = function(plaintext) { - plaintext = coerceArray(plaintext); + return this; + }, + emit: function emit(type) { + var d = select(this.that).datum(); + listeners.call(type, this.that, new ZoomEvent(type, { + sourceEvent: this.sourceEvent, + target: zoom, + type: type, + transform: this.that.__zoom, + dispatch: listeners + }), d); + } + }; - if ((plaintext.length % 16) !== 0) { - throw new Error('invalid plaintext size (must be multiple of 16 bytes)'); - } + function wheeled(event) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } - var ciphertext = createArray(plaintext.length); - var block = createArray(16); + if (!filter.apply(this, arguments)) return; + var g = gesture(this, args).event(event), + t = this.__zoom, + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), + p = pointer(event); // If the mouse is in the same location as before, reuse it. + // If there were recent wheel events, reset the wheel idle timeout. - for (var i = 0; i < plaintext.length; i += 16) { - copyArray(plaintext, block, 0, i, i + 16); + if (g.wheel) { + if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { + g.mouse[1] = t.invert(g.mouse[0] = p); + } - for (var j = 0; j < 16; j++) { - block[j] ^= this._lastCipherblock[j]; - } + clearTimeout(g.wheel); + } // If this wheel event won’t trigger a transform change, ignore it. + else if (t.k === k) return; // Otherwise, capture the mouse point and location at the start. + else { + g.mouse = [p, t.invert(p)]; + interrupt(this); + g.start(); + } - this._lastCipherblock = this._aes.encrypt(block); - copyArray(this._lastCipherblock, ciphertext, i); - } + noevent(event); + g.wheel = setTimeout(wheelidled, wheelDelay); + g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent)); - return ciphertext; - }; + function wheelidled() { + g.wheel = null; + g.end(); + } + } - ModeOfOperationCBC.prototype.decrypt = function(ciphertext) { - ciphertext = coerceArray(ciphertext); + function mousedowned(event) { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } - if ((ciphertext.length % 16) !== 0) { - throw new Error('invalid ciphertext size (must be multiple of 16 bytes)'); - } + if (touchending || !filter.apply(this, arguments)) return; + var g = gesture(this, args, true).event(event), + v = select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), + p = pointer(event, currentTarget), + currentTarget = event.currentTarget, + x0 = event.clientX, + y0 = event.clientY; + dragDisable(event.view); + nopropagation(event); + g.mouse = [p, this.__zoom.invert(p)]; + interrupt(this); + g.start(); - var plaintext = createArray(ciphertext.length); - var block = createArray(16); + function mousemoved(event) { + noevent(event); - for (var i = 0; i < ciphertext.length; i += 16) { - copyArray(ciphertext, block, 0, i, i + 16); - block = this._aes.decrypt(block); + if (!g.moved) { + var dx = event.clientX - x0, + dy = event.clientY - y0; + g.moved = dx * dx + dy * dy > clickDistance2; + } - for (var j = 0; j < 16; j++) { - plaintext[i + j] = block[j] ^ this._lastCipherblock[j]; - } + g.event(event).zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = pointer(event, currentTarget), g.mouse[1]), g.extent, translateExtent)); + } - copyArray(ciphertext, this._lastCipherblock, 0, i, i + 16); - } + function mouseupped(event) { + v.on("mousemove.zoom mouseup.zoom", null); + yesdrag(event.view, g.moved); + noevent(event); + g.event(event).end(); + } + } - return plaintext; - }; + function dblclicked(event) { + for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + args[_key3 - 1] = arguments[_key3]; + } + if (!filter.apply(this, arguments)) return; + var t0 = this.__zoom, + p0 = pointer(event.changedTouches ? event.changedTouches[0] : event, this), + p1 = t0.invert(p0), + k1 = t0.k * (event.shiftKey ? 0.5 : 2), + t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent); + noevent(event); + if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0, event);else select(this).call(zoom.transform, t1, p0, event); + } - /** - * Mode Of Operation - Cipher Feedback (CFB) - */ - var ModeOfOperationCFB = function(key, iv, segmentSize) { - if (!(this instanceof ModeOfOperationCFB)) { - throw Error('AES must be instanitated with `new`'); - } + function touchstarted(event) { + for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { + args[_key4 - 1] = arguments[_key4]; + } - this.description = "Cipher Feedback"; - this.name = "cfb"; + if (!filter.apply(this, arguments)) return; + var touches = event.touches, + n = touches.length, + g = gesture(this, args, event.changedTouches.length === n).event(event), + started, + i, + t, + p; + nopropagation(event); - if (!iv) { - iv = createArray(16); + for (i = 0; i < n; ++i) { + t = touches[i], p = pointer(t, this); + p = [p, this.__zoom.invert(p), t.identifier]; + if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting;else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0; + } - } else if (iv.length != 16) { - throw new Error('invalid initialation vector size (must be 16 size)'); - } + if (touchstarting) touchstarting = clearTimeout(touchstarting); - if (!segmentSize) { segmentSize = 1; } + if (started) { + if (g.taps < 2) touchfirst = p[0], touchstarting = setTimeout(function () { + touchstarting = null; + }, touchDelay); + interrupt(this); + g.start(); + } + } - this.segmentSize = segmentSize; + function touchmoved(event) { + if (!this.__zooming) return; - this._shiftRegister = coerceArray(iv, true); + for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) { + args[_key5 - 1] = arguments[_key5]; + } - this._aes = new AES(key); - }; + var g = gesture(this, args).event(event), + touches = event.changedTouches, + n = touches.length, + i, + t, + p, + l; + noevent(event); - ModeOfOperationCFB.prototype.encrypt = function(plaintext) { - if ((plaintext.length % this.segmentSize) != 0) { - throw new Error('invalid plaintext size (must be segmentSize bytes)'); - } + for (i = 0; i < n; ++i) { + t = touches[i], p = pointer(t, this); + if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p; + } - var encrypted = coerceArray(plaintext, true); + t = g.that.__zoom; - var xorSegment; - for (var i = 0; i < encrypted.length; i += this.segmentSize) { - xorSegment = this._aes.encrypt(this._shiftRegister); - for (var j = 0; j < this.segmentSize; j++) { - encrypted[i + j] ^= xorSegment[j]; - } + if (g.touch1) { + var p0 = g.touch0[0], + l0 = g.touch0[1], + p1 = g.touch1[0], + l1 = g.touch1[1], + dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, + dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; + t = scale(t, Math.sqrt(dp / dl)); + p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; + l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; + } else if (g.touch0) p = g.touch0[0], l = g.touch0[1];else return; - // Shift the register - copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize); - copyArray(encrypted, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize); - } + g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent)); + } - return encrypted; - }; + function touchended(event) { + for (var _len6 = arguments.length, args = new Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) { + args[_key6 - 1] = arguments[_key6]; + } - ModeOfOperationCFB.prototype.decrypt = function(ciphertext) { - if ((ciphertext.length % this.segmentSize) != 0) { - throw new Error('invalid ciphertext size (must be segmentSize bytes)'); - } + if (!this.__zooming) return; + var g = gesture(this, args).event(event), + touches = event.changedTouches, + n = touches.length, + i, + t; + nopropagation(event); + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function () { + touchending = null; + }, touchDelay); - var plaintext = coerceArray(ciphertext, true); + for (i = 0; i < n; ++i) { + t = touches[i]; + if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1; + } - var xorSegment; - for (var i = 0; i < plaintext.length; i += this.segmentSize) { - xorSegment = this._aes.encrypt(this._shiftRegister); + if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1; + if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);else { + g.end(); // If this was a dbltap, reroute to the (optional) dblclick.zoom handler. - for (var j = 0; j < this.segmentSize; j++) { - plaintext[i + j] ^= xorSegment[j]; - } + if (g.taps === 2) { + t = pointer(t, this); - // Shift the register - copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize); - copyArray(ciphertext, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize); + if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) { + var p = select(this).on("dblclick.zoom"); + if (p) p.apply(this, arguments); } + } + } + } - return plaintext; - }; + zoom.wheelDelta = function (_) { + return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant(+_), zoom) : wheelDelta; + }; - /** - * Mode Of Operation - Output Feedback (OFB) - */ - var ModeOfOperationOFB = function(key, iv) { - if (!(this instanceof ModeOfOperationOFB)) { - throw Error('AES must be instanitated with `new`'); - } + zoom.filter = function (_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), zoom) : filter; + }; - this.description = "Output Feedback"; - this.name = "ofb"; + zoom.touchable = function (_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), zoom) : touchable; + }; - if (!iv) { - iv = createArray(16); + zoom.extent = function (_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; + }; - } else if (iv.length != 16) { - throw new Error('invalid initialation vector size (must be 16 bytes)'); - } + zoom.scaleExtent = function (_) { + return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]]; + }; - this._lastPrecipher = coerceArray(iv, true); - this._lastPrecipherIndex = 16; + zoom.translateExtent = function (_) { + 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]]]; + }; - this._aes = new AES(key); - }; + zoom.constrain = function (_) { + return arguments.length ? (constrain = _, zoom) : constrain; + }; - ModeOfOperationOFB.prototype.encrypt = function(plaintext) { - var encrypted = coerceArray(plaintext, true); + zoom.duration = function (_) { + return arguments.length ? (duration = +_, zoom) : duration; + }; - for (var i = 0; i < encrypted.length; i++) { - if (this._lastPrecipherIndex === 16) { - this._lastPrecipher = this._aes.encrypt(this._lastPrecipher); - this._lastPrecipherIndex = 0; - } - encrypted[i] ^= this._lastPrecipher[this._lastPrecipherIndex++]; - } + zoom.interpolate = function (_) { + return arguments.length ? (interpolate = _, zoom) : interpolate; + }; - return encrypted; - }; + zoom.on = function () { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? zoom : value; + }; - // Decryption is symetric - ModeOfOperationOFB.prototype.decrypt = ModeOfOperationOFB.prototype.encrypt; + zoom.clickDistance = function (_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); + }; + zoom.tapDistance = function (_) { + return arguments.length ? (tapDistance = +_, zoom) : tapDistance; + }; - /** - * Counter object for CTR common mode of operation - */ - var Counter = function(initialValue) { - if (!(this instanceof Counter)) { - throw Error('Counter must be instanitated with `new`'); - } + return zoom; + } - // We allow 0, but anything false-ish uses the default 1 - if (initialValue !== 0 && !initialValue) { initialValue = 1; } + /* + Bypasses features of D3's default projection stream pipeline that are unnecessary: + * Antimeridian clipping + * Spherical rotation + * Resampling + */ - if (typeof(initialValue) === 'number') { - this._counter = createArray(16); - this.setValue(initialValue); + function geoRawMercator() { + var project = mercatorRaw; + var k = 512 / Math.PI; // scale - } else { - this.setBytes(initialValue); - } - }; + var x = 0; + var y = 0; // translate - Counter.prototype.setValue = function(value) { - if (typeof(value) !== 'number' || parseInt(value) != value) { - throw new Error('invalid counter value (must be an integer)'); - } + var clipExtent = [[0, 0], [0, 0]]; - // We cannot safely handle numbers beyond the safe range for integers - if (value > Number.MAX_SAFE_INTEGER) { - throw new Error('integer value out of safe range'); - } + function projection(point) { + point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180); + return [point[0] * k + x, y - point[1] * k]; + } - for (var index = 15; index >= 0; --index) { - this._counter[index] = value % 256; - value = parseInt(value / 256); - } - }; + projection.invert = function (point) { + point = project.invert((point[0] - x) / k, (y - point[1]) / k); + return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI]; + }; - Counter.prototype.setBytes = function(bytes) { - bytes = coerceArray(bytes, true); + projection.scale = function (_) { + if (!arguments.length) return k; + k = +_; + return projection; + }; - if (bytes.length != 16) { - throw new Error('invalid counter bytes size (must be 16 bytes)'); - } + projection.translate = function (_) { + if (!arguments.length) return [x, y]; + x = +_[0]; + y = +_[1]; + return projection; + }; - this._counter = bytes; - }; + projection.clipExtent = function (_) { + if (!arguments.length) return clipExtent; + clipExtent = _; + return projection; + }; - Counter.prototype.increment = function() { - for (var i = 15; i >= 0; i--) { - if (this._counter[i] === 255) { - this._counter[i] = 0; - } else { - this._counter[i]++; - break; - } - } - }; + projection.transform = function (obj) { + if (!arguments.length) return identity$2.translate(x, y).scale(k); + x = +obj.x; + y = +obj.y; + k = +obj.k; + return projection; + }; + projection.stream = d3_geoTransform({ + point: function point(x, y) { + var vec = projection([x, y]); + this.stream.point(vec[0], vec[1]); + } + }).stream; + return projection; + } - /** - * Mode Of Operation - Counter (CTR) - */ - var ModeOfOperationCTR = function(key, counter) { - if (!(this instanceof ModeOfOperationCTR)) { - throw Error('AES must be instanitated with `new`'); - } + function geoOrthoNormalizedDotProduct(a, b, origin) { + if (geoVecEqual(origin, a) || geoVecEqual(origin, b)) { + return 1; // coincident points, treat as straight and try to remove + } - this.description = "Counter"; - this.name = "ctr"; + return geoVecNormalizedDot(a, b, origin); + } - if (!(counter instanceof Counter)) { - counter = new Counter(counter); - } + function geoOrthoFilterDotProduct(dotp, epsilon, lowerThreshold, upperThreshold, allowStraightAngles) { + var val = Math.abs(dotp); + + if (val < epsilon) { + return 0; // already orthogonal + } else if (allowStraightAngles && Math.abs(val - 1) < epsilon) { + return 0; // straight angle, which is okay in this case + } else if (val < lowerThreshold || val > upperThreshold) { + return dotp; // can be adjusted + } else { + return null; // ignore vertex + } + } - this._counter = counter; + function geoOrthoCalcScore(points, isClosed, epsilon, threshold) { + var score = 0; + var first = isClosed ? 0 : 1; + var last = isClosed ? points.length : points.length - 1; + var coords = points.map(function (p) { + return p.coord; + }); + var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180); + var upperThreshold = Math.cos(threshold * Math.PI / 180); - this._remainingCounter = null; - this._remainingCounterIndex = 16; + for (var i = first; i < last; i++) { + var a = coords[(i - 1 + coords.length) % coords.length]; + var origin = coords[i]; + var b = coords[(i + 1) % coords.length]; + var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon, lowerThreshold, upperThreshold); + if (dotp === null) continue; // ignore vertex - this._aes = new AES(key); - }; + score = score + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1))); + } - ModeOfOperationCTR.prototype.encrypt = function(plaintext) { - var encrypted = coerceArray(plaintext, true); + return score; + } // returns the maximum angle less than `lessThan` between the actual corner and a 0° or 90° corner - for (var i = 0; i < encrypted.length; i++) { - if (this._remainingCounterIndex === 16) { - this._remainingCounter = this._aes.encrypt(this._counter._counter); - this._remainingCounterIndex = 0; - this._counter.increment(); - } - encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++]; - } + function geoOrthoMaxOffsetAngle(coords, isClosed, lessThan) { + var max = -Infinity; + var first = isClosed ? 0 : 1; + var last = isClosed ? coords.length : coords.length - 1; - return encrypted; - }; + for (var i = first; i < last; i++) { + var a = coords[(i - 1 + coords.length) % coords.length]; + var origin = coords[i]; + var b = coords[(i + 1) % coords.length]; + var normalizedDotP = geoOrthoNormalizedDotProduct(a, b, origin); + var angle = Math.acos(Math.abs(normalizedDotP)) * 180 / Math.PI; + if (angle > 45) angle = 90 - angle; + if (angle >= lessThan) continue; + if (angle > max) max = angle; + } - // Decryption is symetric - ModeOfOperationCTR.prototype.decrypt = ModeOfOperationCTR.prototype.encrypt; + if (max === -Infinity) return null; + return max; + } // similar to geoOrthoCalcScore, but returns quickly if there is something to do + function geoOrthoCanOrthogonalize(coords, isClosed, epsilon, threshold, allowStraightAngles) { + var score = null; + var first = isClosed ? 0 : 1; + var last = isClosed ? coords.length : coords.length - 1; + var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180); + var upperThreshold = Math.cos(threshold * Math.PI / 180); - /////////////////////// - // Padding + for (var i = first; i < last; i++) { + var a = coords[(i - 1 + coords.length) % coords.length]; + var origin = coords[i]; + var b = coords[(i + 1) % coords.length]; + var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon, lowerThreshold, upperThreshold, allowStraightAngles); + if (dotp === null) continue; // ignore vertex - // See:https://tools.ietf.org/html/rfc2315 - function pkcs7pad(data) { - data = coerceArray(data, true); - var padder = 16 - (data.length % 16); - var result = createArray(data.length + padder); - copyArray(data, result); - for (var i = data.length; i < result.length; i++) { - result[i] = padder; - } - return result; - } + if (Math.abs(dotp) > 0) return 1; // something to do - function pkcs7strip(data) { - data = coerceArray(data, true); - if (data.length < 16) { throw new Error('PKCS#7 invalid length'); } + score = 0; // already square + } - var padder = data[data.length - 1]; - if (padder > 16) { throw new Error('PKCS#7 padding byte out of range'); } + return score; + } - var length = data.length - padder; - for (var i = 0; i < padder; i++) { - if (data[length + i] !== padder) { - throw new Error('PKCS#7 invalid padding byte'); - } - } + var call$2 = functionCall; + var fixRegExpWellKnownSymbolLogic$1 = fixRegexpWellKnownSymbolLogic; + var anObject$1 = anObject$n; + var toLength$3 = toLength$c; + var toString$8 = toString$k; + var requireObjectCoercible$7 = requireObjectCoercible$e; + var getMethod$1 = getMethod$7; + var advanceStringIndex = advanceStringIndex$3; + var regExpExec$1 = regexpExecAbstract; - var result = createArray(length); - copyArray(data, result, 0, 0, length); - return result; + // @@match logic + fixRegExpWellKnownSymbolLogic$1('match', function (MATCH, nativeMatch, maybeCallNative) { + return [ + // `String.prototype.match` method + // https://tc39.es/ecma262/#sec-string.prototype.match + function match(regexp) { + var O = requireObjectCoercible$7(this); + var matcher = regexp == undefined ? undefined : getMethod$1(regexp, MATCH); + return matcher ? call$2(matcher, regexp, O) : new RegExp(regexp)[MATCH](toString$8(O)); + }, + // `RegExp.prototype[@@match]` method + // https://tc39.es/ecma262/#sec-regexp.prototype-@@match + function (string) { + var rx = anObject$1(this); + var S = toString$8(string); + var res = maybeCallNative(nativeMatch, rx, S); + + if (res.done) return res.value; + + if (!rx.global) return regExpExec$1(rx, S); + + var fullUnicode = rx.unicode; + rx.lastIndex = 0; + var A = []; + var n = 0; + var result; + while ((result = regExpExec$1(rx, S)) !== null) { + var matchStr = toString$8(result[0]); + A[n] = matchStr; + if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength$3(rx.lastIndex), fullUnicode); + n++; + } + return n === 0 ? null : A; } + ]; + }); + + var $$s = _export; + var FREEZING = freezing; + var fails$9 = fails$V; + var isObject$4 = isObject$s; + var onFreeze = internalMetadata.exports.onFreeze; + + // eslint-disable-next-line es/no-object-freeze -- safe + var $freeze = Object.freeze; + var FAILS_ON_PRIMITIVES = fails$9(function () { $freeze(1); }); - /////////////////////// - // Exporting + // `Object.freeze` method + // https://tc39.es/ecma262/#sec-object.freeze + $$s({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !FREEZING }, { + freeze: function freeze(it) { + return $freeze && isObject$4(it) ? $freeze(onFreeze(it)) : it; + } + }); + // Returns true if a and b have the same elements at the same indices. + function utilArrayIdentical(a, b) { + // an array is always identical to itself + if (a === b) return true; + var i = a.length; + if (i !== b.length) return false; - // The block cipher - var aesjs = { - AES: AES, - Counter: Counter, - - ModeOfOperation: { - ecb: ModeOfOperationECB, - cbc: ModeOfOperationCBC, - cfb: ModeOfOperationCFB, - ofb: ModeOfOperationOFB, - ctr: ModeOfOperationCTR - }, + while (i--) { + if (a[i] !== b[i]) return false; + } - utils: { - hex: convertHex, - utf8: convertUtf8 - }, + return true; + } // http://2ality.com/2015/01/es6-set-operations.html + // Difference (a \ b): create a set that contains those elements of set a that are not in set b. + // This operation is also sometimes called minus (-). + // var a = [1,2,3]; + // var b = [4,3,2]; + // utilArrayDifference(a, b) + // [1] + // utilArrayDifference(b, a) + // [4] - padding: { - pkcs7: { - pad: pkcs7pad, - strip: pkcs7strip - } - }, + function utilArrayDifference(a, b) { + var other = new Set(b); + return Array.from(new Set(a)).filter(function (v) { + return !other.has(v); + }); + } // Intersection (a ∩ b): create a set that contains those elements of set a that are also in set b. + // var a = [1,2,3]; + // var b = [4,3,2]; + // utilArrayIntersection(a, b) + // [2,3] - _arrayTest: { - coerceArray: coerceArray, - createArray: createArray, - copyArray: copyArray, - } - }; + function utilArrayIntersection(a, b) { + var other = new Set(b); + return Array.from(new Set(a)).filter(function (v) { + return other.has(v); + }); + } // Union (a ∪ b): create a set that contains the elements of both set a and set b. + // var a = [1,2,3]; + // var b = [4,3,2]; + // utilArrayUnion(a, b) + // [1,2,3,4] + function utilArrayUnion(a, b) { + var result = new Set(a); + b.forEach(function (v) { + result.add(v); + }); + return Array.from(result); + } // Returns an Array with all the duplicates removed + // var a = [1,1,2,3,3]; + // utilArrayUniq(a) + // [1,2,3] - // node.js - { - module.exports = aesjs; + function utilArrayUniq(a) { + return Array.from(new Set(a)); + } // Splits array into chunks of given chunk size + // var a = [1,2,3,4,5,6,7]; + // utilArrayChunk(a, 3); + // [[1,2,3],[4,5,6],[7]]; - // RequireJS/AMD - // http://www.requirejs.org/docs/api.html - // https://github.com/amdjs/amdjs-api/wiki/AMD - } + function utilArrayChunk(a, chunkSize) { + if (!chunkSize || chunkSize < 0) return [a.slice()]; + var result = new Array(Math.ceil(a.length / chunkSize)); + return Array.from(result, function (item, i) { + return a.slice(i * chunkSize, i * chunkSize + chunkSize); + }); + } // Flattens two level array into a single level + // var a = [[1,2,3],[4,5,6],[7]]; + // utilArrayFlatten(a); + // [1,2,3,4,5,6,7]; + function utilArrayFlatten(a) { + return a.reduce(function (acc, val) { + return acc.concat(val); + }, []); + } // Groups the items of the Array according to the given key + // `key` can be passed as a property or as a key function + // + // var pets = [ + // { type: 'Dog', name: 'Spot' }, + // { type: 'Cat', name: 'Tiger' }, + // { type: 'Dog', name: 'Rover' }, + // { type: 'Cat', name: 'Leo' } + // ]; + // + // utilArrayGroupBy(pets, 'type') + // { + // 'Dog': [{type: 'Dog', name: 'Spot'}, {type: 'Dog', name: 'Rover'}], + // 'Cat': [{type: 'Cat', name: 'Tiger'}, {type: 'Cat', name: 'Leo'}] + // } + // + // utilArrayGroupBy(pets, function(item) { return item.name.length; }) + // { + // 3: [{type: 'Cat', name: 'Leo'}], + // 4: [{type: 'Dog', name: 'Spot'}], + // 5: [{type: 'Cat', name: 'Tiger'}, {type: 'Dog', name: 'Rover'}] + // } - })(); - }); + function utilArrayGroupBy(a, key) { + return a.reduce(function (acc, item) { + var group = typeof key === 'function' ? key(item) : item[key]; + (acc[group] = acc[group] || []).push(item); + return acc; + }, {}); + } // Returns an Array with all the duplicates removed + // where uniqueness determined by the given key + // `key` can be passed as a property or as a key function + // + // var pets = [ + // { type: 'Dog', name: 'Spot' }, + // { type: 'Cat', name: 'Tiger' }, + // { type: 'Dog', name: 'Rover' }, + // { type: 'Cat', name: 'Leo' } + // ]; + // + // utilArrayUniqBy(pets, 'type') + // [ + // { type: 'Dog', name: 'Spot' }, + // { type: 'Cat', name: 'Tiger' } + // ] + // + // utilArrayUniqBy(pets, function(item) { return item.name.length; }) + // [ + // { type: 'Dog', name: 'Spot' }, + // { type: 'Cat', name: 'Tiger' }, + // { type: 'Cat', name: 'Leo' } + // } - // See https://github.com/ricmoo/aes-js - // We can use keys that are 128 bits (16 bytes), 192 bits (24 bytes) or 256 bits (32 bytes). - // To generate a random key: window.crypto.getRandomValues(new Uint8Array(16)); + function utilArrayUniqBy(a, key) { + var seen = new Set(); + return a.reduce(function (acc, item) { + var val = typeof key === 'function' ? key(item) : item[key]; + + if (val && !seen.has(val)) { + seen.add(val); + acc.push(item); + } + + return acc; + }, []); + } + + var uncurryThis$d = functionUncurryThis; + + // `thisNumberValue` abstract operation + // https://tc39.es/ecma262/#sec-thisnumbervalue + var thisNumberValue$3 = uncurryThis$d(1.0.valueOf); + + var DESCRIPTORS$3 = descriptors; + var global$a = global$1o; + var uncurryThis$c = functionUncurryThis; + var isForced = isForced_1; + var redefine$2 = redefine$h.exports; + var hasOwn$1 = hasOwnProperty_1; + var inheritIfRequired = inheritIfRequired$4; + var isPrototypeOf = objectIsPrototypeOf; + var isSymbol$1 = isSymbol$6; + var toPrimitive$1 = toPrimitive$3; + var fails$8 = fails$V; + var getOwnPropertyNames = objectGetOwnPropertyNames.f; + var getOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f; + var defineProperty = objectDefineProperty.f; + var thisNumberValue$2 = thisNumberValue$3; + var trim$2 = stringTrim.trim; + + var NUMBER = 'Number'; + var NativeNumber = global$a[NUMBER]; + var NumberPrototype = NativeNumber.prototype; + var TypeError$4 = global$a.TypeError; + var arraySlice$1 = uncurryThis$c(''.slice); + var charCodeAt$1 = uncurryThis$c(''.charCodeAt); + + // `ToNumeric` abstract operation + // https://tc39.es/ecma262/#sec-tonumeric + var toNumeric = function (value) { + var primValue = toPrimitive$1(value, 'number'); + return typeof primValue == 'bigint' ? primValue : toNumber$1(primValue); + }; + + // `ToNumber` abstract operation + // https://tc39.es/ecma262/#sec-tonumber + var toNumber$1 = function (argument) { + var it = toPrimitive$1(argument, 'number'); + var first, third, radix, maxCode, digits, length, index, code; + if (isSymbol$1(it)) throw TypeError$4('Cannot convert a Symbol value to a number'); + if (typeof it == 'string' && it.length > 2) { + it = trim$2(it); + first = charCodeAt$1(it, 0); + if (first === 43 || first === 45) { + third = charCodeAt$1(it, 2); + if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix + } else if (first === 48) { + switch (charCodeAt$1(it, 1)) { + case 66: case 98: radix = 2; maxCode = 49; break; // fast equal of /^0b[01]+$/i + case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i + default: return +it; + } + digits = arraySlice$1(it, 2); + length = digits.length; + for (index = 0; index < length; index++) { + code = charCodeAt$1(digits, index); + // parseInt parses a string to a first unavailable symbol + // but ToNumber should return NaN if a string contains unavailable symbols + if (code < 48 || code > maxCode) return NaN; + } return parseInt(digits, radix); + } + } return +it; + }; + + // `Number` constructor + // https://tc39.es/ecma262/#sec-number-constructor + if (isForced(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) { + var NumberWrapper = function Number(value) { + var n = arguments.length < 1 ? 0 : NativeNumber(toNumeric(value)); + var dummy = this; + // check on 1..constructor(foo) case + return isPrototypeOf(NumberPrototype, dummy) && fails$8(function () { thisNumberValue$2(dummy); }) + ? inheritIfRequired(Object(n), dummy, NumberWrapper) : n; + }; + for (var keys = DESCRIPTORS$3 ? getOwnPropertyNames(NativeNumber) : ( + // ES3: + 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' + + // ES2015 (in case, if modules with ES2015 Number statics required before): + 'EPSILON,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,isFinite,isInteger,isNaN,isSafeInteger,parseFloat,parseInt,' + + // ESNext + 'fromString,range' + ).split(','), j$1 = 0, key; keys.length > j$1; j$1++) { + if (hasOwn$1(NativeNumber, key = keys[j$1]) && !hasOwn$1(NumberWrapper, key)) { + defineProperty(NumberWrapper, key, getOwnPropertyDescriptor$2(NativeNumber, key)); + } + } + NumberWrapper.prototype = NumberPrototype; + NumberPrototype.constructor = NumberWrapper; + redefine$2(global$a, NUMBER, NumberWrapper); + } + + var diacritics = {}; + + var remove$6 = diacritics.remove = removeDiacritics; + var replacementList = [{ + base: ' ', + chars: "\xA0" + }, { + base: '0', + chars: "\u07C0" + }, { + base: 'A', + chars: "\u24B6\uFF21\xC0\xC1\xC2\u1EA6\u1EA4\u1EAA\u1EA8\xC3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\xC4\u01DE\u1EA2\xC5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F" + }, { + base: 'AA', + chars: "\uA732" + }, { + base: 'AE', + chars: "\xC6\u01FC\u01E2" + }, { + base: 'AO', + chars: "\uA734" + }, { + base: 'AU', + chars: "\uA736" + }, { + base: 'AV', + chars: "\uA738\uA73A" + }, { + base: 'AY', + chars: "\uA73C" + }, { + base: 'B', + chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181" + }, { + base: 'C', + chars: "\u24B8\uFF23\uA73E\u1E08\u0106C\u0108\u010A\u010C\xC7\u0187\u023B" + }, { + base: 'D', + chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779" + }, { + base: 'Dh', + chars: "\xD0" + }, { + base: 'DZ', + chars: "\u01F1\u01C4" + }, { + base: 'Dz', + chars: "\u01F2\u01C5" + }, { + base: 'E', + chars: "\u025B\u24BA\uFF25\xC8\xC9\xCA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\xCB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E\u1D07" + }, { + base: 'F', + chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B" + }, { + base: 'G', + chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262" + }, { + base: 'H', + chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D" + }, { + base: 'I', + chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197" + }, { + base: 'J', + chars: "\u24BF\uFF2A\u0134\u0248\u0237" + }, { + base: 'K', + chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2" + }, { + base: 'L', + chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780" + }, { + base: 'LJ', + chars: "\u01C7" + }, { + base: 'Lj', + chars: "\u01C8" + }, { + base: 'M', + chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB" + }, { + base: 'N', + chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E" + }, { + base: 'NJ', + chars: "\u01CA" + }, { + base: 'Nj', + chars: "\u01CB" + }, { + base: 'O', + 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" + }, { + base: 'OE', + chars: "\u0152" + }, { + base: 'OI', + chars: "\u01A2" + }, { + base: 'OO', + chars: "\uA74E" + }, { + base: 'OU', + chars: "\u0222" + }, { + base: 'P', + chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754" + }, { + base: 'Q', + chars: "\u24C6\uFF31\uA756\uA758\u024A" + }, { + base: 'R', + chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782" + }, { + base: 'S', + chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784" + }, { + base: 'T', + chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786" + }, { + base: 'Th', + chars: "\xDE" + }, { + base: 'TZ', + chars: "\uA728" + }, { + base: 'U', + 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" + }, { + base: 'V', + chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245" + }, { + base: 'VY', + chars: "\uA760" + }, { + base: 'W', + chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72" + }, { + base: 'X', + chars: "\u24CD\uFF38\u1E8A\u1E8C" + }, { + base: 'Y', + chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE" + }, { + base: 'Z', + chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762" + }, { + base: 'a', + chars: "\u24D0\uFF41\u1E9A\xE0\xE1\xE2\u1EA7\u1EA5\u1EAB\u1EA9\xE3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\xE4\u01DF\u1EA3\xE5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250\u0251" + }, { + base: 'aa', + chars: "\uA733" + }, { + base: 'ae', + chars: "\xE6\u01FD\u01E3" + }, { + base: 'ao', + chars: "\uA735" + }, { + base: 'au', + chars: "\uA737" + }, { + base: 'av', + chars: "\uA739\uA73B" + }, { + base: 'ay', + chars: "\uA73D" + }, { + base: 'b', + chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182" + }, { + base: 'c', + chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\xE7\u1E09\u0188\u023C\uA73F\u2184" + }, { + base: 'd', + chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA" + }, { + base: 'dh', + chars: "\xF0" + }, { + base: 'dz', + chars: "\u01F3\u01C6" + }, { + base: 'e', + chars: "\u24D4\uFF45\xE8\xE9\xEA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\xEB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u01DD" + }, { + base: 'f', + chars: "\u24D5\uFF46\u1E1F\u0192" + }, { + base: 'ff', + chars: "\uFB00" + }, { + base: 'fi', + chars: "\uFB01" + }, { + base: 'fl', + chars: "\uFB02" + }, { + base: 'ffi', + chars: "\uFB03" + }, { + base: 'ffl', + chars: "\uFB04" + }, { + base: 'g', + chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79" + }, { + base: 'h', + chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265" + }, { + base: 'hv', + chars: "\u0195" + }, { + base: 'i', + chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131" + }, { + base: 'j', + chars: "\u24D9\uFF4A\u0135\u01F0\u0249" + }, { + base: 'k', + chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3" + }, { + base: 'l', + chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D" + }, { + base: 'lj', + chars: "\u01C9" + }, { + base: 'm', + chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F" + }, { + base: 'n', + chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509" + }, { + base: 'nj', + chars: "\u01CC" + }, { + base: 'o', + 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" + }, { + base: 'oe', + chars: "\u0153" + }, { + base: 'oi', + chars: "\u01A3" + }, { + base: 'oo', + chars: "\uA74F" + }, { + base: 'ou', + chars: "\u0223" + }, { + base: 'p', + chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1" + }, { + base: 'q', + chars: "\u24E0\uFF51\u024B\uA757\uA759" + }, { + base: 'r', + chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783" + }, { + base: 's', + chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282" + }, { + base: 'ss', + chars: "\xDF" + }, { + base: 't', + chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787" + }, { + base: 'th', + chars: "\xFE" + }, { + base: 'tz', + chars: "\uA729" + }, { + base: 'u', + 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" + }, { + base: 'v', + chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C" + }, { + base: 'vy', + chars: "\uA761" + }, { + base: 'w', + chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73" + }, { + base: 'x', + chars: "\u24E7\uFF58\u1E8B\u1E8D" + }, { + base: 'y', + chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF" + }, { + base: 'z', + chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763" + }]; + var diacriticsMap = {}; - // This default signing key is built into iD and can be used to mask/unmask sensitive values. - var DEFAULT_128 = [250, 157, 60, 79, 142, 134, 229, 129, 138, 126, 210, 129, 29, 71, 160, 208]; + for (var i$1 = 0; i$1 < replacementList.length; i$1 += 1) { + var chars = replacementList[i$1].chars; + for (var j = 0; j < chars.length; j += 1) { + diacriticsMap[chars[j]] = replacementList[i$1].base; + } + } - function utilAesEncrypt(text, key) { - key = key || DEFAULT_128; - var textBytes = aesJs.utils.utf8.toBytes(text); - var aesCtr = new aesJs.ModeOfOperation.ctr(key); - var encryptedBytes = aesCtr.encrypt(textBytes); - var encryptedHex = aesJs.utils.hex.fromBytes(encryptedBytes); - return encryptedHex; + function removeDiacritics(str) { + return str.replace(/[^\u0000-\u007e]/g, function (c) { + return diacriticsMap[c] || c; + }); } + diacritics.replacementList = replacementList; + diacritics.diacriticsMap = diacriticsMap; - function utilAesDecrypt(encryptedHex, key) { - key = key || DEFAULT_128; - var encryptedBytes = aesJs.utils.hex.toBytes(encryptedHex); - var aesCtr = new aesJs.ModeOfOperation.ctr(key); - var decryptedBytes = aesCtr.decrypt(encryptedBytes); - var text = aesJs.utils.utf8.fromBytes(decryptedBytes); - return text; - } + var lib = {}; - function utilCleanTags(tags) { - var out = {}; - for (var k in tags) { - if (!k) { continue; } - var v = tags[k]; - if (v !== undefined) { - out[k] = cleanValue(k, v); - } - } + var isArabic$1 = {}; + + Object.defineProperty(isArabic$1, "__esModule", { + value: true + }); + var arabicBlocks = [[0x0600, 0x06FF], [0x0750, 0x077F], [0x08A0, 0x08FF], [0xFB50, 0xFDFF], [0xFE70, 0xFEFF], [0x10E60, 0x10E7F], [0x1EC70, 0x1ECBF], [0x1EE00, 0x1EEFF] // Mathematical Alphabetic symbols https://www.unicode.org/charts/PDF/U1EE00.pdf + ]; - return out; + function isArabic(_char) { + if (_char.length > 1) { + // allow the newer chars? + throw new Error('isArabic works on only one-character strings'); + } + var code = _char.charCodeAt(0); - function cleanValue(k, v) { - function keepSpaces(k) { - return /_hours|_times|:conditional$/.test(k); - } + for (var i = 0; i < arabicBlocks.length; i++) { + var block = arabicBlocks[i]; - function skip(k) { - return /^(description|note|fixme)$/.test(k); - } + if (code >= block[0] && code <= block[1]) { + return true; + } + } - if (skip(k)) { return v; } + return false; + } - var cleaned = v - .split(';') - .map(function(s) { return s.trim(); }) - .join(keepSpaces(k) ? '; ' : ';'); + isArabic$1.isArabic = isArabic; - // The code below is not intended to validate websites and emails. - // It is only intended to prevent obvious copy-paste errors. (#2323) - // clean website- and email-like tags - if (k.indexOf('website') !== -1 || - k.indexOf('email') !== -1 || - cleaned.indexOf('http') === 0) { - cleaned = cleaned - .replace(/[\u200B-\u200F\uFEFF]/g, ''); // strip LRM and other zero width chars + function isMath(_char2) { + if (_char2.length > 2) { + // allow the newer chars? + throw new Error('isMath works on only one-character strings'); + } - } + var code = _char2.charCodeAt(0); - return cleaned; - } + return code >= 0x660 && code <= 0x66C || code >= 0x6F0 && code <= 0x6F9; } - // Like selection.property('value', ...), but avoids no-op value sets, - // which can result in layout/repaint thrashing in some situations. - function utilGetSetValue(selection, value) { - function d3_selection_value(value) { - function valueNull() { - delete this.value; - } + isArabic$1.isMath = isMath; - function valueConstant() { - if (this.value !== value) { - this.value = value; - } - } + var GlyphSplitter$1 = {}; - function valueFunction() { - var x = value.apply(this, arguments); - if (x == null) { - delete this.value; - } else if (this.value !== x) { - this.value = x; - } - } + var reference = {}; - return value == null - ? valueNull : (typeof value === 'function' - ? valueFunction : valueConstant); - } + var unicodeArabic = {}; - if (arguments.length === 1) { - return selection.property('value'); + Object.defineProperty(unicodeArabic, "__esModule", { + value: true + }); + var arabicReference = { + "alef": { + "normal": ["\u0627"], + "madda_above": { + "normal": ["\u0627\u0653", "\u0622"], + "isolated": "\uFE81", + "final": "\uFE82" + }, + "hamza_above": { + "normal": ["\u0627\u0654", "\u0623"], + "isolated": "\uFE83", + "final": "\uFE84" + }, + "hamza_below": { + "normal": ["\u0627\u0655", "\u0625"], + "isolated": "\uFE87", + "final": "\uFE88" + }, + "wasla": { + "normal": "\u0671", + "isolated": "\uFB50", + "final": "\uFB51" + }, + "wavy_hamza_above": ["\u0672"], + "wavy_hamza_below": ["\u0627\u065F", "\u0673"], + "high_hamza": ["\u0675", "\u0627\u0674"], + "indic_two_above": ["\u0773"], + "indic_three_above": ["\u0774"], + "fathatan": { + "normal": ["\u0627\u064B"], + "final": "\uFD3C", + "isolated": "\uFD3D" + }, + "isolated": "\uFE8D", + "final": "\uFE8E" + }, + "beh": { + "normal": ["\u0628"], + "dotless": ["\u066E"], + "three_dots_horizontally_below": ["\u0750"], + "dot_below_three_dots_above": ["\u0751"], + "three_dots_pointing_upwards_below": ["\u0752"], + "three_dots_pointing_upwards_below_two_dots_above": ["\u0753"], + "two_dots_below_dot_above": ["\u0754"], + "inverted_small_v_below": ["\u0755"], + "small_v": ["\u0756"], + "small_v_below": ["\u08A0"], + "hamza_above": ["\u08A1"], + "small_meem_above": ["\u08B6"], + "isolated": "\uFE8F", + "final": "\uFE90", + "initial": "\uFE91", + "medial": "\uFE92" + }, + "teh marbuta": { + "normal": ["\u0629"], + "isolated": "\uFE93", + "final": "\uFE94" + }, + "teh": { + "normal": ["\u062A"], + "ring": ["\u067C"], + "three_dots_above_downwards": ["\u067D"], + "small_teh_above": ["\u08B8"], + "isolated": "\uFE95", + "final": "\uFE96", + "initial": "\uFE97", + "medial": "\uFE98" + }, + "theh": { + "normal": ["\u062B"], + "isolated": "\uFE99", + "final": "\uFE9A", + "initial": "\uFE9B", + "medial": "\uFE9C" + }, + "jeem": { + "normal": ["\u062C"], + "two_dots_above": ["\u08A2"], + "isolated": "\uFE9D", + "final": "\uFE9E", + "initial": "\uFE9F", + "medial": "\uFEA0" + }, + "hah": { + "normal": ["\u062D"], + "hamza_above": ["\u0681"], + "two_dots_vertical_above": ["\u0682"], + "three_dots_above": ["\u0685"], + "two_dots_above": ["\u0757"], + "three_dots_pointing_upwards_below": ["\u0758"], + "small_tah_below": ["\u076E"], + "small_tah_two_dots": ["\u076F"], + "small_tah_above": ["\u0772"], + "indic_four_below": ["\u077C"], + "isolated": "\uFEA1", + "final": "\uFEA2", + "initial": "\uFEA3", + "medial": "\uFEA4" + }, + "khah": { + "normal": ["\u062E"], + "isolated": "\uFEA5", + "final": "\uFEA6", + "initial": "\uFEA7", + "medial": "\uFEA8" + }, + "dal": { + "normal": ["\u062F"], + "ring": ["\u0689"], + "dot_below": ["\u068A"], + "dot_below_small_tah": ["\u068B"], + "three_dots_above_downwards": ["\u068F"], + "four_dots_above": ["\u0690"], + "inverted_v": ["\u06EE"], + "two_dots_vertically_below_small_tah": ["\u0759"], + "inverted_small_v_below": ["\u075A"], + "three_dots_below": ["\u08AE"], + "isolated": "\uFEA9", + "final": "\uFEAA" + }, + "thal": { + "normal": ["\u0630"], + "isolated": "\uFEAB", + "final": "\uFEAC" + }, + "reh": { + "normal": ["\u0631"], + "small_v": ["\u0692"], + "ring": ["\u0693"], + "dot_below": ["\u0694"], + "small_v_below": ["\u0695"], + "dot_below_dot_above": ["\u0696"], + "two_dots_above": ["\u0697"], + "four_dots_above": ["\u0699"], + "inverted_v": ["\u06EF"], + "stroke": ["\u075B"], + "two_dots_vertically_above": ["\u076B"], + "hamza_above": ["\u076C"], + "small_tah_two_dots": ["\u0771"], + "loop": ["\u08AA"], + "small_noon_above": ["\u08B9"], + "isolated": "\uFEAD", + "final": "\uFEAE" + }, + "zain": { + "normal": ["\u0632"], + "inverted_v_above": ["\u08B2"], + "isolated": "\uFEAF", + "final": "\uFEB0" + }, + "seen": { + "normal": ["\u0633"], + "dot_below_dot_above": ["\u069A"], + "three_dots_below": ["\u069B"], + "three_dots_below_three_dots_above": ["\u069C"], + "four_dots_above": ["\u075C"], + "two_dots_vertically_above": ["\u076D"], + "small_tah_two_dots": ["\u0770"], + "indic_four_above": ["\u077D"], + "inverted_v": ["\u077E"], + "isolated": "\uFEB1", + "final": "\uFEB2", + "initial": "\uFEB3", + "medial": "\uFEB4" + }, + "sheen": { + "normal": ["\u0634"], + "dot_below": ["\u06FA"], + "isolated": "\uFEB5", + "final": "\uFEB6", + "initial": "\uFEB7", + "medial": "\uFEB8" + }, + "sad": { + "normal": ["\u0635"], + "two_dots_below": ["\u069D"], + "three_dots_above": ["\u069E"], + "three_dots_below": ["\u08AF"], + "isolated": "\uFEB9", + "final": "\uFEBA", + "initial": "\uFEBB", + "medial": "\uFEBC" + }, + "dad": { + "normal": ["\u0636"], + "dot_below": ["\u06FB"], + "isolated": "\uFEBD", + "final": "\uFEBE", + "initial": "\uFEBF", + "medial": "\uFEC0" + }, + "tah": { + "normal": ["\u0637"], + "three_dots_above": ["\u069F"], + "two_dots_above": ["\u08A3"], + "isolated": "\uFEC1", + "final": "\uFEC2", + "initial": "\uFEC3", + "medial": "\uFEC4" + }, + "zah": { + "normal": ["\u0638"], + "isolated": "\uFEC5", + "final": "\uFEC6", + "initial": "\uFEC7", + "medial": "\uFEC8" + }, + "ain": { + "normal": ["\u0639"], + "three_dots_above": ["\u06A0"], + "two_dots_above": ["\u075D"], + "three_dots_pointing_downwards_above": ["\u075E"], + "two_dots_vertically_above": ["\u075F"], + "three_dots_below": ["\u08B3"], + "isolated": "\uFEC9", + "final": "\uFECA", + "initial": "\uFECB", + "medial": "\uFECC" + }, + "ghain": { + "normal": ["\u063A"], + "dot_below": ["\u06FC"], + "isolated": "\uFECD", + "final": "\uFECE", + "initial": "\uFECF", + "medial": "\uFED0" + }, + "feh": { + "normal": ["\u0641"], + "dotless": ["\u06A1"], + "dot_moved_below": ["\u06A2"], + "dot_below": ["\u06A3"], + "three_dots_below": ["\u06A5"], + "two_dots_below": ["\u0760"], + "three_dots_pointing_upwards_below": ["\u0761"], + "dot_below_three_dots_above": ["\u08A4"], + "isolated": "\uFED1", + "final": "\uFED2", + "initial": "\uFED3", + "medial": "\uFED4" + }, + "qaf": { + "normal": ["\u0642"], + "dotless": ["\u066F"], + "dot_above": ["\u06A7"], + "three_dots_above": ["\u06A8"], + "dot_below": ["\u08A5"], + "isolated": "\uFED5", + "final": "\uFED6", + "initial": "\uFED7", + "medial": "\uFED8" + }, + "kaf": { + "normal": ["\u0643"], + "swash": ["\u06AA"], + "ring": ["\u06AB"], + "dot_above": ["\u06AC"], + "three_dots_below": ["\u06AE"], + "two_dots_above": ["\u077F"], + "dot_below": ["\u08B4"], + "isolated": "\uFED9", + "final": "\uFEDA", + "initial": "\uFEDB", + "medial": "\uFEDC" + }, + "lam": { + "normal": ["\u0644"], + "small_v": ["\u06B5"], + "dot_above": ["\u06B6"], + "three_dots_above": ["\u06B7"], + "three_dots_below": ["\u06B8"], + "bar": ["\u076A"], + "double_bar": ["\u08A6"], + "isolated": "\uFEDD", + "final": "\uFEDE", + "initial": "\uFEDF", + "medial": "\uFEE0" + }, + "meem": { + "normal": ["\u0645"], + "dot_above": ["\u0765"], + "dot_below": ["\u0766"], + "three_dots_above": ["\u08A7"], + "isolated": "\uFEE1", + "final": "\uFEE2", + "initial": "\uFEE3", + "medial": "\uFEE4" + }, + "noon": { + "normal": ["\u0646"], + "dot_below": ["\u06B9"], + "ring": ["\u06BC"], + "three_dots_above": ["\u06BD"], + "two_dots_below": ["\u0767"], + "small_tah": ["\u0768"], + "small_v": ["\u0769"], + "isolated": "\uFEE5", + "final": "\uFEE6", + "initial": "\uFEE7", + "medial": "\uFEE8" + }, + "heh": { + "normal": ["\u0647"], + "isolated": "\uFEE9", + "final": "\uFEEA", + "initial": "\uFEEB", + "medial": "\uFEEC" + }, + "waw": { + "normal": ["\u0648"], + "hamza_above": { + "normal": ["\u0624", "\u0648\u0654"], + "isolated": "\uFE85", + "final": "\uFE86" + }, + "high_hamza": ["\u0676", "\u0648\u0674"], + "ring": ["\u06C4"], + "two_dots_above": ["\u06CA"], + "dot_above": ["\u06CF"], + "indic_two_above": ["\u0778"], + "indic_three_above": ["\u0779"], + "dot_within": ["\u08AB"], + "isolated": "\uFEED", + "final": "\uFEEE" + }, + "alef_maksura": { + "normal": ["\u0649"], + "hamza_above": ["\u0626", "\u064A\u0654"], + "initial": "\uFBE8", + "medial": "\uFBE9", + "isolated": "\uFEEF", + "final": "\uFEF0" + }, + "yeh": { + "normal": ["\u064A"], + "hamza_above": { + "normal": ["\u0626", "\u0649\u0654"], + "isolated": "\uFE89", + "final": "\uFE8A", + "initial": "\uFE8B", + "medial": "\uFE8C" + }, + "two_dots_below_hamza_above": ["\u08A8"], + "high_hamza": ["\u0678", "\u064A\u0674"], + "tail": ["\u06CD"], + "small_v": ["\u06CE"], + "three_dots_below": ["\u06D1"], + "two_dots_below_dot_above": ["\u08A9"], + "two_dots_below_small_noon_above": ["\u08BA"], + "isolated": "\uFEF1", + "final": "\uFEF2", + "initial": "\uFEF3", + "medial": "\uFEF4" + }, + "tteh": { + "normal": ["\u0679"], + "isolated": "\uFB66", + "final": "\uFB67", + "initial": "\uFB68", + "medial": "\uFB69" + }, + "tteheh": { + "normal": ["\u067A"], + "isolated": "\uFB5E", + "final": "\uFB5F", + "initial": "\uFB60", + "medial": "\uFB61" + }, + "beeh": { + "normal": ["\u067B"], + "isolated": "\uFB52", + "final": "\uFB53", + "initial": "\uFB54", + "medial": "\uFB55" + }, + "peh": { + "normal": ["\u067E"], + "small_meem_above": ["\u08B7"], + "isolated": "\uFB56", + "final": "\uFB57", + "initial": "\uFB58", + "medial": "\uFB59" + }, + "teheh": { + "normal": ["\u067F"], + "isolated": "\uFB62", + "final": "\uFB63", + "initial": "\uFB64", + "medial": "\uFB65" + }, + "beheh": { + "normal": ["\u0680"], + "isolated": "\uFB5A", + "final": "\uFB5B", + "initial": "\uFB5C", + "medial": "\uFB5D" + }, + "nyeh": { + "normal": ["\u0683"], + "isolated": "\uFB76", + "final": "\uFB77", + "initial": "\uFB78", + "medial": "\uFB79" + }, + "dyeh": { + "normal": ["\u0684"], + "isolated": "\uFB72", + "final": "\uFB73", + "initial": "\uFB74", + "medial": "\uFB75" + }, + "tcheh": { + "normal": ["\u0686"], + "dot_above": ["\u06BF"], + "isolated": "\uFB7A", + "final": "\uFB7B", + "initial": "\uFB7C", + "medial": "\uFB7D" + }, + "tcheheh": { + "normal": ["\u0687"], + "isolated": "\uFB7E", + "final": "\uFB7F", + "initial": "\uFB80", + "medial": "\uFB81" + }, + "ddal": { + "normal": ["\u0688"], + "isolated": "\uFB88", + "final": "\uFB89" + }, + "dahal": { + "normal": ["\u068C"], + "isolated": "\uFB84", + "final": "\uFB85" + }, + "ddahal": { + "normal": ["\u068D"], + "isolated": "\uFB82", + "final": "\uFB83" + }, + "dul": { + "normal": ["\u068F", "\u068E"], + "isolated": "\uFB86", + "final": "\uFB87" + }, + "rreh": { + "normal": ["\u0691"], + "isolated": "\uFB8C", + "final": "\uFB8D" + }, + "jeh": { + "normal": ["\u0698"], + "isolated": "\uFB8A", + "final": "\uFB8B" + }, + "veh": { + "normal": ["\u06A4"], + "isolated": "\uFB6A", + "final": "\uFB6B", + "initial": "\uFB6C", + "medial": "\uFB6D" + }, + "peheh": { + "normal": ["\u06A6"], + "isolated": "\uFB6E", + "final": "\uFB6F", + "initial": "\uFB70", + "medial": "\uFB71" + }, + "keheh": { + "normal": ["\u06A9"], + "dot_above": ["\u0762"], + "three_dots_above": ["\u0763"], + "three_dots_pointing_upwards_below": ["\u0764"], + "isolated": "\uFB8E", + "final": "\uFB8F", + "initial": "\uFB90", + "medial": "\uFB91" + }, + "ng": { + "normal": ["\u06AD"], + "isolated": "\uFBD3", + "final": "\uFBD4", + "initial": "\uFBD5", + "medial": "\uFBD6" + }, + "gaf": { + "normal": ["\u06AF"], + "ring": ["\u06B0"], + "two_dots_below": ["\u06B2"], + "three_dots_above": ["\u06B4"], + "inverted_stroke": ["\u08B0"], + "isolated": "\uFB92", + "final": "\uFB93", + "initial": "\uFB94", + "medial": "\uFB95" + }, + "ngoeh": { + "normal": ["\u06B1"], + "isolated": "\uFB9A", + "final": "\uFB9B", + "initial": "\uFB9C", + "medial": "\uFB9D" + }, + "gueh": { + "normal": ["\u06B3"], + "isolated": "\uFB96", + "final": "\uFB97", + "initial": "\uFB98", + "medial": "\uFB99" + }, + "noon ghunna": { + "normal": ["\u06BA"], + "isolated": "\uFB9E", + "final": "\uFB9F" + }, + "rnoon": { + "normal": ["\u06BB"], + "isolated": "\uFBA0", + "final": "\uFBA1", + "initial": "\uFBA2", + "medial": "\uFBA3" + }, + "heh doachashmee": { + "normal": ["\u06BE"], + "isolated": "\uFBAA", + "final": "\uFBAB", + "initial": "\uFBAC", + "medial": "\uFBAD" + }, + "heh goal": { + "normal": ["\u06C1"], + "hamza_above": ["\u06C1\u0654", "\u06C2"], + "isolated": "\uFBA6", + "final": "\uFBA7", + "initial": "\uFBA8", + "medial": "\uFBA9" + }, + "teh marbuta goal": { + "normal": ["\u06C3"] + }, + "kirghiz oe": { + "normal": ["\u06C5"], + "isolated": "\uFBE0", + "final": "\uFBE1" + }, + "oe": { + "normal": ["\u06C6"], + "isolated": "\uFBD9", + "final": "\uFBDA" + }, + "u": { + "normal": ["\u06C7"], + "hamza_above": { + "normal": ["\u0677", "\u06C7\u0674"], + "isolated": "\uFBDD" + }, + "isolated": "\uFBD7", + "final": "\uFBD8" + }, + "yu": { + "normal": ["\u06C8"], + "isolated": "\uFBDB", + "final": "\uFBDC" + }, + "kirghiz yu": { + "normal": ["\u06C9"], + "isolated": "\uFBE2", + "final": "\uFBE3" + }, + "ve": { + "normal": ["\u06CB"], + "isolated": "\uFBDE", + "final": "\uFBDF" + }, + "farsi yeh": { + "normal": ["\u06CC"], + "indic_two_above": ["\u0775"], + "indic_three_above": ["\u0776"], + "indic_four_above": ["\u0777"], + "isolated": "\uFBFC", + "final": "\uFBFD", + "initial": "\uFBFE", + "medial": "\uFBFF" + }, + "e": { + "normal": ["\u06D0"], + "isolated": "\uFBE4", + "final": "\uFBE5", + "initial": "\uFBE6", + "medial": "\uFBE7" + }, + "yeh barree": { + "normal": ["\u06D2"], + "hamza_above": { + "normal": ["\u06D2\u0654", "\u06D3"], + "isolated": "\uFBB0", + "final": "\uFBB1" + }, + "indic_two_above": ["\u077A"], + "indic_three_above": ["\u077B"], + "isolated": "\uFBAE", + "final": "\uFBAF" + }, + "ae": { + "normal": ["\u06D5"], + "isolated": "\u06D5", + "final": "\uFEEA", + "yeh_above": { + "normal": ["\u06C0", "\u06D5\u0654"], + "isolated": "\uFBA4", + "final": "\uFBA5" } + }, + "rohingya yeh": { + "normal": ["\u08AC"] + }, + "low alef": { + "normal": ["\u08AD"] + }, + "straight waw": { + "normal": ["\u08B1"] + }, + "african feh": { + "normal": ["\u08BB"] + }, + "african qaf": { + "normal": ["\u08BC"] + }, + "african noon": { + "normal": ["\u08BD"] + } + }; - return selection.each(d3_selection_value(value)); - } - - function utilKeybinding(namespace) { - var _keybindings = {}; - - - function testBindings(isCapturing) { - var didMatch = false; - var bindings = Object.keys(_keybindings).map(function(id) { return _keybindings[id]; }); - var i, binding; - - // Most key shortcuts will accept either lower or uppercase ('h' or 'H'), - // so we don't strictly match on the shift key, but we prioritize - // shifted keybindings first, and fallback to unshifted only if no match. - // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z') - - // priority match shifted keybindings first - for (i = 0; i < bindings.length; i++) { - binding = bindings[i]; - if (!binding.event.modifiers.shiftKey) { continue; } // no shift - if (!!binding.capture !== isCapturing) { continue; } - if (matches(binding, true)) { - binding.callback(); - didMatch = true; - } - } + unicodeArabic["default"] = arabicReference; - // then unshifted keybindings - if (didMatch) { return; } - for (i = 0; i < bindings.length; i++) { - binding = bindings[i]; - if (binding.event.modifiers.shiftKey) { continue; } // shift - if (!!binding.capture !== isCapturing) { continue; } - if (matches(binding, false)) { - binding.callback(); - } - } + var unicodeLigatures = {}; + Object.defineProperty(unicodeLigatures, "__esModule", { + value: true + }); + var ligatureReference = { + "\u0626\u0627": { + "isolated": "\uFBEA", + "final": "\uFBEB" + }, + "\u0626\u06D5": { + "isolated": "\uFBEC", + "final": "\uFBED" + }, + "\u0626\u0648": { + "isolated": "\uFBEE", + "final": "\uFBEF" + }, + "\u0626\u06C7": { + "isolated": "\uFBF0", + "final": "\uFBF1" + }, + "\u0626\u06C6": { + "isolated": "\uFBF2", + "final": "\uFBF3" + }, + "\u0626\u06C8": { + "isolated": "\uFBF4", + "final": "\uFBF5" + }, + "\u0626\u06D0": { + "isolated": "\uFBF6", + "final": "\uFBF7", + "initial": "\uFBF8" + }, + "\u0626\u0649": { + "uighur_kirghiz": { + "isolated": "\uFBF9", + "final": "\uFBFA", + "initial": "\uFBFB" + }, + "isolated": "\uFC03", + "final": "\uFC68" + }, + "\u0626\u062C": { + "isolated": "\uFC00", + "initial": "\uFC97" + }, + "\u0626\u062D": { + "isolated": "\uFC01", + "initial": "\uFC98" + }, + "\u0626\u0645": { + "isolated": "\uFC02", + "final": "\uFC66", + "initial": "\uFC9A", + "medial": "\uFCDF" + }, + "\u0626\u064A": { + "isolated": "\uFC04", + "final": "\uFC69" + }, + "\u0628\u062C": { + "isolated": "\uFC05", + "initial": "\uFC9C" + }, + "\u0628\u062D": { + "isolated": "\uFC06", + "initial": "\uFC9D" + }, + "\u0628\u062E": { + "isolated": "\uFC07", + "initial": "\uFC9E" + }, + "\u0628\u0645": { + "isolated": "\uFC08", + "final": "\uFC6C", + "initial": "\uFC9F", + "medial": "\uFCE1" + }, + "\u0628\u0649": { + "isolated": "\uFC09", + "final": "\uFC6E" + }, + "\u0628\u064A": { + "isolated": "\uFC0A", + "final": "\uFC6F" + }, + "\u062A\u062C": { + "isolated": "\uFC0B", + "initial": "\uFCA1" + }, + "\u062A\u062D": { + "isolated": "\uFC0C", + "initial": "\uFCA2" + }, + "\u062A\u062E": { + "isolated": "\uFC0D", + "initial": "\uFCA3" + }, + "\u062A\u0645": { + "isolated": "\uFC0E", + "final": "\uFC72", + "initial": "\uFCA4", + "medial": "\uFCE3" + }, + "\u062A\u0649": { + "isolated": "\uFC0F", + "final": "\uFC74" + }, + "\u062A\u064A": { + "isolated": "\uFC10", + "final": "\uFC75" + }, + "\u062B\u062C": { + "isolated": "\uFC11" + }, + "\u062B\u0645": { + "isolated": "\uFC12", + "final": "\uFC78", + "initial": "\uFCA6", + "medial": "\uFCE5" + }, + "\u062B\u0649": { + "isolated": "\uFC13", + "final": "\uFC7A" + }, + "\u062B\u0648": { + "isolated": "\uFC14" + }, + "\u062C\u062D": { + "isolated": "\uFC15", + "initial": "\uFCA7" + }, + "\u062C\u0645": { + "isolated": "\uFC16", + "initial": "\uFCA8" + }, + "\u062D\u062C": { + "isolated": "\uFC17", + "initial": "\uFCA9" + }, + "\u062D\u0645": { + "isolated": "\uFC18", + "initial": "\uFCAA" + }, + "\u062E\u062C": { + "isolated": "\uFC19", + "initial": "\uFCAB" + }, + "\u062E\u062D": { + "isolated": "\uFC1A" + }, + "\u062E\u0645": { + "isolated": "\uFC1B", + "initial": "\uFCAC" + }, + "\u0633\u062C": { + "isolated": "\uFC1C", + "initial": "\uFCAD", + "medial": "\uFD34" + }, + "\u0633\u062D": { + "isolated": "\uFC1D", + "initial": "\uFCAE", + "medial": "\uFD35" + }, + "\u0633\u062E": { + "isolated": "\uFC1E", + "initial": "\uFCAF", + "medial": "\uFD36" + }, + "\u0633\u0645": { + "isolated": "\uFC1F", + "initial": "\uFCB0", + "medial": "\uFCE7" + }, + "\u0635\u062D": { + "isolated": "\uFC20", + "initial": "\uFCB1" + }, + "\u0635\u0645": { + "isolated": "\uFC21", + "initial": "\uFCB3" + }, + "\u0636\u062C": { + "isolated": "\uFC22", + "initial": "\uFCB4" + }, + "\u0636\u062D": { + "isolated": "\uFC23", + "initial": "\uFCB5" + }, + "\u0636\u062E": { + "isolated": "\uFC24", + "initial": "\uFCB6" + }, + "\u0636\u0645": { + "isolated": "\uFC25", + "initial": "\uFCB7" + }, + "\u0637\u062D": { + "isolated": "\uFC26", + "initial": "\uFCB8" + }, + "\u0637\u0645": { + "isolated": "\uFC27", + "initial": "\uFD33", + "medial": "\uFD3A" + }, + "\u0638\u0645": { + "isolated": "\uFC28", + "initial": "\uFCB9", + "medial": "\uFD3B" + }, + "\u0639\u062C": { + "isolated": "\uFC29", + "initial": "\uFCBA" + }, + "\u0639\u0645": { + "isolated": "\uFC2A", + "initial": "\uFCBB" + }, + "\u063A\u062C": { + "isolated": "\uFC2B", + "initial": "\uFCBC" + }, + "\u063A\u0645": { + "isolated": "\uFC2C", + "initial": "\uFCBD" + }, + "\u0641\u062C": { + "isolated": "\uFC2D", + "initial": "\uFCBE" + }, + "\u0641\u062D": { + "isolated": "\uFC2E", + "initial": "\uFCBF" + }, + "\u0641\u062E": { + "isolated": "\uFC2F", + "initial": "\uFCC0" + }, + "\u0641\u0645": { + "isolated": "\uFC30", + "initial": "\uFCC1" + }, + "\u0641\u0649": { + "isolated": "\uFC31", + "final": "\uFC7C" + }, + "\u0641\u064A": { + "isolated": "\uFC32", + "final": "\uFC7D" + }, + "\u0642\u062D": { + "isolated": "\uFC33", + "initial": "\uFCC2" + }, + "\u0642\u0645": { + "isolated": "\uFC34", + "initial": "\uFCC3" + }, + "\u0642\u0649": { + "isolated": "\uFC35", + "final": "\uFC7E" + }, + "\u0642\u064A": { + "isolated": "\uFC36", + "final": "\uFC7F" + }, + "\u0643\u0627": { + "isolated": "\uFC37", + "final": "\uFC80" + }, + "\u0643\u062C": { + "isolated": "\uFC38", + "initial": "\uFCC4" + }, + "\u0643\u062D": { + "isolated": "\uFC39", + "initial": "\uFCC5" + }, + "\u0643\u062E": { + "isolated": "\uFC3A", + "initial": "\uFCC6" + }, + "\u0643\u0644": { + "isolated": "\uFC3B", + "final": "\uFC81", + "initial": "\uFCC7", + "medial": "\uFCEB" + }, + "\u0643\u0645": { + "isolated": "\uFC3C", + "final": "\uFC82", + "initial": "\uFCC8", + "medial": "\uFCEC" + }, + "\u0643\u0649": { + "isolated": "\uFC3D", + "final": "\uFC83" + }, + "\u0643\u064A": { + "isolated": "\uFC3E", + "final": "\uFC84" + }, + "\u0644\u062C": { + "isolated": "\uFC3F", + "initial": "\uFCC9" + }, + "\u0644\u062D": { + "isolated": "\uFC40", + "initial": "\uFCCA" + }, + "\u0644\u062E": { + "isolated": "\uFC41", + "initial": "\uFCCB" + }, + "\u0644\u0645": { + "isolated": "\uFC42", + "final": "\uFC85", + "initial": "\uFCCC", + "medial": "\uFCED" + }, + "\u0644\u0649": { + "isolated": "\uFC43", + "final": "\uFC86" + }, + "\u0644\u064A": { + "isolated": "\uFC44", + "final": "\uFC87" + }, + "\u0645\u062C": { + "isolated": "\uFC45", + "initial": "\uFCCE" + }, + "\u0645\u062D": { + "isolated": "\uFC46", + "initial": "\uFCCF" + }, + "\u0645\u062E": { + "isolated": "\uFC47", + "initial": "\uFCD0" + }, + "\u0645\u0645": { + "isolated": "\uFC48", + "final": "\uFC89", + "initial": "\uFCD1" + }, + "\u0645\u0649": { + "isolated": "\uFC49" + }, + "\u0645\u064A": { + "isolated": "\uFC4A" + }, + "\u0646\u062C": { + "isolated": "\uFC4B", + "initial": "\uFCD2" + }, + "\u0646\u062D": { + "isolated": "\uFC4C", + "initial": "\uFCD3" + }, + "\u0646\u062E": { + "isolated": "\uFC4D", + "initial": "\uFCD4" + }, + "\u0646\u0645": { + "isolated": "\uFC4E", + "final": "\uFC8C", + "initial": "\uFCD5", + "medial": "\uFCEE" + }, + "\u0646\u0649": { + "isolated": "\uFC4F", + "final": "\uFC8E" + }, + "\u0646\u064A": { + "isolated": "\uFC50", + "final": "\uFC8F" + }, + "\u0647\u062C": { + "isolated": "\uFC51", + "initial": "\uFCD7" + }, + "\u0647\u0645": { + "isolated": "\uFC52", + "initial": "\uFCD8" + }, + "\u0647\u0649": { + "isolated": "\uFC53" + }, + "\u0647\u064A": { + "isolated": "\uFC54" + }, + "\u064A\u062C": { + "isolated": "\uFC55", + "initial": "\uFCDA" + }, + "\u064A\u062D": { + "isolated": "\uFC56", + "initial": "\uFCDB" + }, + "\u064A\u062E": { + "isolated": "\uFC57", + "initial": "\uFCDC" + }, + "\u064A\u0645": { + "isolated": "\uFC58", + "final": "\uFC93", + "initial": "\uFCDD", + "medial": "\uFCF0" + }, + "\u064A\u0649": { + "isolated": "\uFC59", + "final": "\uFC95" + }, + "\u064A\u064A": { + "isolated": "\uFC5A", + "final": "\uFC96" + }, + "\u0630\u0670": { + "isolated": "\uFC5B" + }, + "\u0631\u0670": { + "isolated": "\uFC5C" + }, + "\u0649\u0670": { + "isolated": "\uFC5D", + "final": "\uFC90" + }, + "\u064C\u0651": { + "isolated": "\uFC5E" + }, + "\u064D\u0651": { + "isolated": "\uFC5F" + }, + "\u064E\u0651": { + "isolated": "\uFC60" + }, + "\u064F\u0651": { + "isolated": "\uFC61" + }, + "\u0650\u0651": { + "isolated": "\uFC62" + }, + "\u0651\u0670": { + "isolated": "\uFC63" + }, + "\u0626\u0631": { + "final": "\uFC64" + }, + "\u0626\u0632": { + "final": "\uFC65" + }, + "\u0626\u0646": { + "final": "\uFC67" + }, + "\u0628\u0631": { + "final": "\uFC6A" + }, + "\u0628\u0632": { + "final": "\uFC6B" + }, + "\u0628\u0646": { + "final": "\uFC6D" + }, + "\u062A\u0631": { + "final": "\uFC70" + }, + "\u062A\u0632": { + "final": "\uFC71" + }, + "\u062A\u0646": { + "final": "\uFC73" + }, + "\u062B\u0631": { + "final": "\uFC76" + }, + "\u062B\u0632": { + "final": "\uFC77" + }, + "\u062B\u0646": { + "final": "\uFC79" + }, + "\u062B\u064A": { + "final": "\uFC7B" + }, + "\u0645\u0627": { + "final": "\uFC88" + }, + "\u0646\u0631": { + "final": "\uFC8A" + }, + "\u0646\u0632": { + "final": "\uFC8B" + }, + "\u0646\u0646": { + "final": "\uFC8D" + }, + "\u064A\u0631": { + "final": "\uFC91" + }, + "\u064A\u0632": { + "final": "\uFC92" + }, + "\u064A\u0646": { + "final": "\uFC94" + }, + "\u0626\u062E": { + "initial": "\uFC99" + }, + "\u0626\u0647": { + "initial": "\uFC9B", + "medial": "\uFCE0" + }, + "\u0628\u0647": { + "initial": "\uFCA0", + "medial": "\uFCE2" + }, + "\u062A\u0647": { + "initial": "\uFCA5", + "medial": "\uFCE4" + }, + "\u0635\u062E": { + "initial": "\uFCB2" + }, + "\u0644\u0647": { + "initial": "\uFCCD" + }, + "\u0646\u0647": { + "initial": "\uFCD6", + "medial": "\uFCEF" + }, + "\u0647\u0670": { + "initial": "\uFCD9" + }, + "\u064A\u0647": { + "initial": "\uFCDE", + "medial": "\uFCF1" + }, + "\u062B\u0647": { + "medial": "\uFCE6" + }, + "\u0633\u0647": { + "medial": "\uFCE8", + "initial": "\uFD31" + }, + "\u0634\u0645": { + "medial": "\uFCE9", + "isolated": "\uFD0C", + "final": "\uFD28", + "initial": "\uFD30" + }, + "\u0634\u0647": { + "medial": "\uFCEA", + "initial": "\uFD32" + }, + "\u0640\u064E\u0651": { + "medial": "\uFCF2" + }, + "\u0640\u064F\u0651": { + "medial": "\uFCF3" + }, + "\u0640\u0650\u0651": { + "medial": "\uFCF4" + }, + "\u0637\u0649": { + "isolated": "\uFCF5", + "final": "\uFD11" + }, + "\u0637\u064A": { + "isolated": "\uFCF6", + "final": "\uFD12" + }, + "\u0639\u0649": { + "isolated": "\uFCF7", + "final": "\uFD13" + }, + "\u0639\u064A": { + "isolated": "\uFCF8", + "final": "\uFD14" + }, + "\u063A\u0649": { + "isolated": "\uFCF9", + "final": "\uFD15" + }, + "\u063A\u064A": { + "isolated": "\uFCFA", + "final": "\uFD16" + }, + "\u0633\u0649": { + "isolated": "\uFCFB" + }, + "\u0633\u064A": { + "isolated": "\uFCFC", + "final": "\uFD18" + }, + "\u0634\u0649": { + "isolated": "\uFCFD", + "final": "\uFD19" + }, + "\u0634\u064A": { + "isolated": "\uFCFE", + "final": "\uFD1A" + }, + "\u062D\u0649": { + "isolated": "\uFCFF", + "final": "\uFD1B" + }, + "\u062D\u064A": { + "isolated": "\uFD00", + "final": "\uFD1C" + }, + "\u062C\u0649": { + "isolated": "\uFD01", + "final": "\uFD1D" + }, + "\u062C\u064A": { + "isolated": "\uFD02", + "final": "\uFD1E" + }, + "\u062E\u0649": { + "isolated": "\uFD03", + "final": "\uFD1F" + }, + "\u062E\u064A": { + "isolated": "\uFD04", + "final": "\uFD20" + }, + "\u0635\u0649": { + "isolated": "\uFD05", + "final": "\uFD21" + }, + "\u0635\u064A": { + "isolated": "\uFD06", + "final": "\uFD22" + }, + "\u0636\u0649": { + "isolated": "\uFD07", + "final": "\uFD23" + }, + "\u0636\u064A": { + "isolated": "\uFD08", + "final": "\uFD24" + }, + "\u0634\u062C": { + "isolated": "\uFD09", + "final": "\uFD25", + "initial": "\uFD2D", + "medial": "\uFD37" + }, + "\u0634\u062D": { + "isolated": "\uFD0A", + "final": "\uFD26", + "initial": "\uFD2E", + "medial": "\uFD38" + }, + "\u0634\u062E": { + "isolated": "\uFD0B", + "final": "\uFD27", + "initial": "\uFD2F", + "medial": "\uFD39" + }, + "\u0634\u0631": { + "isolated": "\uFD0D", + "final": "\uFD29" + }, + "\u0633\u0631": { + "isolated": "\uFD0E", + "final": "\uFD2A" + }, + "\u0635\u0631": { + "isolated": "\uFD0F", + "final": "\uFD2B" + }, + "\u0636\u0631": { + "isolated": "\uFD10", + "final": "\uFD2C" + }, + "\u0633\u0639": { + "final": "\uFD17" + }, + "\u062A\u062C\u0645": { + "initial": "\uFD50" + }, + "\u062A\u062D\u062C": { + "final": "\uFD51", + "initial": "\uFD52" + }, + "\u062A\u062D\u0645": { + "initial": "\uFD53" + }, + "\u062A\u062E\u0645": { + "initial": "\uFD54" + }, + "\u062A\u0645\u062C": { + "initial": "\uFD55" + }, + "\u062A\u0645\u062D": { + "initial": "\uFD56" + }, + "\u062A\u0645\u062E": { + "initial": "\uFD57" + }, + "\u062C\u0645\u062D": { + "final": "\uFD58", + "initial": "\uFD59" + }, + "\u062D\u0645\u064A": { + "final": "\uFD5A" + }, + "\u062D\u0645\u0649": { + "final": "\uFD5B" + }, + "\u0633\u062D\u062C": { + "initial": "\uFD5C" + }, + "\u0633\u062C\u062D": { + "initial": "\uFD5D" + }, + "\u0633\u062C\u0649": { + "final": "\uFD5E" + }, + "\u0633\u0645\u062D": { + "final": "\uFD5F", + "initial": "\uFD60" + }, + "\u0633\u0645\u062C": { + "initial": "\uFD61" + }, + "\u0633\u0645\u0645": { + "final": "\uFD62", + "initial": "\uFD63" + }, + "\u0635\u062D\u062D": { + "final": "\uFD64", + "initial": "\uFD65" + }, + "\u0635\u0645\u0645": { + "final": "\uFD66", + "initial": "\uFDC5" + }, + "\u0634\u062D\u0645": { + "final": "\uFD67", + "initial": "\uFD68" + }, + "\u0634\u062C\u064A": { + "final": "\uFD69" + }, + "\u0634\u0645\u062E": { + "final": "\uFD6A", + "initial": "\uFD6B" + }, + "\u0634\u0645\u0645": { + "final": "\uFD6C", + "initial": "\uFD6D" + }, + "\u0636\u062D\u0649": { + "final": "\uFD6E" + }, + "\u0636\u062E\u0645": { + "final": "\uFD6F", + "initial": "\uFD70" + }, + "\u0636\u0645\u062D": { + "final": "\uFD71" + }, + "\u0637\u0645\u062D": { + "initial": "\uFD72" + }, + "\u0637\u0645\u0645": { + "initial": "\uFD73" + }, + "\u0637\u0645\u064A": { + "final": "\uFD74" + }, + "\u0639\u062C\u0645": { + "final": "\uFD75", + "initial": "\uFDC4" + }, + "\u0639\u0645\u0645": { + "final": "\uFD76", + "initial": "\uFD77" + }, + "\u0639\u0645\u0649": { + "final": "\uFD78" + }, + "\u063A\u0645\u0645": { + "final": "\uFD79" + }, + "\u063A\u0645\u064A": { + "final": "\uFD7A" + }, + "\u063A\u0645\u0649": { + "final": "\uFD7B" + }, + "\u0641\u062E\u0645": { + "final": "\uFD7C", + "initial": "\uFD7D" + }, + "\u0642\u0645\u062D": { + "final": "\uFD7E", + "initial": "\uFDB4" + }, + "\u0642\u0645\u0645": { + "final": "\uFD7F" + }, + "\u0644\u062D\u0645": { + "final": "\uFD80", + "initial": "\uFDB5" + }, + "\u0644\u062D\u064A": { + "final": "\uFD81" + }, + "\u0644\u062D\u0649": { + "final": "\uFD82" + }, + "\u0644\u062C\u062C": { + "initial": "\uFD83", + "final": "\uFD84" + }, + "\u0644\u062E\u0645": { + "final": "\uFD85", + "initial": "\uFD86" + }, + "\u0644\u0645\u062D": { + "final": "\uFD87", + "initial": "\uFD88" + }, + "\u0645\u062D\u062C": { + "initial": "\uFD89" + }, + "\u0645\u062D\u0645": { + "initial": "\uFD8A" + }, + "\u0645\u062D\u064A": { + "final": "\uFD8B" + }, + "\u0645\u062C\u062D": { + "initial": "\uFD8C" + }, + "\u0645\u062C\u0645": { + "initial": "\uFD8D" + }, + "\u0645\u062E\u062C": { + "initial": "\uFD8E" + }, + "\u0645\u062E\u0645": { + "initial": "\uFD8F" + }, + "\u0645\u062C\u062E": { + "initial": "\uFD92" + }, + "\u0647\u0645\u062C": { + "initial": "\uFD93" + }, + "\u0647\u0645\u0645": { + "initial": "\uFD94" + }, + "\u0646\u062D\u0645": { + "initial": "\uFD95" + }, + "\u0646\u062D\u0649": { + "final": "\uFD96" + }, + "\u0646\u062C\u0645": { + "final": "\uFD97", + "initial": "\uFD98" + }, + "\u0646\u062C\u0649": { + "final": "\uFD99" + }, + "\u0646\u0645\u064A": { + "final": "\uFD9A" + }, + "\u0646\u0645\u0649": { + "final": "\uFD9B" + }, + "\u064A\u0645\u0645": { + "final": "\uFD9C", + "initial": "\uFD9D" + }, + "\u0628\u062E\u064A": { + "final": "\uFD9E" + }, + "\u062A\u062C\u064A": { + "final": "\uFD9F" + }, + "\u062A\u062C\u0649": { + "final": "\uFDA0" + }, + "\u062A\u062E\u064A": { + "final": "\uFDA1" + }, + "\u062A\u062E\u0649": { + "final": "\uFDA2" + }, + "\u062A\u0645\u064A": { + "final": "\uFDA3" + }, + "\u062A\u0645\u0649": { + "final": "\uFDA4" + }, + "\u062C\u0645\u064A": { + "final": "\uFDA5" + }, + "\u062C\u062D\u0649": { + "final": "\uFDA6" + }, + "\u062C\u0645\u0649": { + "final": "\uFDA7" + }, + "\u0633\u062E\u0649": { + "final": "\uFDA8" + }, + "\u0635\u062D\u064A": { + "final": "\uFDA9" + }, + "\u0634\u062D\u064A": { + "final": "\uFDAA" + }, + "\u0636\u062D\u064A": { + "final": "\uFDAB" + }, + "\u0644\u062C\u064A": { + "final": "\uFDAC" + }, + "\u0644\u0645\u064A": { + "final": "\uFDAD" + }, + "\u064A\u062D\u064A": { + "final": "\uFDAE" + }, + "\u064A\u062C\u064A": { + "final": "\uFDAF" + }, + "\u064A\u0645\u064A": { + "final": "\uFDB0" + }, + "\u0645\u0645\u064A": { + "final": "\uFDB1" + }, + "\u0642\u0645\u064A": { + "final": "\uFDB2" + }, + "\u0646\u062D\u064A": { + "final": "\uFDB3" + }, + "\u0639\u0645\u064A": { + "final": "\uFDB6" + }, + "\u0643\u0645\u064A": { + "final": "\uFDB7" + }, + "\u0646\u062C\u062D": { + "initial": "\uFDB8", + "final": "\uFDBD" + }, + "\u0645\u062E\u064A": { + "final": "\uFDB9" + }, + "\u0644\u062C\u0645": { + "initial": "\uFDBA", + "final": "\uFDBC" + }, + "\u0643\u0645\u0645": { + "final": "\uFDBB", + "initial": "\uFDC3" + }, + "\u062C\u062D\u064A": { + "final": "\uFDBE" + }, + "\u062D\u062C\u064A": { + "final": "\uFDBF" + }, + "\u0645\u062C\u064A": { + "final": "\uFDC0" + }, + "\u0641\u0645\u064A": { + "final": "\uFDC1" + }, + "\u0628\u062D\u064A": { + "final": "\uFDC2" + }, + "\u0633\u062E\u064A": { + "final": "\uFDC6" + }, + "\u0646\u062C\u064A": { + "final": "\uFDC7" + }, + "\u0644\u0622": { + "isolated": "\uFEF5", + "final": "\uFEF6" + }, + "\u0644\u0623": { + "isolated": "\uFEF7", + "final": "\uFEF8" + }, + "\u0644\u0625": { + "isolated": "\uFEF9", + "final": "\uFEFA" + }, + "\u0644\u0627": { + "isolated": "\uFEFB", + "final": "\uFEFC" + }, + "words": { + "\u0635\u0644\u06D2": "\uFDF0", + "\u0642\u0644\u06D2": "\uFDF1", + "\u0627\u0644\u0644\u0647": "\uFDF2", + "\u0627\u0643\u0628\u0631": "\uFDF3", + "\u0645\u062D\u0645\u062F": "\uFDF4", + "\u0635\u0644\u0639\u0645": "\uFDF5", + "\u0631\u0633\u0648\u0644": "\uFDF6", + "\u0639\u0644\u064A\u0647": "\uFDF7", + "\u0648\u0633\u0644\u0645": "\uFDF8", + "\u0635\u0644\u0649": "\uFDF9", + "\u0635\u0644\u0649\u0627\u0644\u0644\u0647\u0639\u0644\u064A\u0647\u0648\u0633\u0644\u0645": "\uFDFA", + "\u062C\u0644\u062C\u0644\u0627\u0644\u0647": "\uFDFB", + "\u0631\u06CC\u0627\u0644": "\uFDFC" + } + }; + + unicodeLigatures["default"] = ligatureReference; + + Object.defineProperty(reference, "__esModule", { + value: true + }); + var unicode_arabic_1$3 = unicodeArabic; + var unicode_ligatures_1$2 = unicodeLigatures; + var letterList = Object.keys(unicode_arabic_1$3["default"]); + reference.letterList = letterList; + var ligatureList = Object.keys(unicode_ligatures_1$2["default"]); + reference.ligatureList = ligatureList; + var ligatureWordList = Object.keys(unicode_ligatures_1$2["default"].words); + reference.ligatureWordList = ligatureWordList; + var lams = "\u0644\u06B5\u06B6\u06B7\u06B8"; + reference.lams = lams; + var alefs = "\u0627\u0622\u0623\u0625\u0671\u0672\u0673\u0675\u0773\u0774"; + reference.alefs = alefs; // for (var l = 1; l < lams.length; l++) { + // console.log('-'); + // for (var a = 0; a < alefs.length; a++) { + // console.log(a + ': ' + lams[l] + alefs[a]); + // } + // } - function matches(binding, testShift) { - var event$1 = event; - var isMatch = false; - var tryKeyCode = true; + var tashkeel = "\u0605\u0640\u0670\u0674\u06DF\u06E7\u06E8"; + reference.tashkeel = tashkeel; - // Prefer a match on `KeyboardEvent.key` - if (event$1.key !== undefined) { - tryKeyCode = (event$1.key.charCodeAt(0) > 255); // outside ISO-Latin-1 - isMatch = true; + function addToTashkeel(start, finish) { + for (var i = start; i <= finish; i++) { + reference.tashkeel = tashkeel += String.fromCharCode(i); + } + } - if (binding.event.key === undefined) { - isMatch = false; - } else if (Array.isArray(binding.event.key)) { - if (binding.event.key.map(function(s) { return s.toLowerCase(); }).indexOf(event$1.key.toLowerCase()) === -1) - { isMatch = false; } - } else { - if (event$1.key.toLowerCase() !== binding.event.key.toLowerCase()) - { isMatch = false; } - } - } + addToTashkeel(0x0610, 0x061A); + addToTashkeel(0x064B, 0x065F); + addToTashkeel(0x06D6, 0x06DC); + addToTashkeel(0x06E0, 0x06E4); + addToTashkeel(0x06EA, 0x06ED); + addToTashkeel(0x08D3, 0x08E1); + addToTashkeel(0x08E3, 0x08FF); + addToTashkeel(0xFE70, 0xFE7F); + var lineBreakers = "\u0627\u0629\u0648\u06C0\u06CF\u06FD\u06FE\u076B\u076C\u0771\u0773\u0774\u0778\u0779\u08E2\u08B1\u08B2\u08B9"; + reference.lineBreakers = lineBreakers; - // Fallback match on `KeyboardEvent.keyCode`, can happen if: - // - browser doesn't support `KeyboardEvent.key` - // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?) - if (!isMatch && tryKeyCode) { - isMatch = (event$1.keyCode === binding.event.keyCode); - } + function addToLineBreakers(start, finish) { + for (var i = start; i <= finish; i++) { + reference.lineBreakers = lineBreakers += String.fromCharCode(i); + } + } - if (!isMatch) { return false; } + addToLineBreakers(0x0600, 0x061F); // it's OK to include tashkeel in this range as it is ignored - // test modifier keys - if (!(event$1.ctrlKey && event$1.altKey)) { // if both are set, assume AltGr and skip it - #4096 - if (event$1.ctrlKey !== binding.event.modifiers.ctrlKey) { return false; } - if (event$1.altKey !== binding.event.modifiers.altKey) { return false; } - } - if (event$1.metaKey !== binding.event.modifiers.metaKey) { return false; } - if (testShift && event$1.shiftKey !== binding.event.modifiers.shiftKey) { return false; } + addToLineBreakers(0x0621, 0x0625); + addToLineBreakers(0x062F, 0x0632); + addToLineBreakers(0x0660, 0x066D); // numerals, math - return true; - } - } + addToLineBreakers(0x0671, 0x0677); + addToLineBreakers(0x0688, 0x0699); + addToLineBreakers(0x06C3, 0x06CB); + addToLineBreakers(0x06D2, 0x06F9); + addToLineBreakers(0x0759, 0x075B); + addToLineBreakers(0x08AA, 0x08AE); + addToLineBreakers(0xFB50, 0xFDFD); // presentation forms look like they could connect, but never do + // Presentation Forms A includes diacritics but they are meant to stand alone + addToLineBreakers(0xFE80, 0xFEFC); // presentation forms look like they could connect, but never do + // numerals, math - function capture() { - testBindings(true); - } + addToLineBreakers(0x10E60, 0x10E7F); + addToLineBreakers(0x1EC70, 0x1ECBF); + addToLineBreakers(0x1EE00, 0x1EEFF); + Object.defineProperty(GlyphSplitter$1, "__esModule", { + value: true + }); + var isArabic_1$6 = isArabic$1; + var reference_1$5 = reference; - function bubble() { - var tagName = select(event.target).node().tagName; - if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') { - return; - } - testBindings(false); + function GlyphSplitter(word) { + var letters = []; + var lastLetter = ''; + word.split('').forEach(function (letter) { + if (isArabic_1$6.isArabic(letter)) { + if (reference_1$5.tashkeel.indexOf(letter) > -1) { + letters[letters.length - 1] += letter; + } else if (lastLetter.length && (reference_1$5.lams.indexOf(lastLetter) === 0 && reference_1$5.alefs.indexOf(letter) > -1 || reference_1$5.lams.indexOf(lastLetter) > 0 && reference_1$5.alefs.indexOf(letter) === 0)) { + // valid LA forms + letters[letters.length - 1] += letter; + } else { + letters.push(letter); + } + } else { + letters.push(letter); } - - function keybinding(selection) { - selection = selection || select(document); - selection.on('keydown.capture.' + namespace, capture, true); - selection.on('keydown.bubble.' + namespace, bubble, false); - return keybinding; + if (reference_1$5.tashkeel.indexOf(letter) === -1) { + lastLetter = letter; } - - // was: keybinding.off() - keybinding.unbind = function(selection) { - _keybindings = []; - selection = selection || select(document); - selection.on('keydown.capture.' + namespace, null); - selection.on('keydown.bubble.' + namespace, null); - return keybinding; - }; - - - keybinding.clear = function() { - _keybindings = {}; - return keybinding; - }; - - - // Remove one or more keycode bindings. - keybinding.off = function(codes, capture) { - var arr = utilArrayUniq([].concat(codes)); - - for (var i = 0; i < arr.length; i++) { - var id = arr[i] + (capture ? '-capture' : '-bubble'); - delete _keybindings[id]; - } - return keybinding; - }; - - - // Add one or more keycode bindings. - keybinding.on = function(codes, callback, capture) { - if (typeof callback !== 'function') { - return keybinding.off(codes, capture); - } - - var arr = utilArrayUniq([].concat(codes)); - - for (var i = 0; i < arr.length; i++) { - var id = arr[i] + (capture ? '-capture' : '-bubble'); - var binding = { - id: id, - capture: capture, - callback: callback, - event: { - key: undefined, // preferred - keyCode: 0, // fallback - modifiers: { - shiftKey: false, - ctrlKey: false, - altKey: false, - metaKey: false - } - } - }; - - if (_keybindings[id]) { - console.warn('warning: duplicate keybinding for "' + id + '"'); // eslint-disable-line no-console - } - - _keybindings[id] = binding; - - var matches = arr[i].toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g); - for (var j = 0; j < matches.length; j++) { - // Normalise matching errors - if (matches[j] === '++') { matches[j] = '+'; } - - if (matches[j] in utilKeybinding.modifierCodes) { - var prop = utilKeybinding.modifierProperties[utilKeybinding.modifierCodes[matches[j]]]; - binding.event.modifiers[prop] = true; - } else { - binding.event.key = utilKeybinding.keys[matches[j]] || matches[j]; - if (matches[j] in utilKeybinding.keyCodes) { - binding.event.keyCode = utilKeybinding.keyCodes[matches[j]]; - } - } - } - } - - return keybinding; - }; - - - return keybinding; - } - - - /* - * See https://github.com/keithamus/jwerty - */ - - utilKeybinding.modifierCodes = { - // Shift key, ⇧ - '⇧': 16, shift: 16, - // CTRL key, on Mac: ⌃ - '⌃': 17, ctrl: 17, - // ALT key, on Mac: ⌥ (Alt) - '⌥': 18, alt: 18, option: 18, - // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super) - '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91 - }; - - utilKeybinding.modifierProperties = { - 16: 'shiftKey', - 17: 'ctrlKey', - 18: 'altKey', - 91: 'metaKey' - }; - - utilKeybinding.keys = { - // Backspace key, on Mac: ⌫ (Backspace) - '⌫': 'Backspace', backspace: 'Backspace', - // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥ - '⇥': 'Tab', '⇆': 'Tab', tab: 'Tab', - // Return key, ↩ - '↩': 'Enter', 'return': 'Enter', enter: 'Enter', '⌅': 'Enter', - // Pause/Break key - 'pause': 'Pause', 'pause-break': 'Pause', - // Caps Lock key, ⇪ - '⇪': 'CapsLock', caps: 'CapsLock', 'caps-lock': 'CapsLock', - // Escape key, on Mac: ⎋, on Windows: Esc - '⎋': ['Escape', 'Esc'], escape: ['Escape', 'Esc'], esc: ['Escape', 'Esc'], - // Space key - space: [' ', 'Spacebar'], - // Page-Up key, or pgup, on Mac: ↖ - '↖': 'PageUp', pgup: 'PageUp', 'page-up': 'PageUp', - // Page-Down key, or pgdown, on Mac: ↘ - '↘': 'PageDown', pgdown: 'PageDown', 'page-down': 'PageDown', - // END key, on Mac: ⇟ - '⇟': 'End', end: 'End', - // HOME key, on Mac: ⇞ - '⇞': 'Home', home: 'Home', - // Insert key, or ins - ins: 'Insert', insert: 'Insert', - // Delete key, on Mac: ⌦ (Delete) - '⌦': ['Delete', 'Del'], del: ['Delete', 'Del'], 'delete': ['Delete', 'Del'], - // Left Arrow Key, or ← - '←': ['ArrowLeft', 'Left'], left: ['ArrowLeft', 'Left'], 'arrow-left': ['ArrowLeft', 'Left'], - // Up Arrow Key, or ↑ - '↑': ['ArrowUp', 'Up'], up: ['ArrowUp', 'Up'], 'arrow-up': ['ArrowUp', 'Up'], - // Right Arrow Key, or → - '→': ['ArrowRight', 'Right'], right: ['ArrowRight', 'Right'], 'arrow-right': ['ArrowRight', 'Right'], - // Up Arrow Key, or ↓ - '↓': ['ArrowDown', 'Down'], down: ['ArrowDown', 'Down'], 'arrow-down': ['ArrowDown', 'Down'], - // odities, stuff for backward compatibility (browsers and code): - // Num-Multiply, or * - '*': ['*', 'Multiply'], star: ['*', 'Multiply'], asterisk: ['*', 'Multiply'], multiply: ['*', 'Multiply'], - // Num-Plus or + - '+': ['+', 'Add'], 'plus': ['+', 'Add'], - // Num-Subtract, or - - '-': ['-', 'Subtract'], subtract: ['-', 'Subtract'], 'dash': ['-', 'Subtract'], - // Semicolon - semicolon: ';', - // = or equals - equals: '=', - // Comma, or , - comma: ',', - // Period, or ., or full-stop - period: '.', 'full-stop': '.', - // Slash, or /, or forward-slash - slash: '/', 'forward-slash': '/', - // Tick, or `, or back-quote - tick: '`', 'back-quote': '`', - // Open bracket, or [ - 'open-bracket': '[', - // Back slash, or \ - 'back-slash': '\\', - // Close backet, or ] - 'close-bracket': ']', - // Apostrophe, or Quote, or ' - quote: '\'', apostrophe: '\'', - // NUMPAD 0-9 - 'num-0': '0', - 'num-1': '1', - 'num-2': '2', - 'num-3': '3', - 'num-4': '4', - 'num-5': '5', - 'num-6': '6', - 'num-7': '7', - 'num-8': '8', - 'num-9': '9', - // F1-F25 - f1: 'F1', - f2: 'F2', - f3: 'F3', - f4: 'F4', - f5: 'F5', - f6: 'F6', - f7: 'F7', - f8: 'F8', - f9: 'F9', - f10: 'F10', - f11: 'F11', - f12: 'F12', - f13: 'F13', - f14: 'F14', - f15: 'F15', - f16: 'F16', - f17: 'F17', - f18: 'F18', - f19: 'F19', - f20: 'F20', - f21: 'F21', - f22: 'F22', - f23: 'F23', - f24: 'F24', - f25: 'F25' - }; - - utilKeybinding.keyCodes = { - // Backspace key, on Mac: ⌫ (Backspace) - '⌫': 8, backspace: 8, - // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥ - '⇥': 9, '⇆': 9, tab: 9, - // Return key, ↩ - '↩': 13, 'return': 13, enter: 13, '⌅': 13, - // Pause/Break key - 'pause': 19, 'pause-break': 19, - // Caps Lock key, ⇪ - '⇪': 20, caps: 20, 'caps-lock': 20, - // Escape key, on Mac: ⎋, on Windows: Esc - '⎋': 27, escape: 27, esc: 27, - // Space key - space: 32, - // Page-Up key, or pgup, on Mac: ↖ - '↖': 33, pgup: 33, 'page-up': 33, - // Page-Down key, or pgdown, on Mac: ↘ - '↘': 34, pgdown: 34, 'page-down': 34, - // END key, on Mac: ⇟ - '⇟': 35, end: 35, - // HOME key, on Mac: ⇞ - '⇞': 36, home: 36, - // Insert key, or ins - ins: 45, insert: 45, - // Delete key, on Mac: ⌦ (Delete) - '⌦': 46, del: 46, 'delete': 46, - // Left Arrow Key, or ← - '←': 37, left: 37, 'arrow-left': 37, - // Up Arrow Key, or ↑ - '↑': 38, up: 38, 'arrow-up': 38, - // Right Arrow Key, or → - '→': 39, right: 39, 'arrow-right': 39, - // Up Arrow Key, or ↓ - '↓': 40, down: 40, 'arrow-down': 40, - // odities, printing characters that come out wrong: - // Firefox Equals - 'ffequals': 61, - // Num-Multiply, or * - '*': 106, star: 106, asterisk: 106, multiply: 106, - // Num-Plus or + - '+': 107, 'plus': 107, - // Num-Subtract, or - - '-': 109, subtract: 109, - // Firefox Plus - 'ffplus': 171, - // Firefox Minus - 'ffminus': 173, - // Semicolon - ';': 186, semicolon: 186, - // = or equals - '=': 187, 'equals': 187, - // Comma, or , - ',': 188, comma: 188, - // Dash / Underscore key - 'dash': 189, - // Period, or ., or full-stop - '.': 190, period: 190, 'full-stop': 190, - // Slash, or /, or forward-slash - '/': 191, slash: 191, 'forward-slash': 191, - // Tick, or `, or back-quote - '`': 192, tick: 192, 'back-quote': 192, - // Open bracket, or [ - '[': 219, 'open-bracket': 219, - // Back slash, or \ - '\\': 220, 'back-slash': 220, - // Close backet, or ] - ']': 221, 'close-bracket': 221, - // Apostrophe, or Quote, or ' - '\'': 222, quote: 222, apostrophe: 222 - }; - - // NUMPAD 0-9 - var i$2 = 95, n = 0; - while (++i$2 < 106) { - utilKeybinding.keyCodes['num-' + n] = i$2; - ++n; - } - - // 0-9 - i$2 = 47; n = 0; - while (++i$2 < 58) { - utilKeybinding.keyCodes[n] = i$2; - ++n; - } - - // F1-F25 - i$2 = 111; n = 1; - while (++i$2 < 136) { - utilKeybinding.keyCodes['f' + n] = i$2; - ++n; + }); + return letters; } - // a-z - i$2 = 64; - while (++i$2 < 91) { - utilKeybinding.keyCodes[String.fromCharCode(i$2).toLowerCase()] = i$2; - } + GlyphSplitter$1.GlyphSplitter = GlyphSplitter; - function utilObjectOmit(obj, omitKeys) { - return Object.keys(obj).reduce(function(result, key) { - if (omitKeys.indexOf(key) === -1) { - result[key] = obj[key]; // keep - } - return result; - }, {}); - } + var BaselineSplitter$1 = {}; - // Copies a variable number of methods from source to target. - function utilRebind(target, source) { - var arguments$1 = arguments; + Object.defineProperty(BaselineSplitter$1, "__esModule", { + value: true + }); + var isArabic_1$5 = isArabic$1; + var reference_1$4 = reference; - var i = 1, n = arguments.length, method; - while (++i < n) { - target[method = arguments$1[i]] = d3_rebind(target, source, source[method]); + function BaselineSplitter(word) { + var letters = []; + var lastLetter = ''; + word.split('').forEach(function (letter) { + if (isArabic_1$5.isArabic(letter) && isArabic_1$5.isArabic(lastLetter)) { + if (lastLetter.length && reference_1$4.tashkeel.indexOf(letter) > -1) { + letters[letters.length - 1] += letter; + } else if (reference_1$4.lineBreakers.indexOf(lastLetter) > -1) { + letters.push(letter); + } else { + letters[letters.length - 1] += letter; + } + } else { + letters.push(letter); } - return target; - } - - // Method is assumed to be a standard D3 getter-setter: - // If passed with no arguments, gets the value. - // If passed with arguments, sets the value and returns the target. - function d3_rebind(target, source, method) { - return function() { - var value = method.apply(source, arguments); - return value === source ? target : value; - }; - } - - // A per-domain session mutex backed by a cookie and dead man's - // switch. If the session crashes, the mutex will auto-release - // after 5 seconds. - - // This accepts a string and returns an object that complies with utilSessionMutexType - function utilSessionMutex(name) { - var mutex = {}; - var intervalID; - function renew() { - var expires = new Date(); - expires.setSeconds(expires.getSeconds() + 5); - document.cookie = name + '=1; expires=' + expires.toUTCString() + '; sameSite=strict'; + if (reference_1$4.tashkeel.indexOf(letter) === -1) { + // don't allow tashkeel to hide line break + lastLetter = letter; } - - mutex.lock = function () { - if (intervalID) { return true; } - var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1'); - if (cookie) { return false; } - renew(); - intervalID = window.setInterval(renew, 4000); - return true; - }; - - mutex.unlock = function () { - if (!intervalID) { return; } - document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT; sameSite=strict'; - clearInterval(intervalID); - intervalID = null; - }; - - mutex.locked = function () { - return !!intervalID; - }; - - return mutex; + }); + return letters; } - function utilTiler() { - var _size = [256, 256]; - var _scale = 256; - var _tileSize = 256; - var _zoomExtent = [0, 20]; - var _translate = [_size[0] / 2, _size[1] / 2]; - var _margin = 0; - var _skipNullIsland = false; - - - function clamp(num, min, max) { - return Math.max(min, Math.min(num, max)); - } - - - function nearNullIsland(tile) { - var x = tile[0]; - var y = tile[1]; - var z = tile[2]; - if (z >= 7) { - var center = Math.pow(2, z - 1); - var width = Math.pow(2, z - 6); - var min = center - (width / 2); - var max = center + (width / 2) - 1; - return x >= min && x <= max && y >= min && y <= max; - } - return false; - } + BaselineSplitter$1.BaselineSplitter = BaselineSplitter; + var Normalization = {}; - function tiler() { - var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize); - var z0 = clamp(Math.round(z), _zoomExtent[0], _zoomExtent[1]); - var tileMin = 0; - var tileMax = Math.pow(2, z0) - 1; - var log2ts = Math.log(_tileSize) * Math.LOG2E; - var k = Math.pow(2, z - z0 + log2ts); - var origin = [ - (_translate[0] - _scale / 2) / k, - (_translate[1] - _scale / 2) / k - ]; - - var cols = range$1( - clamp(Math.floor(-origin[0]) - _margin, tileMin, tileMax + 1), - clamp(Math.ceil(_size[0] / k - origin[0]) + _margin, tileMin, tileMax + 1) - ); - var rows = range$1( - clamp(Math.floor(-origin[1]) - _margin, tileMin, tileMax + 1), - clamp(Math.ceil(_size[1] / k - origin[1]) + _margin, tileMin, tileMax + 1) - ); - - var tiles = []; - for (var i = 0; i < rows.length; i++) { - var y = rows[i]; - for (var j = 0; j < cols.length; j++) { - var x = cols[j]; - - if (i >= _margin && i <= rows.length - _margin && - j >= _margin && j <= cols.length - _margin) { - tiles.unshift([x, y, z0]); // tiles in view at beginning - } else { - tiles.push([x, y, z0]); // tiles in margin at the end - } - } - } + Object.defineProperty(Normalization, "__esModule", { + value: true + }); + var unicode_arabic_1$2 = unicodeArabic; + var unicode_ligatures_1$1 = unicodeLigatures; + var isArabic_1$4 = isArabic$1; + var reference_1$3 = reference; - tiles.translate = origin; - tiles.scale = k; + function Normal(word, breakPresentationForm) { + // default is to turn initial/isolated/medial/final presentation form to generic + if (typeof breakPresentationForm === 'undefined') { + breakPresentationForm = true; + } - return tiles; + var returnable = ''; + word.split('').forEach(function (letter) { + if (!isArabic_1$4.isArabic(letter)) { + returnable += letter; + return; } + for (var w = 0; w < reference_1$3.letterList.length; w++) { + // ok so we are checking this potential lettertron + var letterForms = unicode_arabic_1$2["default"][reference_1$3.letterList[w]]; + var versions = Object.keys(letterForms); - /** - * getTiles() returns an array of tiles that cover the map view - */ - tiler.getTiles = function(projection) { - var origin = [ - projection.scale() * Math.PI - projection.translate()[0], - projection.scale() * Math.PI - projection.translate()[1] - ]; - - this - .size(projection.clipExtent()[1]) - .scale(projection.scale() * 2 * Math.PI) - .translate(projection.translate()); - - var tiles = tiler(); - var ts = tiles.scale; - - return tiles - .map(function(tile) { - if (_skipNullIsland && nearNullIsland(tile)) { - return false; - } - var x = tile[0] * ts - origin[0]; - var y = tile[1] * ts - origin[1]; - return { - id: tile.toString(), - xyz: tile, - extent: geoExtent( - projection.invert([x, y + ts]), - projection.invert([x + ts, y]) - ) - }; - }).filter(Boolean); - }; - + for (var v = 0; v < versions.length; v++) { + var localVersion = letterForms[versions[v]]; - /** - * getGeoJSON() returns a FeatureCollection for debugging tiles - */ - tiler.getGeoJSON = function(projection) { - var features = tiler.getTiles(projection).map(function(tile) { - return { - type: 'Feature', - properties: { - id: tile.id, - name: tile.id - }, - geometry: { - type: 'Polygon', - coordinates: [ tile.extent.polygon() ] - } - }; - }); + if (_typeof(localVersion) === 'object' && typeof localVersion.indexOf === 'undefined') { + // look at this embedded object + var embeddedForms = Object.keys(localVersion); - return { - type: 'FeatureCollection', - features: features - }; - }; + for (var ef = 0; ef < embeddedForms.length; ef++) { + var form = localVersion[embeddedForms[ef]]; + if (form === letter || _typeof(form) === 'object' && form.indexOf && form.indexOf(letter) > -1) { + // match + // console.log('embedded match'); + if (form === letter) { + // match exact + if (breakPresentationForm && localVersion['normal'] && ['isolated', 'initial', 'medial', 'final'].indexOf(embeddedForms[ef]) > -1) { + // replace presentation form + // console.log('keeping normal form of the letter'); + if (_typeof(localVersion['normal']) === 'object') { + returnable += localVersion['normal'][0]; + } else { + returnable += localVersion['normal']; + } - tiler.tileSize = function(val) { - if (!arguments.length) { return _tileSize; } - _tileSize = val; - return tiler; - }; + return; + } // console.log('keeping this letter'); - tiler.zoomExtent = function(val) { - if (!arguments.length) { return _zoomExtent; } - _zoomExtent = val; - return tiler; - }; + returnable += letter; + return; + } else if (_typeof(form) === 'object' && form.indexOf && form.indexOf(letter) > -1) { + // match + returnable += form[0]; // console.log('added the first letter from the same array'); + return; + } + } + } + } else if (localVersion === letter) { + // match exact + if (breakPresentationForm && letterForms['normal'] && ['isolated', 'initial', 'medial', 'final'].indexOf(versions[v]) > -1) { + // replace presentation form + // console.log('keeping normal form of the letter'); + if (_typeof(letterForms['normal']) === 'object') { + returnable += letterForms['normal'][0]; + } else { + returnable += letterForms['normal']; + } - tiler.size = function(val) { - if (!arguments.length) { return _size; } - _size = val; - return tiler; - }; + return; + } // console.log('keeping this letter'); - tiler.scale = function(val) { - if (!arguments.length) { return _scale; } - _scale = val; - return tiler; - }; + returnable += letter; + return; + } else if (_typeof(localVersion) === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1) { + // match + returnable += localVersion[0]; // console.log('added the first letter from the same array'); + return; + } + } + } // try ligatures - tiler.translate = function(val) { - if (!arguments.length) { return _translate; } - _translate = val; - return tiler; - }; + for (var v2 = 0; v2 < reference_1$3.ligatureList.length; v2++) { + var normalForm = reference_1$3.ligatureList[v2]; - // number to extend the rows/columns beyond those covering the viewport - tiler.margin = function(val) { - if (!arguments.length) { return _margin; } - _margin = +val; - return tiler; - }; + if (normalForm !== 'words') { + var ligForms = Object.keys(unicode_ligatures_1$1["default"][normalForm]); + for (var f = 0; f < ligForms.length; f++) { + if (unicode_ligatures_1$1["default"][normalForm][ligForms[f]] === letter) { + returnable += normalForm; + return; + } + } + } + } // try words ligatures - tiler.skipNullIsland = function(val) { - if (!arguments.length) { return _skipNullIsland; } - _skipNullIsland = val; - return tiler; - }; + for (var v3 = 0; v3 < reference_1$3.ligatureWordList.length; v3++) { + var _normalForm = reference_1$3.ligatureWordList[v3]; - return tiler; - } + if (unicode_ligatures_1$1["default"].words[_normalForm] === letter) { + returnable += _normalForm; + return; + } + } - function utilTriggerEvent(target, type) { - target.each(function() { - var evt = document.createEvent('HTMLEvents'); - evt.initEvent(type, true, true); - this.dispatchEvent(evt); - }); + returnable += letter; // console.log('kept the letter') + }); + return returnable; } - var _mainLocalizer = coreLocalizer(); // singleton - var _t = _mainLocalizer.t; - - // - // coreLocalizer manages language and locale parameters including translated strings - // - function coreLocalizer() { - - var localizer = {}; - - var _dataLanguages = {}; - - // `localeData` is an object containing all _supported_ locale codes -> language info. - // { - // en: { rtl: false, languageNames: {…}, scriptNames: {…} }, - // de: { rtl: false, languageNames: {…}, scriptNames: {…} }, - // … - // } - var _dataLocales = {}; - - // `localeStrings` is an object containing all _loaded_ locale codes -> string data. - // { - // en: { icons: {…}, toolbar: {…}, modes: {…}, operations: {…}, … }, - // de: { icons: {…}, toolbar: {…}, modes: {…}, operations: {…}, … }, - // … - // } - var _localeStrings = {}; - - // the current locale parameters - var _localeCode = 'en-US'; - var _languageCode = 'en'; - var _textDirection = 'ltr'; - var _usesMetric = false; - var _languageNames = {}; - var _scriptNames = {}; - - // getters for the current locale parameters - localizer.localeCode = function () { return _localeCode; }; - localizer.languageCode = function () { return _languageCode; }; - localizer.textDirection = function () { return _textDirection; }; - localizer.usesMetric = function () { return _usesMetric; }; - localizer.languageNames = function () { return _languageNames; }; - localizer.scriptNames = function () { return _scriptNames; }; - - - // The client app may want to manually set the locale, regardless of the - // settings provided by the browser - var _preferredLocaleCodes = []; - localizer.preferredLocaleCodes = function(codes) { - if (!arguments.length) { return _preferredLocaleCodes; } - if (typeof codes === 'string') { - // be generous and accept delimited strings as input - _preferredLocaleCodes = codes.split(/,|;| /gi).filter(Boolean); - } else { - _preferredLocaleCodes = codes; - } - return localizer; - }; - + Normalization.Normal = Normal; - var _loadPromise; - - localizer.ensureLoaded = function () { - - if (_loadPromise) { return _loadPromise; } - - return _loadPromise = Promise.all([ - // load the list of langauges - _mainFileFetcher.get('languages'), - // load the list of supported locales - _mainFileFetcher.get('locales') - ]) - .then(function (results) { - _dataLanguages = results[0]; - _dataLocales = results[1]; - }) - .then(function () { - var requestedLocales = (_preferredLocaleCodes || []) - // list of locales preferred by the browser in priority order - .concat(utilDetect().browserLocales); - _localeCode = bestSupportedLocale(requestedLocales); - - return Promise.all([ - // always load the English locale strings as fallbacks - localizer.loadLocale('en'), - // load the preferred locale - localizer.loadLocale(_localeCode) - ]); - }) - .then(function () { - updateForCurrentLocale(); - }) - .catch(function (err) { return console.error(err); }); // eslint-disable-line - }; + var CharShaper$1 = {}; - // Returns the best locale from `locales` supported by iD, if any - function bestSupportedLocale(locales) { - var supportedLocales = _dataLocales; + Object.defineProperty(CharShaper$1, "__esModule", { + value: true + }); + var unicode_arabic_1$1 = unicodeArabic; + var isArabic_1$3 = isArabic$1; + var reference_1$2 = reference; - var loop = function ( i ) { - var locale = locales[i]; - if (locale.includes('-')) { // full locale ('es-ES') + function CharShaper(letter, form) { + if (!isArabic_1$3.isArabic(letter)) { + // fail not Arabic + throw new Error('Not Arabic'); + } - if (supportedLocales[locale]) { return { v: locale }; } + if (letter === "\u0621") { + // hamza alone + return "\u0621"; + } - // If full locale not supported ('es-FAKE'), fallback to the base ('es') - var langPart = locale.split('-')[0]; - if (supportedLocales[langPart]) { return { v: langPart }; } + for (var w = 0; w < reference_1$2.letterList.length; w++) { + // ok so we are checking this potential lettertron + var letterForms = unicode_arabic_1$1["default"][reference_1$2.letterList[w]]; + var versions = Object.keys(letterForms); - } else { // base locale ('es') + for (var v = 0; v < versions.length; v++) { + var localVersion = letterForms[versions[v]]; - // prefer a lower-priority full locale with this base ('es' < 'es-ES') - var fullLocale = locales.find(function (locale2, index) { - return index > i && - locale2 !== locale && - locale2.split('-')[0] === locale && - supportedLocales[locale2]; - }); - if (fullLocale) { return { v: fullLocale }; } + if (localVersion === letter || _typeof(localVersion) === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1) { + if (versions.indexOf(form) > -1) { + return letterForms[form]; + } + } else if (_typeof(localVersion) === 'object' && typeof localVersion.indexOf === 'undefined') { + // check embedded + var embeddedVersions = Object.keys(localVersion); - if (supportedLocales[locale]) { return { v: locale }; } + for (var ev = 0; ev < embeddedVersions.length; ev++) { + if (localVersion[embeddedVersions[ev]] === letter || _typeof(localVersion[embeddedVersions[ev]]) === 'object' && localVersion[embeddedVersions[ev]].indexOf && localVersion[embeddedVersions[ev]].indexOf(letter) > -1) { + if (embeddedVersions.indexOf(form) > -1) { + return localVersion[form]; } - }; - - for (var i in locales) { - var returned = loop( i ); - - if ( returned ) return returned.v; + } } - - return null; + } } + } + } - function updateForCurrentLocale() { - if (!_localeCode) { return; } + CharShaper$1.CharShaper = CharShaper; - _languageCode = _localeCode.split('-')[0]; + var WordShaper$2 = {}; - var currentData = _dataLocales[_localeCode] || _dataLocales[_languageCode]; + Object.defineProperty(WordShaper$2, "__esModule", { + value: true + }); + var isArabic_1$2 = isArabic$1; + var reference_1$1 = reference; + var CharShaper_1$1 = CharShaper$1; + var unicode_ligatures_1 = unicodeLigatures; - var hash = utilStringQs(window.location.hash); + function WordShaper$1(word) { + var state = 'initial'; + var output = ''; - if (hash.rtl === 'true') { - _textDirection = 'rtl'; - } else if (hash.rtl === 'false') { - _textDirection = 'ltr'; - } else { - _textDirection = currentData && currentData.rtl ? 'rtl' : 'ltr'; - } + for (var w = 0; w < word.length; w++) { + var nextLetter = ' '; - _languageNames = currentData && currentData.languageNames; - _scriptNames = currentData && currentData.scriptNames; + for (var nxw = w + 1; nxw < word.length; nxw++) { + if (!isArabic_1$2.isArabic(word[nxw])) { + break; + } - _usesMetric = _localeCode.slice(-3).toLowerCase() !== '-us'; + if (reference_1$1.tashkeel.indexOf(word[nxw]) === -1) { + nextLetter = word[nxw]; + break; + } } + if (!isArabic_1$2.isArabic(word[w]) || isArabic_1$2.isMath(word[w])) { + // space or other non-Arabic + output += word[w]; + state = 'initial'; + } else if (reference_1$1.tashkeel.indexOf(word[w]) > -1) { + // tashkeel - add without changing state + output += word[w]; + } else if (nextLetter === ' ' // last Arabic letter in this word + || reference_1$1.lineBreakers.indexOf(word[w]) > -1) { + // the current letter is known to break lines + output += CharShaper_1$1.CharShaper(word[w], state === 'initial' ? 'isolated' : 'final'); + state = 'initial'; + } else if (reference_1$1.lams.indexOf(word[w]) > -1 && reference_1$1.alefs.indexOf(nextLetter) > -1) { + // LA letters - advance an additional letter after this + output += unicode_ligatures_1["default"][word[w] + nextLetter][state === 'initial' ? 'isolated' : 'final']; + + while (word[w] !== nextLetter) { + w++; + } - /* Locales */ - // Returns a Promise to load the strings for the requested locale - localizer.loadLocale = function (requested) { - - if (!_dataLocales) { - return Promise.reject('loadLocale called before init'); - } - - var locale = requested; - - // US English is the default - if (locale.toLowerCase() === 'en-us') { locale = 'en'; } + state = 'initial'; + } else { + output += CharShaper_1$1.CharShaper(word[w], state); + state = 'medial'; + } + } - if (!_dataLocales[locale]) { - return Promise.reject(("Unsupported locale: " + requested)); - } + return output; + } - if (_localeStrings[locale]) { // already loaded - return Promise.resolve(locale); - } + WordShaper$2.WordShaper = WordShaper$1; - var fileMap = _mainFileFetcher.fileMap(); - var key = "locale_" + locale; - fileMap[key] = "locales/" + locale + ".json"; + var ParentLetter$1 = {}; - return _mainFileFetcher.get(key) - .then(function (d) { - _localeStrings[locale] = d[locale]; - return locale; - }); - }; + Object.defineProperty(ParentLetter$1, "__esModule", { + value: true + }); + var unicode_arabic_1 = unicodeArabic; + var isArabic_1$1 = isArabic$1; + var reference_1 = reference; - /** - * Given a string identifier, try to find that string in the current - * language, and return it. This function will be called recursively - * with locale `en` if a string can not be found in the requested language. - * - * @param {string} s string identifier - * @param {object?} replacements token replacements and default string - * @param {string?} locale locale to use (defaults to currentLocale) - * @return {string?} localized string - */ - localizer.t = function(s, replacements, locale) { - locale = locale || _localeCode; + function ParentLetter(letter) { + if (!isArabic_1$1.isArabic(letter)) { + throw new Error('Not an Arabic letter'); + } - // US English is the default - if (locale.toLowerCase() === 'en-us') { locale = 'en'; } + for (var w = 0; w < reference_1.letterList.length; w++) { + // ok so we are checking this potential lettertron + var letterForms = unicode_arabic_1["default"][reference_1.letterList[w]]; + var versions = Object.keys(letterForms); - var path = s - .split('.') - .map(function (s) { return s.replace(//g, '.'); }) - .reverse(); + for (var v = 0; v < versions.length; v++) { + var localVersion = letterForms[versions[v]]; - var result = _localeStrings[locale]; + if (_typeof(localVersion) === 'object' && typeof localVersion.indexOf === 'undefined') { + // look at this embedded object + var embeddedForms = Object.keys(localVersion); - while (result !== undefined && path.length) { - result = result[path.pop()]; - } + for (var ef = 0; ef < embeddedForms.length; ef++) { + var form = localVersion[embeddedForms[ef]]; - if (result !== undefined) { - if (replacements) { - for (var k in replacements) { - var token = "{" + k + "}"; - var regex = new RegExp(token, 'g'); - result = result.replace(regex, replacements[k]); - } + if (form === letter || _typeof(form) === 'object' && form.indexOf && form.indexOf(letter) > -1) { + // match + return localVersion; } - return result; - } - - if (locale !== 'en') { - return localizer.t(s, replacements, 'en'); // fallback - recurse with 'en' } + } else if (localVersion === letter || _typeof(localVersion) === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1) { + // match + return letterForms; + } + } - if (replacements && 'default' in replacements) { - return replacements.default; // fallback - replacements.default - } - - var missing = "Missing " + locale + " translation: " + s; - if (typeof console !== 'undefined') { console.error(missing); } // eslint-disable-line - - return missing; - }; + return null; + } + } - localizer.languageName = function (code, options) { + ParentLetter$1.ParentLetter = ParentLetter; - if (_languageNames[code]) { // name in locale langauge - // e.g. "German" - return _languageNames[code]; - } + function GrandparentLetter(letter) { + if (!isArabic_1$1.isArabic(letter)) { + throw new Error('Not an Arabic letter'); + } - // sometimes we only want the local name - if (options && options.localOnly) { return null; } + for (var w = 0; w < reference_1.letterList.length; w++) { + // ok so we are checking this potential lettertron + var letterForms = unicode_arabic_1["default"][reference_1.letterList[w]]; + var versions = Object.keys(letterForms); - var langInfo = _dataLanguages[code]; - if (langInfo) { - if (langInfo.nativeName) { // name in native language - // e.g. "Deutsch (de)" - return localizer.t('translate.language_and_code', { language: langInfo.nativeName, code: code }); + for (var v = 0; v < versions.length; v++) { + var localVersion = letterForms[versions[v]]; - } else if (langInfo.base && langInfo.script) { - var base = langInfo.base; // the code of the langauge this is based on + if (_typeof(localVersion) === 'object' && typeof localVersion.indexOf === 'undefined') { + // look at this embedded object + var embeddedForms = Object.keys(localVersion); - if (_languageNames[base]) { // base language name in locale langauge - var scriptCode = langInfo.script; - var script = _scriptNames[scriptCode] || scriptCode; - // e.g. "Serbian (Cyrillic)" - return localizer.t('translate.language_and_code', { language: _languageNames[base], code: script }); + for (var ef = 0; ef < embeddedForms.length; ef++) { + var form = localVersion[embeddedForms[ef]]; - } else if (_dataLanguages[base] && _dataLanguages[base].nativeName) { - // e.g. "српски (sr-Cyrl)" - return localizer.t('translate.language_and_code', { language: _dataLanguages[base].nativeName, code: code }); - } + if (form === letter || _typeof(form) === 'object' && form.indexOf && form.indexOf(letter) > -1) { + // match + return letterForms; } } - return code; // if not found, use the code - }; + } else if (localVersion === letter || _typeof(localVersion) === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1) { + // match + return letterForms; + } + } - return localizer; + return null; + } } - // - // `presetCollection` is a wrapper around an `Array` of presets `collection`, - // and decorated with some extra methods for searching and matching geometry - // - function presetCollection(collection) { - var MAXRESULTS = 50; - var _this = {}; - var _memo = {}; - - _this.collection = collection; - - _this.item = function (id) { - if (_memo[id]) { return _memo[id]; } - var found = _this.collection.find(function (d) { return d.id === id; }); - if (found) { _memo[id] = found; } - return found; - }; - - _this.index = function (id) { return _this.collection.findIndex(function (d) { return d.id === id; }); }; - - _this.matchGeometry = function (geometry) { - return presetCollection( - _this.collection.filter(function (d) { return d.matchGeometry(geometry); }) - ); - }; - - _this.matchAllGeometry = function (geometries) { - return presetCollection( - _this.collection.filter(function (d) { return d && d.matchAllGeometry(geometries); }) - ); - }; + ParentLetter$1.GrandparentLetter = GrandparentLetter; - _this.matchAnyGeometry = function (geometries) { - return presetCollection( - _this.collection.filter(function (d) { return geometries.some(function (geom) { return d.matchGeometry(geom); }); }) - ); - }; + Object.defineProperty(lib, "__esModule", { + value: true + }); + var isArabic_1 = isArabic$1; + lib.isArabic = isArabic_1.isArabic; + var GlyphSplitter_1 = GlyphSplitter$1; + lib.GlyphSplitter = GlyphSplitter_1.GlyphSplitter; + var BaselineSplitter_1 = BaselineSplitter$1; + lib.BaselineSplitter = BaselineSplitter_1.BaselineSplitter; + var Normalization_1 = Normalization; + lib.Normal = Normalization_1.Normal; + var CharShaper_1 = CharShaper$1; + lib.CharShaper = CharShaper_1.CharShaper; + var WordShaper_1 = WordShaper$2; + var WordShaper = lib.WordShaper = WordShaper_1.WordShaper; + var ParentLetter_1 = ParentLetter$1; + lib.ParentLetter = ParentLetter_1.ParentLetter; + lib.GrandparentLetter = ParentLetter_1.GrandparentLetter; - _this.fallback = function (geometry) { - var id = geometry; - if (id === 'vertex') { id = 'point'; } - return _this.item(id); - }; + var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0750-\u07BF\u08A0–\u08BF]/; + function fixRTLTextForSvg(inputText) { + var ret = '', + rtlBuffer = []; + var arabicRegex = /[\u0600-\u06FF]/g; + var arabicDiacritics = /[\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06ED]/g; + var arabicMath = /[\u0660-\u066C\u06F0-\u06F9]+/g; + var thaanaVowel = /[\u07A6-\u07B0]/; + var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/; // Arabic word shaping - _this.search = function (value, geometry, countryCode) { - if (!value) { return _this; } + if (arabicRegex.test(inputText)) { + inputText = WordShaper(inputText); + } - value = value.toLowerCase().trim(); + for (var n = 0; n < inputText.length; n++) { + var c = inputText[n]; - // match at name beginning or just after a space (e.g. "office" -> match "Law Office") - function leading(a) { - var index = a.indexOf(value); - return index === 0 || a[index - 1] === ' '; - } + if (arabicMath.test(c)) { + // Arabic numbers go LTR + ret += rtlBuffer.reverse().join(''); + rtlBuffer = [c]; + } else { + if (rtlBuffer.length && arabicMath.test(rtlBuffer[rtlBuffer.length - 1])) { + ret += rtlBuffer.reverse().join(''); + rtlBuffer = []; + } - // match at name beginning only - function leadingStrict(a) { - var index = a.indexOf(value); - return index === 0; + if ((thaanaVowel.test(c) || hebrewSign.test(c) || arabicDiacritics.test(c)) && rtlBuffer.length) { + rtlBuffer[rtlBuffer.length - 1] += c; + } else if (rtlRegex.test(c) // include Arabic presentation forms + || c.charCodeAt(0) >= 64336 && c.charCodeAt(0) <= 65023 || c.charCodeAt(0) >= 65136 && c.charCodeAt(0) <= 65279) { + rtlBuffer.push(c); + } else if (c === ' ' && rtlBuffer.length) { + // whitespace within RTL text + rtlBuffer = [rtlBuffer.reverse().join('') + ' ']; + } else { + // non-RTL character + ret += rtlBuffer.reverse().join('') + c; + rtlBuffer = []; + } } + } - function sortNames(a, b) { - var aCompare = (a.suggestion ? a.originalName : a.name()).toLowerCase(); - var bCompare = (b.suggestion ? b.originalName : b.name()).toLowerCase(); - - // priority if search string matches preset name exactly - #4325 - if (value === aCompare) { return -1; } - if (value === bCompare) { return 1; } - - // priority for higher matchScore - var i = b.originalScore - a.originalScore; - if (i !== 0) { return i; } - - // priority if search string appears earlier in preset name - i = aCompare.indexOf(value) - bCompare.indexOf(value); - if (i !== 0) { return i; } - - // priority for shorter preset names - return aCompare.length - bCompare.length; - } + ret += rtlBuffer.reverse().join(''); + return ret; + } - var pool = _this.collection; - if (countryCode) { - pool = pool.filter(function (a) { - if (a.countryCodes && a.countryCodes.indexOf(countryCode) === -1) { return false; } - if (a.notCountryCodes && a.notCountryCodes.indexOf(countryCode) !== -1) { return false; } - return true; - }); - } - var searchable = pool.filter(function (a) { return a.searchable !== false && a.suggestion !== true; }); - var suggestions = pool.filter(function (a) { return a.suggestion === true; }); - - // matches value to preset.name - var leading_name = searchable - .filter(function (a) { return leading(a.name().toLowerCase()); }) - .sort(sortNames); - - // matches value to preset suggestion name (original name is unhyphenated) - var leading_suggestions = suggestions - .filter(function (a) { return leadingStrict(a.originalName.toLowerCase()); }) - .sort(sortNames); - - // matches value to preset.terms values - var leading_terms = searchable - .filter(function (a) { return (a.terms() || []).some(leading); }); - - // matches value to preset.tags values - var leading_tag_values = searchable - .filter(function (a) { return Object.values(a.tags || {}).filter(function (val) { return val !== '*'; }).some(leading); }); - - // finds close matches to value in preset.name - var similar_name = searchable - .map(function (a) { return ({ preset: a, dist: utilEditDistance(value, a.name()) }); }) - .filter(function (a) { return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3; }) - .sort(function (a, b) { return a.dist - b.dist; }) - .map(function (a) { return a.preset; }); - - // finds close matches to value to preset suggestion name (original name is unhyphenated) - var similar_suggestions = suggestions - .map(function (a) { return ({ preset: a, dist: utilEditDistance(value, a.originalName.toLowerCase()) }); }) - .filter(function (a) { return a.dist + Math.min(value.length - a.preset.originalName.length, 0) < 1; }) - .sort(function (a, b) { return a.dist - b.dist; }) - .map(function (a) { return a.preset; }); - - // finds close matches to value in preset.terms - var similar_terms = searchable - .filter(function (a) { - return (a.terms() || []).some(function (b) { - return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3; - }); - }); + var DESCRIPTORS$2 = descriptors; + var uncurryThis$b = functionUncurryThis; + var objectKeys = objectKeys$4; + var toIndexedObject = toIndexedObject$d; + var $propertyIsEnumerable = objectPropertyIsEnumerable.f; - var results = leading_name.concat( - leading_suggestions, - leading_terms, - leading_tag_values, - similar_name, - similar_suggestions, - similar_terms - ).slice(0, MAXRESULTS - 1); + var propertyIsEnumerable = uncurryThis$b($propertyIsEnumerable); + var push$2 = uncurryThis$b([].push); - if (geometry) { - if (typeof geometry === 'string') { - results.push(_this.fallback(geometry)); - } else { - geometry.forEach(function (geom) { return results.push(_this.fallback(geom)); }); + // `Object.{ entries, values }` methods implementation + var createMethod$1 = function (TO_ENTRIES) { + return function (it) { + var O = toIndexedObject(it); + var keys = objectKeys(O); + var length = keys.length; + var i = 0; + var result = []; + var key; + while (length > i) { + key = keys[i++]; + if (!DESCRIPTORS$2 || propertyIsEnumerable(O, key)) { + push$2(result, TO_ENTRIES ? [key, O[key]] : O[key]); } } - - return presetCollection(utilArrayUniq(results)); + return result; }; + }; + var objectToArray = { + // `Object.entries` method + // https://tc39.es/ecma262/#sec-object.entries + entries: createMethod$1(true), + // `Object.values` method + // https://tc39.es/ecma262/#sec-object.values + values: createMethod$1(false) + }; - return _this; - } + var $$r = _export; + var $values = objectToArray.values; - // - // `presetCategory` builds a `presetCollection` of member presets, - // decorated with some extra methods for searching and matching geometry - // - function presetCategory(categoryID, category, all) { - var _this = Object.assign({}, category); // shallow copy + // `Object.values` method + // https://tc39.es/ecma262/#sec-object.values + $$r({ target: 'Object', stat: true }, { + values: function values(O) { + return $values(O); + } + }); - _this.id = categoryID; + // https://github.com/openstreetmap/iD/issues/772 + // http://mathiasbynens.be/notes/localstorage-pattern#comment-9 + var _storage; - _this.members = presetCollection( - category.members.map(function (presetID) { return all.item(presetID); }).filter(Boolean) - ); + try { + _storage = localStorage; + } catch (e) {} // eslint-disable-line no-empty - _this.geometry = _this.members.collection - .reduce(function (acc, preset) { - for (var i in preset.geometry) { - var geometry = preset.geometry[i]; - if (acc.indexOf(geometry) === -1) { - acc.push(geometry); - } - } - return acc; - }, []); - _this.matchGeometry = function (geom) { return _this.geometry.indexOf(geom) >= 0; }; + _storage = _storage || function () { + var s = {}; + return { + getItem: function getItem(k) { + return s[k]; + }, + setItem: function setItem(k, v) { + return s[k] = v; + }, + removeItem: function removeItem(k) { + return delete s[k]; + } + }; + }(); - _this.matchAllGeometry = function (geometries) { return _this.members.collection - .some(function (preset) { return preset.matchAllGeometry(geometries); }); }; + var _listeners = {}; // + // corePreferences is an interface for persisting basic key-value strings + // within and between iD sessions on the same site. + // - _this.matchScore = function () { return -1; }; + /** + * @param {string} k + * @param {string?} v + * @returns {boolean} true if the action succeeded + */ - _this.name = function () { return _t(("presets.categories." + categoryID + ".name"), { 'default': categoryID }); }; + function corePreferences(k, v) { + try { + if (v === undefined) return _storage.getItem(k);else if (v === null) _storage.removeItem(k);else _storage.setItem(k, v); - _this.terms = function () { return []; }; + if (_listeners[k]) { + _listeners[k].forEach(function (handler) { + return handler(v); + }); + } + return true; + } catch (e) { + /* eslint-disable no-console */ + if (typeof console !== 'undefined') { + console.error('localStorage quota exceeded'); + } + /* eslint-enable no-console */ - return _this; - } - // - // `presetField` decorates a given `field` Object - // with some extra methods for searching and matching geometry - // - function presetField(fieldID, field) { - var _this = Object.assign({}, field); // shallow copy + return false; + } + } // adds an event listener which is triggered whenever - _this.id = fieldID; - // for use in classes, element ids, css selectors - _this.safeid = utilSafeClassName(fieldID); + corePreferences.onChange = function (k, handler) { + _listeners[k] = _listeners[k] || []; - _this.matchGeometry = function (geom) { return !_this.geometry || _this.geometry.indexOf(geom) !== -1; }; + _listeners[k].push(handler); + }; - _this.matchAllGeometry = function (geometries) { - return !_this.geometry || geometries.every(function (geom) { return _this.geometry.indexOf(geom) !== -1; }); - }; + var vparse = {exports: {}}; - _this.t = function (scope, options) { return _t(("presets.fields." + fieldID + "." + scope), options); }; + (function (module) { + (function (window) { - _this.label = function () { return _this.overrideLabel || _this.t('label', { 'default': fieldID }); }; + function parseVersion(v) { + var m = v.replace(/[^0-9.]/g, '').match(/[0-9]*\.|[0-9]+/g) || []; + v = { + major: +m[0] || 0, + minor: +m[1] || 0, + patch: +m[2] || 0, + build: +m[3] || 0 + }; + v.isEmpty = !v.major && !v.minor && !v.patch && !v.build; + v.parsed = [v.major, v.minor, v.patch, v.build]; + v.text = v.parsed.join('.'); + v.compare = compare; + return v; + } - var _placeholder = _this.placeholder; - _this.placeholder = function () { return _this.t('placeholder', { 'default': _placeholder }); }; + function compare(v) { + if (typeof v === 'string') { + v = parseVersion(v); + } - _this.originalTerms = (_this.terms || []).join(); + for (var i = 0; i < 4; i++) { + if (this.parsed[i] !== v.parsed[i]) { + return this.parsed[i] > v.parsed[i] ? 1 : -1; + } + } - _this.terms = function () { return _this.t('terms', { 'default': _this.originalTerms }) - .toLowerCase().trim().split(/\s*,+\s*/); }; + return 0; + } + /* istanbul ignore next */ - return _this; - } + if (module && 'object' === 'object') { + module.exports = parseVersion; + } else { + window.parseVersion = parseVersion; + } + })(commonjsGlobal); + })(vparse); + + var parseVersion = vparse.exports; + + var name = "iD"; + var version = "2.20.4"; + var description = "A friendly editor for OpenStreetMap"; + var main = "dist/iD.min.js"; + var repository = "github:openstreetmap/iD"; + var homepage = "https://github.com/openstreetmap/iD"; + var bugs = "https://github.com/openstreetmap/iD/issues"; + var keywords = ["editor","openstreetmap"]; + var license = "ISC"; + var scripts = {all:"npm-run-all -s clean build build:legacy dist",build:"npm-run-all -s build:css build:data build:dev","build:css":"node scripts/build_css.js","build:data":"shx mkdir -p dist/data && node scripts/build_data.js","build:dev":"rollup --config config/rollup.config.dev.js","build:legacy":"rollup --config config/rollup.config.legacy.js","build:stats":"rollup --config config/rollup.config.stats.js",clean:"shx rm -f dist/*.js dist/*.map dist/*.css dist/img/*.svg",dist:"npm-run-all -p dist:**","dist:mapillary":"shx mkdir -p dist/mapillary-js && shx cp -R node_modules/mapillary-js/dist/* dist/mapillary-js/","dist:pannellum":"shx mkdir -p dist/pannellum-streetside && shx cp -R node_modules/pannellum/build/* dist/pannellum-streetside/","dist:min:iD":"uglifyjs dist/iD.legacy.js --compress --mangle --output dist/iD.min.js","dist:svg:iD":"svg-sprite --symbol --symbol-dest . --shape-id-generator \"iD-%s\" --symbol-sprite dist/img/iD-sprite.svg \"svg/iD-sprite/**/*.svg\"","dist:svg:community":"svg-sprite --symbol --symbol-dest . --shape-id-generator \"community-%s\" --symbol-sprite dist/img/community-sprite.svg node_modules/osm-community-index/dist/img/*.svg","dist:svg:fa":"svg-sprite --symbol --symbol-dest . --symbol-sprite dist/img/fa-sprite.svg svg/fontawesome/*.svg","dist:svg:maki":"svg-sprite --symbol --symbol-dest . --shape-id-generator \"maki-%s\" --symbol-sprite dist/img/maki-sprite.svg node_modules/@mapbox/maki/icons/*.svg","dist:svg:mapillary:signs":"svg-sprite --symbol --symbol-dest . --symbol-sprite dist/img/mapillary-sprite.svg node_modules/mapillary_sprite_source/package_signs/*.svg","dist:svg:mapillary:objects":"svg-sprite --symbol --symbol-dest . --symbol-sprite dist/img/mapillary-object-sprite.svg node_modules/mapillary_sprite_source/package_objects/*.svg","dist:svg:temaki":"svg-sprite --symbol --symbol-dest . --shape-id-generator \"temaki-%s\" --symbol-sprite dist/img/temaki-sprite.svg node_modules/@ideditor/temaki/icons/*.svg",imagery:"node scripts/update_imagery.js",lint:"eslint scripts test/spec modules","lint:fix":"eslint scripts test/spec modules --fix",start:"npm-run-all -s build start:server",quickstart:"npm-run-all -s build:dev start:server","start:server":"node scripts/server.js",test:"npm-run-all -s lint build test:spec","test:spec":"karma start karma.conf.js",translations:"node scripts/update_locales.js"}; + var dependencies = {"@ideditor/country-coder":"~5.0.3","@ideditor/location-conflation":"~1.0.2","@mapbox/geojson-area":"^0.2.2","@mapbox/sexagesimal":"1.2.0","@mapbox/vector-tile":"^1.3.1","@tmcw/togeojson":"^4.5.0","@turf/bbox-clip":"^6.0.0","abortcontroller-polyfill":"^1.4.0","aes-js":"^3.1.2","alif-toolkit":"^1.2.9","core-js":"^3.6.5",diacritics:"1.3.0","fast-deep-equal":"~3.1.1","fast-json-stable-stringify":"2.1.0","lodash-es":"~4.17.15",marked:"~2.0.0","node-diff3":"2.1.0","osm-auth":"1.1.0",pannellum:"2.5.6",pbf:"^3.2.1","polygon-clipping":"~0.15.1",rbush:"3.0.1","whatwg-fetch":"^3.4.1","which-polygon":"2.2.0"}; + var devDependencies = {"@babel/core":"^7.11.6","@babel/preset-env":"^7.11.5","@fortawesome/fontawesome-svg-core":"^1.2.32","@fortawesome/free-brands-svg-icons":"~5.15.1","@fortawesome/free-regular-svg-icons":"~5.15.1","@fortawesome/free-solid-svg-icons":"~5.15.1","@ideditor/temaki":"~5.0.0","@mapbox/maki":"^6.0.0","@rollup/plugin-babel":"^5.2.1","@rollup/plugin-commonjs":"^21.0.0","@rollup/plugin-json":"^4.0.1","@rollup/plugin-node-resolve":"~13.0.5",autoprefixer:"^10.0.1",btoa:"^1.2.1",chai:"^4.3.4","cldr-core":"37.0.0","cldr-localenames-full":"37.0.0",chalk:"^4.1.2","concat-files":"^0.1.1",d3:"~6.6.0","editor-layer-index":"github:osmlab/editor-layer-index#gh-pages",eslint:"^7.1.0","fetch-mock":"^9.11.0",gaze:"^1.1.3",glob:"^7.1.0",happen:"^0.3.2","js-yaml":"^4.0.0","json-stringify-pretty-compact":"^3.0.0",karma:"^6.3.5","karma-chrome-launcher":"^3.1.0","karma-coverage":"^2.0.3","karma-mocha":"^2.0.1","karma-remap-istanbul":"^0.6.0",mapillary_sprite_source:"^1.8.0","mapillary-js":"4.0.0",minimist:"^1.2.3",mocha:"^8.4.0","name-suggestion-index":"~6.0","node-fetch":"^2.6.1","npm-run-all":"^4.0.0","object-inspect":"1.10.3","osm-community-index":"~5.1.0",postcss:"^8.1.1","postcss-selector-prepend":"^0.5.0",rollup:"~2.52.8","rollup-plugin-includepaths":"~0.2.3","rollup-plugin-progress":"^1.1.1","rollup-plugin-visualizer":"~4.2.0",shelljs:"^0.8.0",shx:"^0.3.0",sinon:"^11.1.2","sinon-chai":"^3.7.0",smash:"0.0","static-server":"^2.2.1","svg-sprite":"1.5.1","uglify-js":"~3.13.0",vparse:"~1.1.0"}; + var engines = {node:">=10"}; + var browserslist = ["> 0.2%, last 6 major versions, Firefox ESR, IE 11, maintained node versions"]; + var packageJSON = { + name: name, + version: version, + description: description, + main: main, + repository: repository, + homepage: homepage, + bugs: bugs, + keywords: keywords, + license: license, + scripts: scripts, + dependencies: dependencies, + devDependencies: devDependencies, + engines: engines, + browserslist: browserslist + }; + var _mainFileFetcher = coreFileFetcher(); // singleton + // coreFileFetcher asynchronously fetches data from JSON files // - // `presetPreset` decorates a given `preset` Object - // with some extra methods for searching and matching geometry - // - function presetPreset(presetID, preset, addable, allFields, allPresets) { - allFields = allFields || {}; - allPresets = allPresets || {}; - var _this = Object.assign({}, preset); // shallow copy - var _addable = addable || false; - var _resolvedFields; // cache - var _resolvedMoreFields; // cache - _this.id = presetID; - - _this.safeid = utilSafeClassName(presetID); // for use in css classes, selectors, element ids - - _this.originalTerms = (_this.terms || []).join(); - - _this.originalName = _this.name || ''; + function coreFileFetcher() { + var ociVersion = packageJSON.devDependencies['osm-community-index']; + var v = parseVersion(ociVersion); + var vMinor = "".concat(v.major, ".").concat(v.minor); + var _this = {}; + var _inflight = {}; + var _fileMap = { + 'address_formats': 'data/address_formats.min.json', + 'deprecated': 'https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/deprecated.min.json', + 'discarded': 'https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/discarded.min.json', + 'imagery': 'data/imagery.min.json', + 'intro_graph': 'data/intro_graph.min.json', + 'keepRight': 'data/keepRight.min.json', + 'languages': 'data/languages.min.json', + 'locales': 'locales/index.min.json', + 'oci_defaults': "https://cdn.jsdelivr.net/npm/osm-community-index@".concat(vMinor, "/dist/defaults.min.json"), + 'oci_features': "https://cdn.jsdelivr.net/npm/osm-community-index@".concat(vMinor, "/dist/featureCollection.min.json"), + 'oci_resources': "https://cdn.jsdelivr.net/npm/osm-community-index@".concat(vMinor, "/dist/resources.min.json"), + 'preset_categories': 'https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/preset_categories.min.json', + 'preset_defaults': 'https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/preset_defaults.min.json', + 'preset_fields': 'https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/fields.min.json', + 'preset_presets': 'https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/presets.min.json', + 'phone_formats': 'data/phone_formats.min.json', + 'qa_data': 'data/qa_data.min.json', + 'shortcuts': 'data/shortcuts.min.json', + 'territory_languages': 'data/territory_languages.min.json', + 'wmf_sitematrix': 'https://cdn.jsdelivr.net/npm/wmf-sitematrix@0.1/wikipedia.min.json' + }; + var _cachedData = {}; // expose the cache; useful for tests - _this.originalScore = _this.matchScore || 1; + _this.cache = function () { + return _cachedData; + }; // Returns a Promise to fetch data + // (resolved with the data if we have it already) - _this.originalReference = _this.reference || {}; - _this.originalFields = (_this.fields || []); + _this.get = function (which) { + if (_cachedData[which]) { + return Promise.resolve(_cachedData[which]); + } - _this.originalMoreFields = (_this.moreFields || []); + var file = _fileMap[which]; - _this.fields = function () { return _resolvedFields || (_resolvedFields = resolve('fields')); }; + var url = file && _this.asset(file); - _this.moreFields = function () { return _resolvedMoreFields || (_resolvedMoreFields = resolve('moreFields')); }; + if (!url) { + return Promise.reject("Unknown data file for \"".concat(which, "\"")); + } - _this.resetFields = function () { return _resolvedFields = _resolvedMoreFields = null; }; + var prom = _inflight[url]; - _this.tags = _this.tags || {}; + if (!prom) { + _inflight[url] = prom = fetch(url).then(function (response) { + // fetch in PhantomJS tests may return ok=false and status=0 even if it's okay + if (!response.ok && response.status !== 0 || !response.json) { + throw new Error(response.status + ' ' + response.statusText); + } - _this.addTags = _this.addTags || _this.tags; + if (response.status === 204 || response.status === 205) return; // No Content, Reset Content - _this.removeTags = _this.removeTags || _this.addTags; + return response.json(); + }).then(function (result) { + delete _inflight[url]; - _this.geometry = (_this.geometry || []); + if (!result) { + throw new Error("No data loaded for \"".concat(which, "\"")); + } - _this.matchGeometry = function (geom) { return _this.geometry.indexOf(geom) >= 0; }; + _cachedData[which] = result; + return result; + })["catch"](function (err) { + delete _inflight[url]; + throw err; + }); + } - _this.matchAllGeometry = function (geoms) { return geoms.every(_this.matchGeometry); }; + return prom; + }; // Accessor for the file map - _this.matchScore = function (entityTags) { - var tags = _this.tags; - var seen = {}; - var score = 0; - // match on tags - for (var k in tags) { - seen[k] = true; - if (entityTags[k] === tags[k]) { - score += _this.originalScore; - } else if (tags[k] === '*' && k in entityTags) { - score += _this.originalScore / 2; - } else { - return -1; - } - } + _this.fileMap = function (val) { + if (!arguments.length) return _fileMap; + _fileMap = val; + return _this; + }; - // boost score for additional matches in addTags - #6802 - var addTags = _this.addTags; - for (var k$1 in addTags) { - if (!seen[k$1] && entityTags[k$1] === addTags[k$1]) { - score += _this.originalScore; - } - } + var _assetPath = ''; - return score; + _this.assetPath = function (val) { + if (!arguments.length) return _assetPath; + _assetPath = val; + return _this; }; + var _assetMap = {}; - var _textCache = {}; - _this.t = function (scope, options) { - var textID = "presets.presets." + presetID + "." + scope; - if (_textCache[textID]) { return _textCache[textID]; } - return _textCache[textID] = _t(textID, options); + _this.assetMap = function (val) { + if (!arguments.length) return _assetMap; + _assetMap = val; + return _this; }; - - _this.name = function () { - if (_this.suggestion) { - var path = presetID.split('/'); - path.pop(); // remove brand name - // NOTE: insert an en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc) - return _this.originalName + ' – ' + _t('presets.presets.' + path.join('/') + '.name'); - } - return _this.t('name', { 'default': _this.originalName }); + _this.asset = function (val) { + if (/^http(s)?:\/\//i.test(val)) return val; + var filename = _assetPath + val; + return _assetMap[filename] || filename; }; + return _this; + } + + var global$9 = global$1o; + var toIntegerOrInfinity$1 = toIntegerOrInfinity$b; + var toString$7 = toString$k; + var requireObjectCoercible$6 = requireObjectCoercible$e; - _this.terms = function () { return _this.t('terms', { 'default': _this.originalTerms }) - .toLowerCase().trim().split(/\s*,+\s*/); }; + var RangeError$5 = global$9.RangeError; + // `String.prototype.repeat` method implementation + // https://tc39.es/ecma262/#sec-string.prototype.repeat + var stringRepeat = function repeat(count) { + var str = toString$7(requireObjectCoercible$6(this)); + var result = ''; + var n = toIntegerOrInfinity$1(count); + if (n < 0 || n == Infinity) throw RangeError$5('Wrong number of repetitions'); + for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str; + return result; + }; - _this.isFallback = function () { - var tagCount = Object.keys(_this.tags).length; - return tagCount === 0 || (tagCount === 1 && _this.tags.hasOwnProperty('area')); - }; + var $$q = _export; + var global$8 = global$1o; + var uncurryThis$a = functionUncurryThis; + var toIntegerOrInfinity = toIntegerOrInfinity$b; + var thisNumberValue$1 = thisNumberValue$3; + var $repeat$1 = stringRepeat; + var fails$7 = fails$V; + var RangeError$4 = global$8.RangeError; + var String$1 = global$8.String; + var floor$2 = Math.floor; + var repeat$2 = uncurryThis$a($repeat$1); + var stringSlice$3 = uncurryThis$a(''.slice); + var un$ToFixed = uncurryThis$a(1.0.toFixed); - _this.addable = function(val) { - if (!arguments.length) { return _addable; } - _addable = val; - return _this; - }; + var pow$1 = function (x, n, acc) { + return n === 0 ? acc : n % 2 === 1 ? pow$1(x, n - 1, acc * x) : pow$1(x * x, n / 2, acc); + }; + var log = function (x) { + var n = 0; + var x2 = x; + while (x2 >= 4096) { + n += 12; + x2 /= 4096; + } + while (x2 >= 2) { + n += 1; + x2 /= 2; + } return n; + }; - _this.reference = function (geom) { - // Lookup documentation on Wikidata... - var qid = _this.tags.wikidata || _this.tags['brand:wikidata'] || _this.tags['operator:wikidata']; - if (qid) { - return { qid: qid }; + var multiply = function (data, n, c) { + var index = -1; + var c2 = c; + while (++index < 6) { + c2 += n * data[index]; + data[index] = c2 % 1e7; + c2 = floor$2(c2 / 1e7); + } + }; + + var divide = function (data, n) { + var index = 6; + var c = 0; + while (--index >= 0) { + c += data[index]; + data[index] = floor$2(c / n); + c = (c % n) * 1e7; + } + }; + + var dataToString = function (data) { + var index = 6; + var s = ''; + while (--index >= 0) { + if (s !== '' || index === 0 || data[index] !== 0) { + var t = String$1(data[index]); + s = s === '' ? t : s + repeat$2('0', 7 - t.length) + t; } + } return s; + }; - // Lookup documentation on OSM Wikibase... - var key = _this.originalReference.key || Object.keys(utilObjectOmit(_this.tags, 'name'))[0]; - var value = _this.originalReference.value || _this.tags[key]; + var FORCED$6 = fails$7(function () { + return un$ToFixed(0.00008, 3) !== '0.000' || + un$ToFixed(0.9, 0) !== '1' || + un$ToFixed(1.255, 2) !== '1.25' || + un$ToFixed(1000000000000000128.0, 0) !== '1000000000000000128'; + }) || !fails$7(function () { + // V8 ~ Android 4.3- + un$ToFixed({}); + }); - if (geom === 'relation' && key === 'type') { - if (value in _this.tags) { - key = value; - value = _this.tags[key]; + // `Number.prototype.toFixed` method + // https://tc39.es/ecma262/#sec-number.prototype.tofixed + $$q({ target: 'Number', proto: true, forced: FORCED$6 }, { + toFixed: function toFixed(fractionDigits) { + var number = thisNumberValue$1(this); + var fractDigits = toIntegerOrInfinity(fractionDigits); + var data = [0, 0, 0, 0, 0, 0]; + var sign = ''; + var result = '0'; + var e, z, j, k; + + // TODO: ES2018 increased the maximum number of fraction digits to 100, need to improve the implementation + if (fractDigits < 0 || fractDigits > 20) throw RangeError$4('Incorrect fraction digits'); + // eslint-disable-next-line no-self-compare -- NaN check + if (number != number) return 'NaN'; + if (number <= -1e21 || number >= 1e21) return String$1(number); + if (number < 0) { + sign = '-'; + number = -number; + } + if (number > 1e-21) { + e = log(number * pow$1(2, 69, 1)) - 69; + z = e < 0 ? number * pow$1(2, -e, 1) : number / pow$1(2, e, 1); + z *= 0x10000000000000; + e = 52 - e; + if (e > 0) { + multiply(data, 0, z); + j = fractDigits; + while (j >= 7) { + multiply(data, 1e7, 0); + j -= 7; + } + multiply(data, pow$1(10, j, 1), 0); + j = e - 1; + while (j >= 23) { + divide(data, 1 << 23); + j -= 23; + } + divide(data, 1 << j); + multiply(data, 1, 1); + divide(data, 2); + result = dataToString(data); } else { - return { rtype: value }; + multiply(data, 0, z); + multiply(data, 1 << -e, 0); + result = dataToString(data) + repeat$2('0', fractDigits); } } - - if (value === '*') { - return { key: key }; + if (fractDigits > 0) { + k = result.length; + result = sign + (k <= fractDigits + ? '0.' + repeat$2('0', fractDigits - k) + result + : stringSlice$3(result, 0, k - fractDigits) + '.' + stringSlice$3(result, k - fractDigits)); } else { - return { key: key, value: value }; - } - }; + result = sign + result; + } return result; + } + }); + var global$7 = global$1o; - _this.unsetTags = function (tags, geometry, skipFieldDefaults) { - tags = utilObjectOmit(tags, Object.keys(_this.removeTags)); + var globalIsFinite = global$7.isFinite; - if (geometry && !skipFieldDefaults) { - _this.fields().forEach(function (field) { - if (field.matchGeometry(geometry) && field.key && field.default === tags[field.key]) { - delete tags[field.key]; - } - }); - } + // `Number.isFinite` method + // https://tc39.es/ecma262/#sec-number.isfinite + // eslint-disable-next-line es/no-number-isfinite -- safe + var numberIsFinite$1 = Number.isFinite || function isFinite(it) { + return typeof it == 'number' && globalIsFinite(it); + }; - delete tags.area; - return tags; - }; + var $$p = _export; + var numberIsFinite = numberIsFinite$1; + // `Number.isFinite` method + // https://tc39.es/ecma262/#sec-number.isfinite + $$p({ target: 'Number', stat: true }, { isFinite: numberIsFinite }); - _this.setTags = function (tags, geometry, skipFieldDefaults) { - var addTags = _this.addTags; - tags = Object.assign({}, tags); // shallow copy + var $$o = _export; + var global$6 = global$1o; + var uncurryThis$9 = functionUncurryThis; + var toAbsoluteIndex = toAbsoluteIndex$9; - for (var k in addTags) { - if (addTags[k] === '*') { - tags[k] = 'yes'; - } else { - tags[k] = addTags[k]; - } - } + var RangeError$3 = global$6.RangeError; + var fromCharCode$1 = String.fromCharCode; + // eslint-disable-next-line es/no-string-fromcodepoint -- required for testing + var $fromCodePoint = String.fromCodePoint; + var join$2 = uncurryThis$9([].join); - // Add area=yes if necessary. - // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of: - // 1. chosen preset could be either an area or a line (`barrier=city_wall`) - // 2. chosen preset doesn't have a key in osmAreaKeys (`railway=station`) - if (!addTags.hasOwnProperty('area')) { - delete tags.area; - if (geometry === 'area') { - var needsAreaTag = true; - if (_this.geometry.indexOf('line') === -1) { - for (var k$1 in addTags) { - if (k$1 in osmAreaKeys) { - needsAreaTag = false; - break; - } - } - } - if (needsAreaTag) { - tags.area = 'yes'; - } - } - } + // length should be 1, old FF problem + var INCORRECT_LENGTH = !!$fromCodePoint && $fromCodePoint.length != 1; - if (geometry && !skipFieldDefaults) { - _this.fields().forEach(function (field) { - if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) { - tags[field.key] = field.default; - } - }); - } + // `String.fromCodePoint` method + // https://tc39.es/ecma262/#sec-string.fromcodepoint + $$o({ target: 'String', stat: true, forced: INCORRECT_LENGTH }, { + // eslint-disable-next-line no-unused-vars -- required for `.length` + fromCodePoint: function fromCodePoint(x) { + var elements = []; + var length = arguments.length; + var i = 0; + var code; + while (length > i) { + code = +arguments[i++]; + if (toAbsoluteIndex(code, 0x10FFFF) !== code) throw RangeError$3(code + ' is not a valid code point'); + elements[i] = code < 0x10000 + ? fromCharCode$1(code) + : fromCharCode$1(((code -= 0x10000) >> 10) + 0xD800, code % 0x400 + 0xDC00); + } return join$2(elements, ''); + } + }); - return tags; - }; + var call$1 = functionCall; + var fixRegExpWellKnownSymbolLogic = fixRegexpWellKnownSymbolLogic; + var anObject = anObject$n; + var requireObjectCoercible$5 = requireObjectCoercible$e; + var sameValue = sameValue$1; + var toString$6 = toString$k; + var getMethod = getMethod$7; + var regExpExec = regexpExecAbstract; + + // @@search logic + fixRegExpWellKnownSymbolLogic('search', function (SEARCH, nativeSearch, maybeCallNative) { + return [ + // `String.prototype.search` method + // https://tc39.es/ecma262/#sec-string.prototype.search + function search(regexp) { + var O = requireObjectCoercible$5(this); + var searcher = regexp == undefined ? undefined : getMethod(regexp, SEARCH); + return searcher ? call$1(searcher, regexp, O) : new RegExp(regexp)[SEARCH](toString$6(O)); + }, + // `RegExp.prototype[@@search]` method + // https://tc39.es/ecma262/#sec-regexp.prototype-@@search + function (string) { + var rx = anObject(this); + var S = toString$6(string); + var res = maybeCallNative(nativeSearch, rx, S); + + if (res.done) return res.value; + + var previousLastIndex = rx.lastIndex; + if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0; + var result = regExpExec(rx, S); + if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex; + return result === null ? -1 : result.index; + } + ]; + }); + var rbush$2 = {exports: {}}; - // For a preset without fields, use the fields of the parent preset. - // Replace {preset} placeholders with the fields of the specified presets. - function resolve(which) { - var fieldIDs = (which === 'fields' ? _this.originalFields : _this.originalMoreFields); - var resolved = []; + var quickselect$2 = {exports: {}}; - fieldIDs.forEach(function (fieldID) { - var match = fieldID.match(/\{(.*)\}/); - if (match !== null) { // a presetID wrapped in braces {} - resolved = resolved.concat(inheritFields(match[1], which)); - } else if (allFields[fieldID]) { // a normal fieldID - resolved.push(allFields[fieldID]); - } else { - console.log(("Cannot resolve \"" + fieldID + "\" found in " + (_this.id) + "." + which)); // eslint-disable-line no-console - } - }); + (function (module, exports) { + (function (global, factory) { + module.exports = factory() ; + })(commonjsGlobal, function () { - // no fields resolved, so use the parent's if possible - if (!resolved.length) { - var endIndex = _this.id.lastIndexOf('/'); - var parentID = endIndex && _this.id.substring(0, endIndex); - if (parentID) { - resolved = inheritFields(parentID, which); - } + function quickselect(arr, k, left, right, compare) { + quickselectStep(arr, k, left || 0, right || arr.length - 1, compare || defaultCompare); } - return utilArrayUniq(resolved); - + function quickselectStep(arr, k, left, right, compare) { + while (right > left) { + if (right - left > 600) { + var n = right - left + 1; + var m = k - left + 1; + var z = Math.log(n); + var s = 0.5 * Math.exp(2 * z / 3); + var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); + var newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); + var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); + quickselectStep(arr, k, newLeft, newRight, compare); + } - // returns an array of fields to inherit from the given presetID, if found - function inheritFields(presetID, which) { - var parent = allPresets[presetID]; - if (!parent) { return []; } + var t = arr[k]; + var i = left; + var j = right; + swap(arr, left, k); + if (compare(arr[right], t) > 0) swap(arr, left, right); - if (which === 'fields') { - return parent.fields().filter(shouldInherit); - } else if (which === 'moreFields') { - return parent.moreFields(); - } else { - return []; - } - } + while (i < j) { + swap(arr, i, j); + i++; + j--; + while (compare(arr[i], t) < 0) { + i++; + } - // Skip `fields` for the keys which define the preset. - // These are usually `typeCombo` fields like `shop=*` - function shouldInherit(f) { - if (f.key && _this.tags[f.key] !== undefined && - // inherit anyway if multiple values are allowed or just a checkbox - f.type !== 'multiCombo' && f.type !== 'semiCombo' && f.type !== 'check' - ) { return false; } + while (compare(arr[j], t) > 0) { + j--; + } + } - return true; + if (compare(arr[left], t) === 0) swap(arr, left, j);else { + j++; + swap(arr, j, right); + } + if (j <= k) left = j + 1; + if (k <= j) right = j - 1; + } } - } + function swap(arr, i, j) { + var tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; + } - return _this; - } + function defaultCompare(a, b) { + return a < b ? -1 : a > b ? 1 : 0; + } - var _mainPresetIndex = presetIndex(); // singleton + return quickselect; + }); + })(quickselect$2); - // - // `presetIndex` wraps a `presetCollection` - // with methods for loading new data and returning defaults - // - function presetIndex() { - var dispatch$1 = dispatch('favoritePreset', 'recentsChange'); - var MAXRECENTS = 30; + rbush$2.exports = rbush$1; - // seed the preset lists with geometry fallbacks - var POINT = presetPreset('point', { name: 'Point', tags: {}, geometry: ['point', 'vertex'], matchScore: 0.1 } ); - var LINE = presetPreset('line', { name: 'Line', tags: {}, geometry: ['line'], matchScore: 0.1 } ); - var AREA = presetPreset('area', { name: 'Area', tags: { area: 'yes' }, geometry: ['area'], matchScore: 0.1 } ); - var RELATION = presetPreset('relation', { name: 'Relation', tags: {}, geometry: ['relation'], matchScore: 0.1 } ); + rbush$2.exports["default"] = rbush$1; - var _this = presetCollection([POINT, LINE, AREA, RELATION]); - var _presets = { point: POINT, line: LINE, area: AREA, relation: RELATION }; + var quickselect$1 = quickselect$2.exports; - var _defaults = { - point: presetCollection([POINT]), - vertex: presetCollection([POINT]), - line: presetCollection([LINE]), - area: presetCollection([AREA]), - relation: presetCollection([RELATION]) - }; + function rbush$1(maxEntries, format) { + if (!(this instanceof rbush$1)) return new rbush$1(maxEntries, format); // max entries in a node is 9 by default; min node fill is 40% for best performance - var _fields = {}; - var _categories = {}; - var _universal = []; - var _addablePresetIDs = null; // Set of preset IDs that the user can add - var _recents; - var _favorites; + this._maxEntries = Math.max(4, maxEntries || 9); + this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4)); - // Index of presets by (geometry, tag key). - var _geometryIndex = { point: {}, vertex: {}, line: {}, area: {}, relation: {} }; + if (format) { + this._initFormat(format); + } - var _loadPromise; + this.clear(); + } - _this.ensureLoaded = function () { - if (_loadPromise) { return _loadPromise; } - - return _loadPromise = Promise.all([ - _mainFileFetcher.get('preset_categories'), - _mainFileFetcher.get('preset_defaults'), - _mainFileFetcher.get('preset_presets'), - _mainFileFetcher.get('preset_fields') - ]) - .then(function (vals) { - _this.merge({ - categories: vals[0], - defaults: vals[1], - presets: vals[2], - fields: vals[3] - }); - osmSetAreaKeys(_this.areaKeys()); - osmSetPointTags(_this.pointTags()); - osmSetVertexTags(_this.vertexTags()); - }); - }; + rbush$1.prototype = { + all: function all() { + return this._all(this.data, []); + }, + search: function search(bbox) { + var node = this.data, + result = [], + toBBox = this.toBBox; + if (!intersects$1(bbox, node)) return result; + var nodesToSearch = [], + i, + len, + child, + childBBox; + while (node) { + for (i = 0, len = node.children.length; i < len; i++) { + child = node.children[i]; + childBBox = node.leaf ? toBBox(child) : child; - _this.merge = function (d) { - // Merge Fields - if (d.fields) { - Object.keys(d.fields).forEach(function (fieldID) { - var f = d.fields[fieldID]; - if (f) { // add or replace - _fields[fieldID] = presetField(fieldID, f); - } else { // remove - delete _fields[fieldID]; + if (intersects$1(bbox, childBBox)) { + if (node.leaf) result.push(child);else if (contains$1(bbox, childBBox)) this._all(child, result);else nodesToSearch.push(child); } - }); - } + } - // Merge Presets - if (d.presets) { - Object.keys(d.presets).forEach(function (presetID) { - var p = d.presets[presetID]; - if (p) { // add or replace - var isAddable = !_addablePresetIDs || _addablePresetIDs.has(presetID); - _presets[presetID] = presetPreset(presetID, p, isAddable, _fields, _presets); - } else { // remove (but not if it's a fallback) - var existing = _presets[presetID]; - if (existing && !existing.isFallback()) { - delete _presets[presetID]; - } - } - }); + node = nodesToSearch.pop(); } - // Need to rebuild _this.collection before loading categories - _this.collection = Object.values(_presets).concat(Object.values(_categories)); - - // Merge Categories - if (d.categories) { - Object.keys(d.categories).forEach(function (categoryID) { - var c = d.categories[categoryID]; - if (c) { // add or replace - _categories[categoryID] = presetCategory(categoryID, c, _this); - } else { // remove - delete _categories[categoryID]; - } - }); - } + return result; + }, + collides: function collides(bbox) { + var node = this.data, + toBBox = this.toBBox; + if (!intersects$1(bbox, node)) return false; + var nodesToSearch = [], + i, + len, + child, + childBBox; - // Rebuild _this.collection after loading categories - _this.collection = Object.values(_presets).concat(Object.values(_categories)); + while (node) { + for (i = 0, len = node.children.length; i < len; i++) { + child = node.children[i]; + childBBox = node.leaf ? toBBox(child) : child; - // Merge Defaults - if (d.defaults) { - Object.keys(d.defaults).forEach(function (geometry) { - var def = d.defaults[geometry]; - if (Array.isArray(def)) { // add or replace - _defaults[geometry] = presetCollection( - def.map(function (id) { return _presets[id] || _categories[id]; }).filter(Boolean) - ); - } else { // remove - delete _defaults[geometry]; + if (intersects$1(bbox, childBBox)) { + if (node.leaf || contains$1(bbox, childBBox)) return true; + nodesToSearch.push(child); } - }); + } + + node = nodesToSearch.pop(); } - // Rebuild universal fields array - _universal = Object.values(_fields).filter(function (field) { return field.universal; }); + return false; + }, + load: function load(data) { + if (!(data && data.length)) return this; - // Reset all the preset fields - they'll need to be resolved again - Object.values(_presets).forEach(function (preset) { return preset.resetFields(); }); + if (data.length < this._minEntries) { + for (var i = 0, len = data.length; i < len; i++) { + this.insert(data[i]); + } - // Rebuild geometry index - _geometryIndex = { point: {}, vertex: {}, line: {}, area: {}, relation: {} }; - _this.collection.forEach(function (preset) { - (preset.geometry || []).forEach(function (geometry) { - var g = _geometryIndex[geometry]; - for (var key in preset.tags) { - (g[key] = g[key] || []).push(preset); - } - }); - }); + return this; + } // recursively build the tree with the given data from scratch using OMT algorithm - return _this; - }; + var node = this._build(data.slice(), 0, data.length - 1, 0); - _this.match = function (entity, resolver) { - return resolver.transient(entity, 'presetMatch', function () { - var geometry = entity.geometry(resolver); - // Treat entities on addr:interpolation lines as points, not vertices - #3241 - if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) { - geometry = 'point'; - } - return _this.matchTags(entity.tags, geometry); - }); - }; + if (!this.data.children.length) { + // save as is if tree is empty + this.data = node; + } else if (this.data.height === node.height) { + // split root if trees have the same height + this._splitRoot(this.data, node); + } else { + if (this.data.height < node.height) { + // swap trees if inserted one is bigger + var tmpNode = this.data; + this.data = node; + node = tmpNode; + } // insert the small tree into the large tree at appropriate level - _this.matchTags = function (tags, geometry) { - var geometryMatches = _geometryIndex[geometry]; - var address; - var best = -1; - var match; + this._insert(node, this.data.height - node.height - 1, true); + } - for (var k in tags) { - // If any part of an address is present, allow fallback to "Address" preset - #4353 - if (/^addr:/.test(k) && geometryMatches['addr:*']) { - address = geometryMatches['addr:*'][0]; + return this; + }, + insert: function insert(item) { + if (item) this._insert(item, this.data.height - 1); + return this; + }, + clear: function clear() { + this.data = createNode$1([]); + return this; + }, + remove: function remove(item, equalsFn) { + if (!item) return this; + var node = this.data, + bbox = this.toBBox(item), + path = [], + indexes = [], + i, + parent, + index, + goingUp; // depth-first iterative tree traversal + + while (node || path.length) { + if (!node) { + // go up + node = path.pop(); + parent = path[path.length - 1]; + i = indexes.pop(); + goingUp = true; } - var keyMatches = geometryMatches[k]; - if (!keyMatches) { continue; } + if (node.leaf) { + // check current node + index = findItem$1(item, node.children, equalsFn); + + if (index !== -1) { + // item found, remove the item and condense tree upwards + node.children.splice(index, 1); + path.push(node); + + this._condense(path); - for (var i = 0; i < keyMatches.length; i++) { - var score = keyMatches[i].matchScore(tags); - if (score > best) { - best = score; - match = keyMatches[i]; + return this; } } + + if (!goingUp && !node.leaf && contains$1(node, bbox)) { + // go down + path.push(node); + indexes.push(i); + i = 0; + parent = node; + node = node.children[0]; + } else if (parent) { + // go right + i++; + node = parent.children[i]; + goingUp = false; + } else node = null; // nothing found + } - if (address && (!match || match.isFallback())) { - match = address; + return this; + }, + toBBox: function toBBox(item) { + return item; + }, + compareMinX: compareNodeMinX$1, + compareMinY: compareNodeMinY$1, + toJSON: function toJSON() { + return this.data; + }, + fromJSON: function fromJSON(data) { + this.data = data; + return this; + }, + _all: function _all(node, result) { + var nodesToSearch = []; + + while (node) { + if (node.leaf) result.push.apply(result, node.children);else nodesToSearch.push.apply(nodesToSearch, node.children); + node = nodesToSearch.pop(); } - return match || _this.fallback(geometry); - }; + return result; + }, + _build: function _build(items, left, right, height) { + var N = right - left + 1, + M = this._maxEntries, + node; - _this.allowsVertex = function (entity, resolver) { - if (entity.type !== 'node') { return false; } - if (Object.keys(entity.tags).length === 0) { return true; } + if (N <= M) { + // reached leaf level; return leaf + node = createNode$1(items.slice(left, right + 1)); + calcBBox$1(node, this.toBBox); + return node; + } - return resolver.transient(entity, 'vertexMatch', function () { - // address lines allow vertices to act as standalone points - if (entity.isOnAddressLine(resolver)) { return true; } + if (!height) { + // target height of the bulk-loaded tree + height = Math.ceil(Math.log(N) / Math.log(M)); // target number of root entries to maximize storage utilization - var geometries = osmNodeGeometriesForTags(entity.tags); - if (geometries.vertex) { return true; } - if (geometries.point) { return false; } - // allow vertices for unspecified points - return true; - }); - }; + M = Math.ceil(N / Math.pow(M, height - 1)); + } + node = createNode$1([]); + node.leaf = false; + node.height = height; // split the items into M mostly square tiles - // Because of the open nature of tagging, iD will never have a complete - // list of tags used in OSM, so we want it to have logic like "assume - // that a closed way with an amenity tag is an area, unless the amenity - // is one of these specific types". This function computes a structure - // that allows testing of such conditions, based on the presets designated - // as as supporting (or not supporting) the area geometry. - // - // The returned object L is a keeplist/discardlist of tags. A closed way - // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])` - // (see `Way#isArea()`). In other words, the keys of L form the keeplist, - // and the subkeys form the discardlist. - _this.areaKeys = function () { - // The ignore list is for keys that imply lines. (We always add `area=yes` for exceptions) - var ignore = ['barrier', 'highway', 'footway', 'railway', 'junction', 'type']; - var areaKeys = {}; + var N2 = Math.ceil(N / M), + N1 = N2 * Math.ceil(Math.sqrt(M)), + i, + j, + right2, + right3; + multiSelect$1(items, left, right, N1, this.compareMinX); - // ignore name-suggestion-index and deprecated presets - var presets = _this.collection.filter(function (p) { return !p.suggestion && !p.replacement; }); + for (i = left; i <= right; i += N1) { + right2 = Math.min(i + N1 - 1, right); + multiSelect$1(items, i, right2, N2, this.compareMinY); - // keeplist - presets.forEach(function (p) { - var key; - for (key in p.tags) { break; } // pick the first tag - if (!key) { return; } - if (ignore.indexOf(key) !== -1) { return; } + for (j = i; j <= right2; j += N2) { + right3 = Math.min(j + N2 - 1, right2); // pack each entry recursively - if (p.geometry.indexOf('area') !== -1) { // probably an area.. - areaKeys[key] = areaKeys[key] || {}; + node.children.push(this._build(items, j, right3, height - 1)); } - }); + } - // discardlist - presets.forEach(function (p) { - var key; - for (key in p.addTags) { - // examine all addTags to get a better sense of what can be tagged on lines - #6800 - var value = p.addTags[key]; - if (key in areaKeys && // probably an area... - p.geometry.indexOf('line') !== -1 && // but sometimes a line - value !== '*') { - areaKeys[key][value] = true; + calcBBox$1(node, this.toBBox); + return node; + }, + _chooseSubtree: function _chooseSubtree(bbox, node, level, path) { + var i, len, child, targetNode, area, enlargement, minArea, minEnlargement; + + while (true) { + path.push(node); + if (node.leaf || path.length - 1 === level) break; + minArea = minEnlargement = Infinity; + + for (i = 0, len = node.children.length; i < len; i++) { + child = node.children[i]; + area = bboxArea$1(child); + enlargement = enlargedArea$1(bbox, child) - area; // choose entry with the least area enlargement + + if (enlargement < minEnlargement) { + minEnlargement = enlargement; + minArea = area < minArea ? area : minArea; + targetNode = child; + } else if (enlargement === minEnlargement) { + // otherwise choose one with the smallest area + if (area < minArea) { + minArea = area; + targetNode = child; + } } } - }); - return areaKeys; - }; + node = targetNode || node.children[0]; + } + return node; + }, + _insert: function _insert(item, level, isNode) { + var toBBox = this.toBBox, + bbox = isNode ? item : toBBox(item), + insertPath = []; // find the best node for accommodating the item, saving all nodes along the path too - _this.pointTags = function () { - return _this.collection.reduce(function (pointTags, d) { - // ignore name-suggestion-index, deprecated, and generic presets - if (d.suggestion || d.replacement || d.searchable === false) { return pointTags; } + var node = this._chooseSubtree(bbox, this.data, level, insertPath); // put the item into the node - // only care about the primary tag - var key; - for (key in d.tags) { break; } // pick the first tag - if (!key) { return pointTags; } - // if this can be a point - if (d.geometry.indexOf('point') !== -1) { - pointTags[key] = pointTags[key] || {}; - pointTags[key][d.tags[key]] = true; - } - return pointTags; - }, {}); - }; + node.children.push(item); + extend$2(node, bbox); // split on node overflow; propagate upwards if necessary + while (level >= 0) { + if (insertPath[level].children.length > this._maxEntries) { + this._split(insertPath, level); - _this.vertexTags = function () { - return _this.collection.reduce(function (vertexTags, d) { - // ignore name-suggestion-index, deprecated, and generic presets - if (d.suggestion || d.replacement || d.searchable === false) { return vertexTags; } + level--; + } else break; + } // adjust bboxes along the insertion path - // only care about the primary tag - var key; - for (key in d.tags) { break; } // pick the first tag - if (!key) { return vertexTags; } - // if this can be a vertex - if (d.geometry.indexOf('vertex') !== -1) { - vertexTags[key] = vertexTags[key] || {}; - vertexTags[key][d.tags[key]] = true; - } - return vertexTags; - }, {}); - }; + this._adjustParentBBoxes(bbox, insertPath, level); + }, + // split overflowed node into two + _split: function _split(insertPath, level) { + var node = insertPath[level], + M = node.children.length, + m = this._minEntries; + this._chooseSplitAxis(node, m, M); - _this.field = function (id) { return _fields[id]; }; + var splitIndex = this._chooseSplitIndex(node, m, M); - _this.universal = function () { return _universal; }; + var newNode = createNode$1(node.children.splice(splitIndex, node.children.length - splitIndex)); + newNode.height = node.height; + newNode.leaf = node.leaf; + calcBBox$1(node, this.toBBox); + calcBBox$1(newNode, this.toBBox); + if (level) insertPath[level - 1].children.push(newNode);else this._splitRoot(node, newNode); + }, + _splitRoot: function _splitRoot(node, newNode) { + // split root node + this.data = createNode$1([node, newNode]); + this.data.height = node.height + 1; + this.data.leaf = false; + calcBBox$1(this.data, this.toBBox); + }, + _chooseSplitIndex: function _chooseSplitIndex(node, m, M) { + var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index; + minOverlap = minArea = Infinity; + + for (i = m; i <= M - m; i++) { + bbox1 = distBBox$1(node, 0, i, this.toBBox); + bbox2 = distBBox$1(node, i, M, this.toBBox); + overlap = intersectionArea$1(bbox1, bbox2); + area = bboxArea$1(bbox1) + bboxArea$1(bbox2); // choose distribution with minimum overlap + + if (overlap < minOverlap) { + minOverlap = overlap; + index = i; + minArea = area < minArea ? area : minArea; + } else if (overlap === minOverlap) { + // otherwise choose distribution with minimum area + if (area < minArea) { + minArea = area; + index = i; + } + } + } + return index; + }, + // sorts node children by the best axis for split + _chooseSplitAxis: function _chooseSplitAxis(node, m, M) { + var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX$1, + compareMinY = node.leaf ? this.compareMinY : compareNodeMinY$1, + xMargin = this._allDistMargin(node, m, M, compareMinX), + yMargin = this._allDistMargin(node, m, M, compareMinY); // if total distributions margin value is minimal for x, sort by minX, + // otherwise it's already sorted by minY - _this.defaults = function (geometry, n, startWithRecents) { - var recents = []; - if (startWithRecents) { - recents = _this.recent().matchGeometry(geometry).collection.slice(0, 4); - } - var defaults; - if (_addablePresetIDs) { - defaults = Array.from(_addablePresetIDs).map(function(id) { - var preset = _this.item(id); - if (preset && preset.matchGeometry(geometry)) { return preset; } - return null; - }).filter(Boolean); - } else { - defaults = _defaults[geometry].collection.concat(_this.fallback(geometry)); - } - return presetCollection( - utilArrayUniq(recents.concat(defaults)).slice(0, n - 1) - ); - }; + if (xMargin < yMargin) node.children.sort(compareMinX); + }, + // total margin of all possible split distributions where each node is at least m full + _allDistMargin: function _allDistMargin(node, m, M, compare) { + node.children.sort(compare); + var toBBox = this.toBBox, + leftBBox = distBBox$1(node, 0, m, toBBox), + rightBBox = distBBox$1(node, M - m, M, toBBox), + margin = bboxMargin$1(leftBBox) + bboxMargin$1(rightBBox), + i, + child; - // pass a Set of addable preset ids - _this.addablePresetIDs = function(val) { - if (!arguments.length) { return _addablePresetIDs; } + for (i = m; i < M - m; i++) { + child = node.children[i]; + extend$2(leftBBox, node.leaf ? toBBox(child) : child); + margin += bboxMargin$1(leftBBox); + } - // accept and convert arrays - if (Array.isArray(val)) { val = new Set(val); } + for (i = M - m - 1; i >= m; i--) { + child = node.children[i]; + extend$2(rightBBox, node.leaf ? toBBox(child) : child); + margin += bboxMargin$1(rightBBox); + } - _addablePresetIDs = val; - if (_addablePresetIDs) { // reset all presets - _this.collection.forEach(function (p) { - // categories aren't addable - if (p.addable) { p.addable(_addablePresetIDs.has(p.id)); } - }); - } else { - _this.collection.forEach(function (p) { - if (p.addable) { p.addable(true); } - }); + return margin; + }, + _adjustParentBBoxes: function _adjustParentBBoxes(bbox, path, level) { + // adjust bboxes along the given tree path + for (var i = level; i >= 0; i--) { + extend$2(path[i], bbox); + } + }, + _condense: function _condense(path) { + // go through the path, removing empty nodes and updating bboxes + for (var i = path.length - 1, siblings; i >= 0; i--) { + if (path[i].children.length === 0) { + if (i > 0) { + siblings = path[i - 1].children; + siblings.splice(siblings.indexOf(path[i]), 1); + } else this.clear(); + } else calcBBox$1(path[i], this.toBBox); } + }, + _initFormat: function _initFormat(format) { + // data format (minX, minY, maxX, maxY accessors) + // uses eval-type function compilation instead of just accepting a toBBox function + // because the algorithms are very sensitive to sorting functions performance, + // so they should be dead simple and without inner calls + var compareArr = ['return a', ' - b', ';']; + this.compareMinX = new Function('a', 'b', compareArr.join(format[0])); + this.compareMinY = new Function('a', 'b', compareArr.join(format[1])); + this.toBBox = new Function('a', 'return {minX: a' + format[0] + ', minY: a' + format[1] + ', maxX: a' + format[2] + ', maxY: a' + format[3] + '};'); + } + }; - return _this; - }; + function findItem$1(item, items, equalsFn) { + if (!equalsFn) return items.indexOf(item); + for (var i = 0; i < items.length; i++) { + if (equalsFn(item, items[i])) return i; + } - _this.recent = function () { - return presetCollection( - utilArrayUniq(_this.getRecents().map(function (d) { return d.preset; })) - ); - }; + return -1; + } // calculate node's bbox from bboxes of its children - function RibbonItem(preset, source) { - var item = {}; - item.preset = preset; - item.source = source; + function calcBBox$1(node, toBBox) { + distBBox$1(node, 0, node.children.length, toBBox, node); + } // min bounding rectangle of node children from k to p-1 - item.isFavorite = function () { return item.source === 'favorite'; }; - item.isRecent = function () { return item.source === 'recent'; }; - item.matches = function (preset) { return item.preset.id === preset.id; }; - item.minified = function () { return ({ pID: item.preset.id }); }; - return item; + function distBBox$1(node, k, p, toBBox, destNode) { + if (!destNode) destNode = createNode$1(null); + destNode.minX = Infinity; + destNode.minY = Infinity; + destNode.maxX = -Infinity; + destNode.maxY = -Infinity; + + for (var i = k, child; i < p; i++) { + child = node.children[i]; + extend$2(destNode, node.leaf ? toBBox(child) : child); } + return destNode; + } - function ribbonItemForMinified(d, source) { - if (d && d.pID) { - var preset = _this.item(d.pID); - if (!preset) { return null; } - return RibbonItem(preset, source); - } - return null; - } + function extend$2(a, b) { + a.minX = Math.min(a.minX, b.minX); + a.minY = Math.min(a.minY, b.minY); + a.maxX = Math.max(a.maxX, b.maxX); + a.maxY = Math.max(a.maxY, b.maxY); + return a; + } + function compareNodeMinX$1(a, b) { + return a.minX - b.minX; + } - _this.getGenericRibbonItems = function () { - return ['point', 'line', 'area'].map(function (id) { return RibbonItem(_this.item(id), 'generic'); }); - }; + function compareNodeMinY$1(a, b) { + return a.minY - b.minY; + } + function bboxArea$1(a) { + return (a.maxX - a.minX) * (a.maxY - a.minY); + } - _this.getAddable = function () { - if (!_addablePresetIDs) { return []; } + function bboxMargin$1(a) { + return a.maxX - a.minX + (a.maxY - a.minY); + } - return _addablePresetIDs.map(function (id) { - var preset = _this.item(id); - if (preset) { - return RibbonItem(preset, 'addable'); - } - }).filter(Boolean); - }; + function enlargedArea$1(a, b) { + return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) * (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY)); + } + function intersectionArea$1(a, b) { + var minX = Math.max(a.minX, b.minX), + minY = Math.max(a.minY, b.minY), + maxX = Math.min(a.maxX, b.maxX), + maxY = Math.min(a.maxY, b.maxY); + return Math.max(0, maxX - minX) * Math.max(0, maxY - minY); + } - function setRecents(items) { - _recents = items; - var minifiedItems = items.map(function (d) { return d.minified(); }); - corePreferences('preset_recents', JSON.stringify(minifiedItems)); - dispatch$1.call('recentsChange'); - } + function contains$1(a, b) { + return a.minX <= b.minX && a.minY <= b.minY && b.maxX <= a.maxX && b.maxY <= a.maxY; + } + function intersects$1(a, b) { + return b.minX <= a.maxX && b.minY <= a.maxY && b.maxX >= a.minX && b.maxY >= a.minY; + } - _this.getRecents = function () { - if (!_recents) { - // fetch from local storage - _recents = (JSON.parse(corePreferences('preset_recents')) || []) - .reduce(function (acc, d) { - var item = ribbonItemForMinified(d, 'recent'); - if (item && item.preset.addable()) { acc.push(item); } - return acc; - }, []); - } - return _recents; - }; + function createNode$1(children) { + return { + children: children, + height: 1, + leaf: true, + minX: Infinity, + minY: Infinity, + maxX: -Infinity, + maxY: -Infinity + }; + } // sort an array so that items come in groups of n unsorted items, with groups sorted between each other; + // combines selection algorithm with binary divide & conquer approach - _this.addRecent = function (preset, besidePreset, after) { - var recents = _this.getRecents(); + function multiSelect$1(arr, left, right, n, compare) { + var stack = [left, right], + mid; - var beforeItem = _this.recentMatching(besidePreset); - var toIndex = recents.indexOf(beforeItem); - if (after) { toIndex += 1; } + while (stack.length) { + right = stack.pop(); + left = stack.pop(); + if (right - left <= n) continue; + mid = left + Math.ceil((right - left) / n / 2) * n; + quickselect$1(arr, mid, left, right, compare); + stack.push(left, mid, mid, right); + } + } - var newItem = RibbonItem(preset, 'recent'); - recents.splice(toIndex, 0, newItem); - setRecents(recents); - }; + var lineclip_1 = lineclip$2; + lineclip$2.polyline = lineclip$2; + lineclip$2.polygon = polygonclip$1; // Cohen-Sutherland line clippign algorithm, adapted to efficiently + // handle polylines rather than just segments + function lineclip$2(points, bbox, result) { + var len = points.length, + codeA = bitCode$1(points[0], bbox), + part = [], + i, + a, + b, + codeB, + lastCode; + if (!result) result = []; - _this.removeRecent = function (preset) { - var item = _this.recentMatching(preset); - if (item) { - var items = _this.getRecents(); - items.splice(items.indexOf(item), 1); - setRecents(items); - } - }; + for (i = 1; i < len; i++) { + a = points[i - 1]; + b = points[i]; + codeB = lastCode = bitCode$1(b, bbox); + while (true) { + if (!(codeA | codeB)) { + // accept + part.push(a); + + if (codeB !== lastCode) { + // segment went outside + part.push(b); + + if (i < len - 1) { + // start a new line + result.push(part); + part = []; + } + } else if (i === len - 1) { + part.push(b); + } - _this.recentMatching = function (preset) { - var items = _this.getRecents(); - for (var i in items) { - if (items[i].matches(preset)) { - return items[i]; + break; + } else if (codeA & codeB) { + // trivial reject + break; + } else if (codeA) { + // a outside, intersect with clip edge + a = intersect$1(a, b, codeA, bbox); + codeA = bitCode$1(a, bbox); + } else { + // b outside + b = intersect$1(a, b, codeB, bbox); + codeB = bitCode$1(b, bbox); } } - return null; - }; + codeA = lastCode; + } - _this.moveItem = function (items, fromIndex, toIndex) { - if (fromIndex === toIndex || - fromIndex < 0 || toIndex < 0 || - fromIndex >= items.length || toIndex >= items.length - ) { return null; } + if (part.length) result.push(part); + return result; + } // Sutherland-Hodgeman polygon clipping algorithm - items.splice(toIndex, 0, items.splice(fromIndex, 1)[0]); - return items; - }; + function polygonclip$1(points, bbox) { + var result, edge, prev, prevInside, i, p, inside; // clip against each side of the clip rectangle - _this.moveRecent = function (item, beforeItem) { - var recents = _this.getRecents(); - var fromIndex = recents.indexOf(item); - var toIndex = recents.indexOf(beforeItem); - var items = _this.moveItem(recents, fromIndex, toIndex); - if (items) { setRecents(items); } - }; + for (edge = 1; edge <= 8; edge *= 2) { + result = []; + prev = points[points.length - 1]; + prevInside = !(bitCode$1(prev, bbox) & edge); + for (i = 0; i < points.length; i++) { + p = points[i]; + inside = !(bitCode$1(p, bbox) & edge); // if segment goes through the clip window, add an intersection - _this.setMostRecent = function (preset) { - if (preset.searchable === false) { return; } + if (inside !== prevInside) result.push(intersect$1(prev, p, edge, bbox)); + if (inside) result.push(p); // add a point if it's inside - var items = _this.getRecents(); - var item = _this.recentMatching(preset); - if (item) { - items.splice(items.indexOf(item), 1); - } else { - item = RibbonItem(preset, 'recent'); + prev = p; + prevInside = inside; } - // remove the last recent (first in, first out) - while (items.length >= MAXRECENTS) { - items.pop(); - } + points = result; + if (!points.length) break; + } + + return result; + } // intersect a segment against one of the 4 lines that make up the bbox + - // prepend array - items.unshift(item); - setRecents(items); - }; + function intersect$1(a, b, edge, bbox) { + return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top + edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom + edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right + edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left + null; + } // bit code reflects the point position relative to the bbox: + // left mid right + // top 1001 1000 1010 + // mid 0001 0000 0010 + // bottom 0101 0100 0110 - function setFavorites(items) { - _favorites = items; - var minifiedItems = items.map(function (d) { return d.minified(); }); - corePreferences('preset_favorites', JSON.stringify(minifiedItems)); - // call update - dispatch$1.call('favoritePreset'); - } + function bitCode$1(p, bbox) { + var code = 0; + if (p[0] < bbox[0]) code |= 1; // left + else if (p[0] > bbox[2]) code |= 2; // right - _this.addFavorite = function (preset, besidePreset, after) { - var favorites = _this.getFavorites(); + if (p[1] < bbox[1]) code |= 4; // bottom + else if (p[1] > bbox[3]) code |= 8; // top - var beforeItem = _this.favoriteMatching(besidePreset); - var toIndex = favorites.indexOf(beforeItem); - if (after) { toIndex += 1; } + return code; + } - var newItem = RibbonItem(preset, 'favorite'); - favorites.splice(toIndex, 0, newItem); - setFavorites(favorites); - }; + var rbush = rbush$2.exports; + var lineclip$1 = lineclip_1; + var whichPolygon_1 = whichPolygon; - _this.toggleFavorite = function (preset) { - var favs = _this.getFavorites(); - var favorite = _this.favoriteMatching(preset); - if (favorite) { - favs.splice(favs.indexOf(favorite), 1); - } else { - // only allow 10 favorites - if (favs.length === 10) { - // remove the last favorite (last in, first out) - favs.pop(); + function whichPolygon(data) { + var bboxes = []; + + for (var i = 0; i < data.features.length; i++) { + var feature = data.features[i]; + var coords = feature.geometry.coordinates; + + if (feature.geometry.type === 'Polygon') { + bboxes.push(treeItem(coords, feature.properties)); + } else if (feature.geometry.type === 'MultiPolygon') { + for (var j = 0; j < coords.length; j++) { + bboxes.push(treeItem(coords[j], feature.properties)); } - // append array - favs.push(RibbonItem(preset, 'favorite')); } - setFavorites(favs); - }; + } + var tree = rbush().load(bboxes); - _this.removeFavorite = function (preset) { - var item = _this.favoriteMatching(preset); - if (item) { - var items = _this.getFavorites(); - items.splice(items.indexOf(item), 1); - setFavorites(items); + function query(p, multi) { + var output = [], + result = tree.search({ + minX: p[0], + minY: p[1], + maxX: p[0], + maxY: p[1] + }); + + for (var i = 0; i < result.length; i++) { + if (insidePolygon(result[i].coords, p)) { + if (multi) output.push(result[i].props);else return result[i].props; + } } - }; + return multi && output.length ? output : null; + } - _this.getFavorites = function () { - if (!_favorites) { + query.tree = tree; - // fetch from local storage - var rawFavorites = JSON.parse(corePreferences('preset_favorites')); + query.bbox = function queryBBox(bbox) { + var output = []; + var result = tree.search({ + minX: bbox[0], + minY: bbox[1], + maxX: bbox[2], + maxY: bbox[3] + }); - if (!rawFavorites) { - rawFavorites = []; - corePreferences('preset_favorites', JSON.stringify(rawFavorites)); + for (var i = 0; i < result.length; i++) { + if (polygonIntersectsBBox(result[i].coords, bbox)) { + output.push(result[i].props); } - - _favorites = rawFavorites.reduce(function (output, d) { - var item = ribbonItemForMinified(d, 'favorite'); - if (item && item.preset.addable()) { output.push(item); } - return output; - }, []); } - return _favorites; + + return output; }; + return query; + } - _this.favoriteMatching = function (preset) { - var favs = _this.getFavorites(); - for (var index in favs) { - if (favs[index].matches(preset)) { - return favs[index]; - } - } - return null; - }; + function polygonIntersectsBBox(polygon, bbox) { + var bboxCenter = [(bbox[0] + bbox[2]) / 2, (bbox[1] + bbox[3]) / 2]; + if (insidePolygon(polygon, bboxCenter)) return true; + for (var i = 0; i < polygon.length; i++) { + if (lineclip$1(polygon[i], bbox).length > 0) return true; + } - return utilRebind(_this, dispatch$1, 'on'); - } + return false; + } // ray casting algorithm for detecting if point is in polygon - function utilTagText(entity) { - var obj = (entity && entity.tags) || {}; - return Object.keys(obj) - .map(function(k) { return k + '=' + obj[k]; }) - .join(', '); - } + function insidePolygon(rings, p) { + var inside = false; - function utilTotalExtent(array, graph) { - var extent = geoExtent(); - var val, entity; - for (var i = 0; i < array.length; i++) { - val = array[i]; - entity = typeof val === 'string' ? graph.hasEntity(val) : val; - if (entity) { - extent._extend(entity.extent(graph)); - } + for (var i = 0, len = rings.length; i < len; i++) { + var ring = rings[i]; + + for (var j = 0, len2 = ring.length, k = len2 - 1; j < len2; k = j++) { + if (rayIntersect(p, ring[j], ring[k])) inside = !inside; } - return extent; - } + } + return inside; + } - function utilTagDiff(oldTags, newTags) { - var tagDiff = []; - var keys = utilArrayUnion(Object.keys(oldTags), Object.keys(newTags)).sort(); - keys.forEach(function(k) { - var oldVal = oldTags[k]; - var newVal = newTags[k]; - - if ((oldVal || oldVal === '') && (newVal === undefined || newVal !== oldVal)) { - tagDiff.push({ - type: '-', - key: k, - oldVal: oldVal, - newVal: newVal, - display: '- ' + k + '=' + oldVal - }); - } - if ((newVal || newVal === '') && (oldVal === undefined || newVal !== oldVal)) { - tagDiff.push({ - type: '+', - key: k, - oldVal: oldVal, - newVal: newVal, - display: '+ ' + k + '=' + newVal - }); - } - }); - return tagDiff; + function rayIntersect(p, p1, p2) { + 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]; } + function treeItem(coords, props) { + var item = { + minX: Infinity, + minY: Infinity, + maxX: -Infinity, + maxY: -Infinity, + coords: coords, + props: props + }; + + for (var i = 0; i < coords[0].length; i++) { + var p = coords[0][i]; + item.minX = Math.min(item.minX, p[0]); + item.minY = Math.min(item.minY, p[1]); + item.maxX = Math.max(item.maxX, p[0]); + item.maxY = Math.max(item.maxY, p[1]); + } - function utilEntitySelector(ids) { - return ids.length ? '.' + ids.join(',.') : 'nothing'; + return item; } + var type = "FeatureCollection"; + var features = [{ + type: "Feature", + properties: { + wikidata: "Q21", + nameEn: "England", + aliases: ["GB-ENG"], + country: "GB", + groups: ["Q23666", "Q3336843", "154", "150", "UN"], + driveSide: "left", + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["44"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-6.03913, 51.13217], [-7.74976, 48.64773], [1.17405, 50.74239], [2.18458, 51.52087], [2.56575, 51.85301], [0.792, 57.56437], [-2.30613, 55.62698], [-2.17058, 55.45916], [-2.6095, 55.28488], [-2.63532, 55.19452], [-3.02906, 55.04606], [-3.09361, 54.94924], [-3.38407, 54.94278], [-4.1819, 54.57861], [-3.5082, 53.54318], [-3.08228, 53.25526], [-3.03675, 53.25092], [-2.92329, 53.19383], [-2.92022, 53.17685], [-2.98598, 53.15589], [-2.90649, 53.10964], [-2.87469, 53.12337], [-2.89131, 53.09374], [-2.83133, 52.99184], [-2.7251, 52.98389], [-2.72221, 52.92969], [-2.80549, 52.89428], [-2.85897, 52.94487], [-2.92401, 52.93836], [-2.97243, 52.9651], [-3.13576, 52.895], [-3.15744, 52.84947], [-3.16105, 52.79599], [-3.08734, 52.77504], [-3.01001, 52.76636], [-2.95581, 52.71794], [-3.01724, 52.72083], [-3.04398, 52.65435], [-3.13648, 52.58208], [-3.12926, 52.5286], [-3.09746, 52.53077], [-3.08662, 52.54811], [-3.00929, 52.57774], [-2.99701, 52.551], [-3.03603, 52.49969], [-3.13359, 52.49174], [-3.22971, 52.45344], [-3.22754, 52.42526], [-3.04687, 52.34504], [-2.95364, 52.3501], [-2.99701, 52.323], [-3.00785, 52.2753], [-3.09289, 52.20546], [-3.12638, 52.08114], [-2.97111, 51.90456], [-2.8818, 51.93196], [-2.78742, 51.88833], [-2.74277, 51.84367], [-2.66234, 51.83555], [-2.66336, 51.59504], [-3.20563, 51.31615], [-6.03913, 51.13217]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q22", + nameEn: "Scotland", + aliases: ["GB-SCT"], + country: "GB", + groups: ["Q23666", "Q3336843", "154", "150", "UN"], + driveSide: "left", + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["44"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[0.792, 57.56437], [-0.3751, 61.32236], [-14.78497, 57.60709], [-6.82333, 55.83103], [-4.69044, 54.3629], [-3.38407, 54.94278], [-3.09361, 54.94924], [-3.02906, 55.04606], [-2.63532, 55.19452], [-2.6095, 55.28488], [-2.17058, 55.45916], [-2.30613, 55.62698], [0.792, 57.56437]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q25", + nameEn: "Wales", + aliases: ["GB-WLS"], + country: "GB", + groups: ["Q23666", "Q3336843", "154", "150", "UN"], + driveSide: "left", + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["44"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-3.5082, 53.54318], [-5.37267, 53.63269], [-6.03913, 51.13217], [-3.20563, 51.31615], [-2.66336, 51.59504], [-2.66234, 51.83555], [-2.74277, 51.84367], [-2.78742, 51.88833], [-2.8818, 51.93196], [-2.97111, 51.90456], [-3.12638, 52.08114], [-3.09289, 52.20546], [-3.00785, 52.2753], [-2.99701, 52.323], [-2.95364, 52.3501], [-3.04687, 52.34504], [-3.22754, 52.42526], [-3.22971, 52.45344], [-3.13359, 52.49174], [-3.03603, 52.49969], [-2.99701, 52.551], [-3.00929, 52.57774], [-3.08662, 52.54811], [-3.09746, 52.53077], [-3.12926, 52.5286], [-3.13648, 52.58208], [-3.04398, 52.65435], [-3.01724, 52.72083], [-2.95581, 52.71794], [-3.01001, 52.76636], [-3.08734, 52.77504], [-3.16105, 52.79599], [-3.15744, 52.84947], [-3.13576, 52.895], [-2.97243, 52.9651], [-2.92401, 52.93836], [-2.85897, 52.94487], [-2.80549, 52.89428], [-2.72221, 52.92969], [-2.7251, 52.98389], [-2.83133, 52.99184], [-2.89131, 53.09374], [-2.87469, 53.12337], [-2.90649, 53.10964], [-2.98598, 53.15589], [-2.92022, 53.17685], [-2.92329, 53.19383], [-3.03675, 53.25092], [-3.08228, 53.25526], [-3.5082, 53.54318]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q26", + nameEn: "Northern Ireland", + aliases: ["GB-NIR"], + country: "GB", + groups: ["Q22890", "Q3336843", "154", "150", "UN"], + driveSide: "left", + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["44"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-6.34755, 55.49206], [-7.2471, 55.06933], [-7.34464, 55.04688], [-7.4033, 55.00391], [-7.40004, 54.94498], [-7.44404, 54.9403], [-7.4473, 54.87003], [-7.47626, 54.83084], [-7.54508, 54.79401], [-7.54671, 54.74606], [-7.64449, 54.75265], [-7.75041, 54.7103], [-7.83352, 54.73854], [-7.93293, 54.66603], [-7.70315, 54.62077], [-7.8596, 54.53671], [-7.99812, 54.54427], [-8.04538, 54.48941], [-8.179, 54.46763], [-8.04555, 54.36292], [-7.87101, 54.29299], [-7.8596, 54.21779], [-7.81397, 54.20159], [-7.69501, 54.20731], [-7.55812, 54.12239], [-7.4799, 54.12239], [-7.44567, 54.1539], [-7.32834, 54.11475], [-7.30553, 54.11869], [-7.34005, 54.14698], [-7.29157, 54.17191], [-7.28017, 54.16714], [-7.29687, 54.1354], [-7.29493, 54.12013], [-7.26316, 54.13863], [-7.25012, 54.20063], [-7.14908, 54.22732], [-7.19145, 54.31296], [-7.02034, 54.4212], [-6.87775, 54.34682], [-6.85179, 54.29176], [-6.81583, 54.22791], [-6.74575, 54.18788], [-6.70175, 54.20218], [-6.6382, 54.17071], [-6.66264, 54.0666], [-6.62842, 54.03503], [-6.47849, 54.06947], [-6.36605, 54.07234], [-6.36279, 54.11248], [-6.32694, 54.09337], [-6.29003, 54.11278], [-6.26218, 54.09785], [-5.83481, 53.87749], [-4.69044, 54.3629], [-6.34755, 55.49206]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q35", + nameEn: "Denmark", + country: "DK", + groups: ["EU", "154", "150", "UN"], + callingCodes: ["45"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[12.16597, 56.60205], [10.40861, 58.38489], [7.28637, 57.35913], [8.02459, 55.09613], [8.45719, 55.06747], [8.55769, 54.91837], [8.63979, 54.91069], [8.76387, 54.8948], [8.81178, 54.90518], [8.92795, 54.90452], [9.04629, 54.87249], [9.14275, 54.87421], [9.20571, 54.85841], [9.24631, 54.84726], [9.23445, 54.83432], [9.2474, 54.8112], [9.32771, 54.80602], [9.33849, 54.80233], [9.36496, 54.81749], [9.38532, 54.83968], [9.41213, 54.84254], [9.43155, 54.82586], [9.4659, 54.83131], [9.58937, 54.88785], [9.62734, 54.88057], [9.61187, 54.85548], [9.73563, 54.8247], [9.89314, 54.84171], [10.16755, 54.73883], [10.31111, 54.65968], [11.00303, 54.63689], [11.90309, 54.38543], [12.85844, 54.82438], [13.93395, 54.84044], [15.36991, 54.73263], [15.79951, 55.54655], [14.89259, 55.5623], [14.28399, 55.1553], [12.84405, 55.13257], [12.60345, 55.42675], [12.88472, 55.63369], [12.6372, 55.91371], [12.65312, 56.04345], [12.07466, 56.29488], [12.16597, 56.60205]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q55", + nameEn: "Netherlands", + country: "NL", + groups: ["EU", "155", "150", "UN"], + callingCodes: ["31"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[5.45168, 54.20039], [2.56575, 51.85301], [3.36263, 51.37112], [3.38696, 51.33436], [3.35847, 51.31572], [3.38289, 51.27331], [3.41704, 51.25933], [3.43488, 51.24135], [3.52698, 51.2458], [3.51502, 51.28697], [3.58939, 51.30064], [3.78999, 51.25766], [3.78783, 51.2151], [3.90125, 51.20371], [3.97889, 51.22537], [4.01957, 51.24504], [4.05165, 51.24171], [4.16721, 51.29348], [4.24024, 51.35371], [4.21923, 51.37443], [4.33265, 51.37687], [4.34086, 51.35738], [4.39292, 51.35547], [4.43777, 51.36989], [4.38064, 51.41965], [4.39747, 51.43316], [4.38122, 51.44905], [4.47736, 51.4778], [4.5388, 51.48184], [4.54675, 51.47265], [4.52846, 51.45002], [4.53521, 51.4243], [4.57489, 51.4324], [4.65442, 51.42352], [4.72935, 51.48424], [4.74578, 51.48937], [4.77321, 51.50529], [4.78803, 51.50284], [4.84139, 51.4799], [4.82409, 51.44736], [4.82946, 51.4213], [4.78314, 51.43319], [4.76577, 51.43046], [4.77229, 51.41337], [4.78941, 51.41102], [4.84988, 51.41502], [4.90016, 51.41404], [4.92152, 51.39487], [5.00393, 51.44406], [5.0106, 51.47167], [5.03281, 51.48679], [5.04774, 51.47022], [5.07891, 51.4715], [5.10456, 51.43163], [5.07102, 51.39469], [5.13105, 51.34791], [5.13377, 51.31592], [5.16222, 51.31035], [5.2002, 51.32243], [5.24244, 51.30495], [5.22542, 51.26888], [5.23814, 51.26064], [5.26461, 51.26693], [5.29716, 51.26104], [5.33886, 51.26314], [5.347, 51.27502], [5.41672, 51.26248], [5.4407, 51.28169], [5.46519, 51.2849], [5.48476, 51.30053], [5.515, 51.29462], [5.5569, 51.26544], [5.5603, 51.22249], [5.65145, 51.19788], [5.65528, 51.18736], [5.70344, 51.1829], [5.74617, 51.18928], [5.77735, 51.17845], [5.77697, 51.1522], [5.82564, 51.16753], [5.85508, 51.14445], [5.80798, 51.11661], [5.8109, 51.10861], [5.83226, 51.10585], [5.82921, 51.09328], [5.79903, 51.09371], [5.79835, 51.05834], [5.77258, 51.06196], [5.75961, 51.03113], [5.77688, 51.02483], [5.76242, 50.99703], [5.71864, 50.96092], [5.72875, 50.95428], [5.74752, 50.96202], [5.75927, 50.95601], [5.74644, 50.94723], [5.72545, 50.92312], [5.72644, 50.91167], [5.71626, 50.90796], [5.69858, 50.91046], [5.67886, 50.88142], [5.64504, 50.87107], [5.64009, 50.84742], [5.65259, 50.82309], [5.70118, 50.80764], [5.68995, 50.79641], [5.70107, 50.7827], [5.68091, 50.75804], [5.69469, 50.75529], [5.72216, 50.76398], [5.73904, 50.75674], [5.74356, 50.7691], [5.76533, 50.78159], [5.77513, 50.78308], [5.80673, 50.7558], [5.84548, 50.76542], [5.84888, 50.75448], [5.88734, 50.77092], [5.89129, 50.75125], [5.89132, 50.75124], [5.95942, 50.7622], [5.97545, 50.75441], [6.01976, 50.75398], [6.02624, 50.77453], [5.97497, 50.79992], [5.98404, 50.80988], [6.00462, 50.80065], [6.02328, 50.81694], [6.01921, 50.84435], [6.05623, 50.8572], [6.05702, 50.85179], [6.07431, 50.84674], [6.07693, 50.86025], [6.08805, 50.87223], [6.07486, 50.89307], [6.09297, 50.92066], [6.01615, 50.93367], [6.02697, 50.98303], [5.95282, 50.98728], [5.90296, 50.97356], [5.90493, 51.00198], [5.87849, 51.01969], [5.86735, 51.05182], [5.9134, 51.06736], [5.9541, 51.03496], [5.98292, 51.07469], [6.16706, 51.15677], [6.17384, 51.19589], [6.07889, 51.17038], [6.07889, 51.24432], [6.16977, 51.33169], [6.22674, 51.36135], [6.22641, 51.39948], [6.20654, 51.40049], [6.21724, 51.48568], [6.18017, 51.54096], [6.09055, 51.60564], [6.11759, 51.65609], [6.02767, 51.6742], [6.04091, 51.71821], [5.95003, 51.7493], [5.98665, 51.76944], [5.94568, 51.82786], [5.99848, 51.83195], [6.06705, 51.86136], [6.10337, 51.84829], [6.16902, 51.84094], [6.11551, 51.89769], [6.15349, 51.90439], [6.21443, 51.86801], [6.29872, 51.86801], [6.30593, 51.84998], [6.40704, 51.82771], [6.38815, 51.87257], [6.47179, 51.85395], [6.50231, 51.86313], [6.58556, 51.89386], [6.68386, 51.91861], [6.72319, 51.89518], [6.82357, 51.96711], [6.83035, 51.9905], [6.68128, 52.05052], [6.76117, 52.11895], [6.83984, 52.11728], [6.97189, 52.20329], [6.9897, 52.2271], [7.03729, 52.22695], [7.06365, 52.23789], [7.02703, 52.27941], [7.07044, 52.37805], [7.03417, 52.40237], [6.99041, 52.47235], [6.94293, 52.43597], [6.69507, 52.488], [6.71641, 52.62905], [6.77307, 52.65375], [7.04557, 52.63318], [7.07253, 52.81083], [7.21694, 53.00742], [7.17898, 53.13817], [7.22681, 53.18165], [7.21679, 53.20058], [7.19052, 53.31866], [7.00198, 53.32672], [6.91025, 53.44221], [5.45168, 54.20039]], [[4.93295, 51.44945], [4.95244, 51.45207], [4.9524, 51.45014], [4.93909, 51.44632], [4.93295, 51.44945]], [[4.91493, 51.4353], [4.91935, 51.43634], [4.92227, 51.44252], [4.91811, 51.44621], [4.92287, 51.44741], [4.92811, 51.4437], [4.92566, 51.44273], [4.92815, 51.43856], [4.92879, 51.44161], [4.93544, 51.44634], [4.94025, 51.44193], [4.93416, 51.44185], [4.93471, 51.43861], [4.94265, 51.44003], [4.93986, 51.43064], [4.92952, 51.42984], [4.92652, 51.43329], [4.91493, 51.4353]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q782", + nameEn: "Hawaii", + aliases: ["US-HI"], + country: "US", + groups: ["Q35657", "061", "009", "UN"], + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["1"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-177.8563, 29.18961], [-179.49839, 27.86265], [-151.6784, 9.55515], [-154.05867, 45.51124], [-177.5224, 27.7635], [-177.8563, 29.18961]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q797", + nameEn: "Alaska", + aliases: ["US-AK"], + country: "US", + groups: ["Q35657", "021", "003", "019", "UN"], + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["1"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[169.34848, 52.47228], [180, 51.0171], [179.84401, 55.10087], [169.34848, 52.47228]]], [[[-168.95635, 65.98512], [-169.03888, 65.48473], [-172.76104, 63.77445], [-179.55295, 57.62081], [-179.55295, 50.81807], [-133.92876, 54.62289], [-130.61931, 54.70835], [-130.64499, 54.76912], [-130.44184, 54.85377], [-130.27203, 54.97174], [-130.18765, 55.07744], [-130.08035, 55.21556], [-129.97513, 55.28029], [-130.15373, 55.74895], [-130.00857, 55.91344], [-130.00093, 56.00325], [-130.10173, 56.12178], [-130.33965, 56.10849], [-130.77769, 56.36185], [-131.8271, 56.62247], [-133.38523, 58.42773], [-133.84645, 58.73543], [-134.27175, 58.8634], [-134.48059, 59.13231], [-134.55699, 59.1297], [-134.7047, 59.2458], [-135.00267, 59.28745], [-135.03069, 59.56208], [-135.48007, 59.79937], [-136.31566, 59.59083], [-136.22381, 59.55526], [-136.33727, 59.44466], [-136.47323, 59.46617], [-136.52365, 59.16752], [-136.82619, 59.16198], [-137.4925, 58.89415], [-137.60623, 59.24465], [-138.62145, 59.76431], [-138.71149, 59.90728], [-139.05365, 59.99655], [-139.20603, 60.08896], [-139.05831, 60.35205], [-139.68991, 60.33693], [-139.98024, 60.18027], [-140.45648, 60.30919], [-140.5227, 60.22077], [-141.00116, 60.30648], [-140.97446, 84.39275], [-168.25765, 71.99091], [-168.95635, 65.98512]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q3492", + nameEn: "Sumatra", + aliases: ["ID-SM"], + country: "ID", + groups: ["035", "142", "UN"], + driveSide: "left", + callingCodes: ["62"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[109.82788, 2.86812], [110.90339, 7.52694], [105.01437, 3.24936], [104.56723, 1.44271], [104.34728, 1.33529], [104.12282, 1.27714], [104.03085, 1.26954], [103.74084, 1.12902], [103.66049, 1.18825], [103.56591, 1.19719], [103.03657, 1.30383], [96.11174, 6.69841], [74.28481, -3.17525], [102.92489, -8.17146], [106.32259, -5.50116], [106.38511, -5.16715], [109.17017, -4.07401], [109.3962, -2.07276], [108.50935, -2.01066], [107.94791, 1.06924], [109.82788, 2.86812]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q3757", + nameEn: "Java", + aliases: ["ID-JW"], + country: "ID", + groups: ["035", "142", "UN"], + driveSide: "left", + callingCodes: ["62"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[109.17017, -4.07401], [106.38511, -5.16715], [106.32259, -5.50116], [102.92489, -8.17146], [116.22542, -10.49172], [114.39575, -8.2889], [114.42235, -8.09762], [114.92859, -7.49253], [116.33992, -7.56171], [116.58433, -5.30385], [109.17017, -4.07401]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q3795", + nameEn: "Kalimantan", + aliases: ["ID-KA"], + country: "ID", + groups: ["Q36117", "035", "142", "UN"], + driveSide: "left", + callingCodes: ["62"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[120.02464, 2.83703], [118.06469, 4.16638], [117.67641, 4.16535], [117.47313, 4.18857], [117.25801, 4.35108], [115.90217, 4.37708], [115.58276, 3.93499], [115.53713, 3.14776], [115.11343, 2.82879], [115.1721, 2.49671], [114.80706, 2.21665], [114.80706, 1.92351], [114.57892, 1.5], [114.03788, 1.44787], [113.64677, 1.23933], [113.01448, 1.42832], [113.021, 1.57819], [112.48648, 1.56516], [112.2127, 1.44135], [112.15679, 1.17004], [111.94553, 1.12016], [111.82846, 0.99349], [111.55434, 0.97864], [111.22979, 1.08326], [110.62374, 0.873], [110.49182, 0.88088], [110.35354, 0.98869], [109.66397, 1.60425], [109.66397, 1.79972], [109.57923, 1.80624], [109.53794, 1.91771], [109.62558, 1.99182], [109.82788, 2.86812], [107.94791, 1.06924], [108.50935, -2.01066], [109.3962, -2.07276], [109.17017, -4.07401], [116.58433, -5.30385], [120.02464, 2.83703]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q3803", + nameEn: "Lesser Sunda Islands", + aliases: ["ID-NU"], + country: "ID", + groups: ["035", "142", "UN"], + driveSide: "left", + callingCodes: ["62"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[116.96967, -8.01483], [114.92859, -7.49253], [114.42235, -8.09762], [114.39575, -8.2889], [116.22542, -10.49172], [122.14954, -11.52517], [125.68138, -9.85176], [125.09025, -9.46406], [124.97892, -9.19281], [125.04044, -9.17093], [125.09434, -9.19669], [125.18907, -9.16434], [125.18632, -9.03142], [125.11764, -8.96359], [124.97742, -9.08128], [124.94011, -8.85617], [124.46701, -9.13002], [124.45971, -9.30263], [124.38554, -9.3582], [124.35258, -9.43002], [124.3535, -9.48493], [124.28115, -9.50453], [124.28115, -9.42189], [124.21247, -9.36904], [124.14517, -9.42324], [124.10539, -9.41206], [124.04286, -9.34243], [124.04628, -9.22671], [124.33472, -9.11416], [124.92337, -8.75859], [125.87688, -7.49892], [116.96967, -8.01483]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q3812", + nameEn: "Sulawesi", + aliases: ["ID-SL"], + country: "ID", + groups: ["035", "142", "UN"], + driveSide: "left", + callingCodes: ["62"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[128.34321, 3.90322], [126.69413, 6.02692], [119.56457, 0.90759], [116.58433, -5.30385], [116.33992, -7.56171], [116.96967, -8.01483], [125.87688, -7.49892], [123.78965, -0.86805], [128.34321, 3.90322]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q3827", + nameEn: "Maluku Islands", + aliases: ["ID-ML"], + country: "ID", + groups: ["035", "142", "UN"], + driveSide: "left", + callingCodes: ["62"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[129.63187, 2.21409], [128.34321, 3.90322], [123.78965, -0.86805], [125.87688, -7.49892], [125.58506, -7.95311], [125.87691, -8.31789], [127.42116, -8.22471], [127.55165, -9.05052], [135.49042, -9.2276], [135.35517, -5.01442], [132.8312, -4.70282], [130.8468, -2.61103], [128.40647, -2.30349], [129.71519, -0.24692], [129.63187, 2.21409]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q3845", + nameEn: "Western New Guinea", + aliases: ["ID-PP"], + country: "ID", + groups: ["035", "142", "UN"], + driveSide: "left", + callingCodes: ["62"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[135.49042, -9.2276], [141.01842, -9.35091], [141.01763, -6.90181], [140.90448, -6.85033], [140.85295, -6.72996], [140.99813, -6.3233], [141.02352, 0.08993], [129.63187, 2.21409], [129.71519, -0.24692], [128.40647, -2.30349], [130.8468, -2.61103], [132.8312, -4.70282], [135.35517, -5.01442], [135.49042, -9.2276]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q5765", + nameEn: "Balearic Islands", + aliases: ["ES-IB"], + country: "ES", + groups: ["EU", "039", "150", "UN"], + callingCodes: ["34 971"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-2.27707, 35.35051], [5.10072, 39.89531], [3.75438, 42.33445], [-2.27707, 35.35051]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q5823", + nameEn: "Ceuta", + aliases: ["ES-CE"], + country: "ES", + groups: ["EA", "EU", "015", "002", "UN"], + level: "subterritory", + callingCodes: ["34"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-5.38491, 35.92591], [-5.37338, 35.88417], [-5.35844, 35.87375], [-5.34379, 35.8711], [-5.21179, 35.90091], [-5.38491, 35.92591]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q5831", + nameEn: "Melilla", + aliases: ["ES-ML"], + country: "ES", + groups: ["EA", "EU", "015", "002", "UN"], + level: "subterritory", + callingCodes: ["34"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-2.91909, 35.33927], [-2.96038, 35.31609], [-2.96648, 35.30475], [-2.96978, 35.29459], [-2.97035, 35.28852], [-2.96507, 35.28801], [-2.96826, 35.28296], [-2.96516, 35.27967], [-2.95431, 35.2728], [-2.95065, 35.26576], [-2.93893, 35.26737], [-2.92272, 35.27509], [-2.91909, 35.33927]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q7835", + nameEn: "Crimea", + country: "RU", + groups: ["151", "150", "UN"], + level: "subterritory", + callingCodes: ["7"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[33.5, 44], [36.4883, 45.0488], [36.475, 45.2411], [36.5049, 45.3136], [36.6545, 45.3417], [36.6645, 45.4514], [35.0498, 45.7683], [34.9601, 45.7563], [34.7991, 45.8101], [34.8015, 45.9005], [34.7548, 45.907], [34.6668, 45.9714], [34.6086, 45.9935], [34.5589, 45.9935], [34.5201, 45.951], [34.4873, 45.9427], [34.4415, 45.9599], [34.4122, 46.0025], [34.3391, 46.0611], [34.2511, 46.0532], [34.181, 46.068], [34.1293, 46.1049], [34.0731, 46.1177], [34.0527, 46.1084], [33.9155, 46.1594], [33.8523, 46.1986], [33.7972, 46.2048], [33.7405, 46.1855], [33.646, 46.2303], [33.6152, 46.2261], [33.6385, 46.1415], [33.6147, 46.1356], [33.5732, 46.1032], [33.5909, 46.0601], [33.5597, 46.0307], [31.5, 45.5], [33.5, 44]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q12837", + nameEn: "Iberia", + level: "sharedLandform" + }, + geometry: null + }, { + type: "Feature", + properties: { + wikidata: "Q14056", + nameEn: "Jan Mayen", + aliases: ["NO-22"], + country: "NO", + groups: ["SJ", "154", "150", "UN"], + level: "subterritory" + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-9.18243, 72.23144], [-10.71459, 70.09565], [-5.93364, 70.76368], [-9.18243, 72.23144]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q19188", + nameEn: "Mainland China", + country: "CN", + groups: ["030", "142", "UN"], + callingCodes: ["86"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[125.6131, 53.07229], [125.17522, 53.20225], [124.46078, 53.21881], [123.86158, 53.49391], [123.26989, 53.54843], [122.85966, 53.47395], [122.35063, 53.49565], [121.39213, 53.31888], [120.85633, 53.28499], [120.0451, 52.7359], [120.04049, 52.58773], [120.46454, 52.63811], [120.71673, 52.54099], [120.61346, 52.32447], [120.77337, 52.20805], [120.65907, 51.93544], [120.10963, 51.671], [119.13553, 50.37412], [119.38598, 50.35162], [119.27996, 50.13348], [119.11003, 50.00276], [118.61623, 49.93809], [117.82343, 49.52696], [117.48208, 49.62324], [117.27597, 49.62544], [116.71193, 49.83813], [116.03781, 48.87014], [116.06565, 48.81716], [115.78876, 48.51781], [115.811, 48.25699], [115.52082, 48.15367], [115.57128, 47.91988], [115.94296, 47.67741], [116.21879, 47.88505], [116.4465, 47.83662], [116.67405, 47.89039], [116.9723, 47.87285], [117.37875, 47.63627], [117.50181, 47.77216], [117.80196, 48.01661], [118.03676, 48.00982], [118.11009, 48.04], [118.22677, 48.03853], [118.29654, 48.00246], [118.55766, 47.99277], [118.7564, 47.76947], [119.12343, 47.66458], [119.13995, 47.53997], [119.35892, 47.48104], [119.31964, 47.42617], [119.54918, 47.29505], [119.56019, 47.24874], [119.62403, 47.24575], [119.71209, 47.19192], [119.85518, 46.92196], [119.91242, 46.90091], [119.89261, 46.66423], [119.80455, 46.67631], [119.77373, 46.62947], [119.68127, 46.59015], [119.65265, 46.62342], [119.42827, 46.63783], [119.32827, 46.61433], [119.24978, 46.64761], [119.10448, 46.65516], [119.00541, 46.74273], [118.92616, 46.72765], [118.89974, 46.77139], [118.8337, 46.77742], [118.78747, 46.68689], [118.30534, 46.73519], [117.69554, 46.50991], [117.60748, 46.59771], [117.41782, 46.57862], [117.36609, 46.36335], [116.83166, 46.38637], [116.75551, 46.33083], [116.58612, 46.30211], [116.26678, 45.96479], [116.24012, 45.8778], [116.27366, 45.78637], [116.16989, 45.68603], [115.60329, 45.44717], [114.94546, 45.37377], [114.74612, 45.43585], [114.54801, 45.38337], [114.5166, 45.27189], [113.70918, 44.72891], [112.74662, 44.86297], [112.4164, 45.06858], [111.98695, 45.09074], [111.76275, 44.98032], [111.40498, 44.3461], [111.96289, 43.81596], [111.93776, 43.68709], [111.79758, 43.6637], [111.59087, 43.51207], [111.0149, 43.3289], [110.4327, 42.78293], [110.08401, 42.6411], [109.89402, 42.63111], [109.452, 42.44842], [109.00679, 42.45302], [108.84489, 42.40246], [107.57258, 42.40898], [107.49681, 42.46221], [107.29755, 42.41395], [107.24774, 42.36107], [106.76517, 42.28741], [105.0123, 41.63188], [104.51667, 41.66113], [104.52258, 41.8706], [103.92804, 41.78246], [102.72403, 42.14675], [102.07645, 42.22519], [101.80515, 42.50074], [100.84979, 42.67087], [100.33297, 42.68231], [99.50671, 42.56535], [97.1777, 42.7964], [96.37926, 42.72055], [96.35658, 42.90363], [95.89543, 43.2528], [95.52594, 43.99353], [95.32891, 44.02407], [95.39772, 44.2805], [95.01191, 44.25274], [94.71959, 44.35284], [94.10003, 44.71016], [93.51161, 44.95964], [91.64048, 45.07408], [90.89169, 45.19667], [90.65114, 45.49314], [90.70907, 45.73437], [91.03026, 46.04194], [90.99672, 46.14207], [90.89639, 46.30711], [91.07696, 46.57315], [91.0147, 46.58171], [91.03649, 46.72916], [90.84035, 46.99525], [90.76108, 46.99399], [90.48542, 47.30438], [90.48854, 47.41826], [90.33598, 47.68303], [90.10871, 47.7375], [90.06512, 47.88177], [89.76624, 47.82745], [89.55453, 48.0423], [89.0711, 47.98528], [88.93186, 48.10263], [88.8011, 48.11302], [88.58316, 48.21893], [88.58939, 48.34531], [87.96361, 48.58478], [88.0788, 48.71436], [87.73822, 48.89582], [87.88171, 48.95853], [87.81333, 49.17354], [87.48983, 49.13794], [87.478, 49.07403], [87.28386, 49.11626], [86.87238, 49.12432], [86.73568, 48.99918], [86.75343, 48.70331], [86.38069, 48.46064], [85.73581, 48.3939], [85.5169, 48.05493], [85.61067, 47.49753], [85.69696, 47.2898], [85.54294, 47.06171], [85.22443, 47.04816], [84.93995, 46.87399], [84.73077, 47.01394], [83.92184, 46.98912], [83.04622, 47.19053], [82.21792, 45.56619], [82.58474, 45.40027], [82.51374, 45.1755], [81.73278, 45.3504], [80.11169, 45.03352], [79.8987, 44.89957], [80.38384, 44.63073], [80.40229, 44.23319], [80.40031, 44.10986], [80.75156, 43.44948], [80.69718, 43.32589], [80.77771, 43.30065], [80.78817, 43.14235], [80.62913, 43.141], [80.3735, 43.01557], [80.58999, 42.9011], [80.38169, 42.83142], [80.26886, 42.8366], [80.16892, 42.61137], [80.26841, 42.23797], [80.17807, 42.21166], [80.17842, 42.03211], [79.92977, 42.04113], [78.3732, 41.39603], [78.15757, 41.38565], [78.12873, 41.23091], [77.81287, 41.14307], [77.76206, 41.01574], [77.52723, 41.00227], [77.3693, 41.0375], [77.28004, 41.0033], [76.99302, 41.0696], [76.75681, 40.95354], [76.5261, 40.46114], [76.33659, 40.3482], [75.96168, 40.38064], [75.91361, 40.2948], [75.69663, 40.28642], [75.5854, 40.66874], [75.22834, 40.45382], [75.08243, 40.43945], [74.82013, 40.52197], [74.78168, 40.44886], [74.85996, 40.32857], [74.69875, 40.34668], [74.35063, 40.09742], [74.25533, 40.13191], [73.97049, 40.04378], [73.83006, 39.76136], [73.9051, 39.75073], [73.92354, 39.69565], [73.94683, 39.60733], [73.87018, 39.47879], [73.59831, 39.46425], [73.59241, 39.40843], [73.5004, 39.38402], [73.55396, 39.3543], [73.54572, 39.27567], [73.60638, 39.24534], [73.75823, 39.023], [73.81728, 39.04007], [73.82964, 38.91517], [73.7445, 38.93867], [73.7033, 38.84782], [73.80656, 38.66449], [73.79806, 38.61106], [73.97933, 38.52945], [74.17022, 38.65504], [74.51217, 38.47034], [74.69619, 38.42947], [74.69894, 38.22155], [74.80331, 38.19889], [74.82665, 38.07359], [74.9063, 38.03033], [74.92416, 37.83428], [75.00935, 37.77486], [74.8912, 37.67576], [74.94338, 37.55501], [75.06011, 37.52779], [75.15899, 37.41443], [75.09719, 37.37297], [75.12328, 37.31839], [74.88887, 37.23275], [74.80605, 37.21565], [74.49981, 37.24518], [74.56453, 37.03023], [75.13839, 37.02622], [75.40481, 36.95382], [75.45562, 36.71971], [75.72737, 36.7529], [75.92391, 36.56986], [76.0324, 36.41198], [76.00906, 36.17511], [75.93028, 36.13136], [76.15325, 35.9264], [76.14913, 35.82848], [76.33453, 35.84296], [76.50961, 35.8908], [76.77323, 35.66062], [76.84539, 35.67356], [76.96624, 35.5932], [77.44277, 35.46132], [77.70232, 35.46244], [77.80532, 35.52058], [78.11664, 35.48022], [78.03466, 35.3785], [78.00033, 35.23954], [78.22692, 34.88771], [78.18435, 34.7998], [78.27781, 34.61484], [78.54964, 34.57283], [78.56475, 34.50835], [78.74465, 34.45174], [79.05364, 34.32482], [78.99802, 34.3027], [78.91769, 34.15452], [78.66225, 34.08858], [78.65657, 34.03195], [78.73367, 34.01121], [78.77349, 33.73871], [78.67599, 33.66445], [78.73636, 33.56521], [79.15252, 33.17156], [79.14016, 33.02545], [79.46562, 32.69668], [79.26768, 32.53277], [79.13174, 32.47766], [79.0979, 32.38051], [78.99322, 32.37948], [78.96713, 32.33655], [78.7831, 32.46873], [78.73916, 32.69438], [78.38897, 32.53938], [78.4645, 32.45367], [78.49609, 32.2762], [78.68754, 32.10256], [78.74404, 32.00384], [78.78036, 31.99478], [78.69933, 31.78723], [78.84516, 31.60631], [78.71032, 31.50197], [78.77898, 31.31209], [78.89344, 31.30481], [79.01931, 31.42817], [79.14016, 31.43403], [79.30694, 31.17357], [79.59884, 30.93943], [79.93255, 30.88288], [80.20721, 30.58541], [80.54504, 30.44936], [80.83343, 30.32023], [81.03953, 30.20059], [81.12842, 30.01395], [81.24362, 30.0126], [81.29032, 30.08806], [81.2623, 30.14596], [81.33355, 30.15303], [81.39928, 30.21862], [81.41018, 30.42153], [81.5459, 30.37688], [81.62033, 30.44703], [81.99082, 30.33423], [82.10135, 30.35439], [82.10757, 30.23745], [82.19475, 30.16884], [82.16984, 30.0692], [82.38622, 30.02608], [82.5341, 29.9735], [82.73024, 29.81695], [83.07116, 29.61957], [83.28131, 29.56813], [83.44787, 29.30513], [83.63156, 29.16249], [83.82303, 29.30513], [83.97559, 29.33091], [84.18107, 29.23451], [84.24801, 29.02783], [84.2231, 28.89571], [84.47528, 28.74023], [84.62317, 28.73887], [84.85511, 28.58041], [85.06059, 28.68562], [85.19135, 28.62825], [85.18668, 28.54076], [85.10729, 28.34092], [85.38127, 28.28336], [85.4233, 28.32996], [85.59765, 28.30529], [85.60854, 28.25045], [85.69105, 28.38475], [85.71907, 28.38064], [85.74864, 28.23126], [85.84672, 28.18187], [85.90743, 28.05144], [85.97813, 27.99023], [85.94946, 27.9401], [86.06309, 27.90021], [86.12069, 27.93047], [86.08333, 28.02121], [86.088, 28.09264], [86.18607, 28.17364], [86.22966, 27.9786], [86.42736, 27.91122], [86.51609, 27.96623], [86.56265, 28.09569], [86.74181, 28.10638], [86.75582, 28.04182], [87.03757, 27.94835], [87.11696, 27.84104], [87.56996, 27.84517], [87.72718, 27.80938], [87.82681, 27.95248], [88.13378, 27.88015], [88.1278, 27.95417], [88.25332, 27.9478], [88.54858, 28.06057], [88.63235, 28.12356], [88.83559, 28.01936], [88.88091, 27.85192], [88.77517, 27.45415], [88.82981, 27.38814], [88.91901, 27.32483], [88.93678, 27.33777], [88.96947, 27.30319], [89.00216, 27.32532], [88.95355, 27.4106], [88.97213, 27.51671], [89.0582, 27.60985], [89.12825, 27.62502], [89.59525, 28.16433], [89.79762, 28.23979], [90.13387, 28.19178], [90.58842, 28.02838], [90.69894, 28.07784], [91.20019, 27.98715], [91.25779, 28.07509], [91.46327, 28.0064], [91.48973, 27.93903], [91.5629, 27.84823], [91.6469, 27.76358], [91.84722, 27.76325], [91.87057, 27.7195], [92.27432, 27.89077], [92.32101, 27.79363], [92.42538, 27.80092], [92.7275, 27.98662], [92.73025, 28.05814], [92.65472, 28.07632], [92.67486, 28.15018], [92.93075, 28.25671], [93.14635, 28.37035], [93.18069, 28.50319], [93.44621, 28.67189], [93.72797, 28.68821], [94.35897, 29.01965], [94.2752, 29.11687], [94.69318, 29.31739], [94.81353, 29.17804], [95.0978, 29.14446], [95.11291, 29.09527], [95.2214, 29.10727], [95.26122, 29.07727], [95.3038, 29.13847], [95.41091, 29.13007], [95.50842, 29.13487], [95.72086, 29.20797], [95.75149, 29.32063], [95.84899, 29.31464], [96.05361, 29.38167], [96.31316, 29.18643], [96.18682, 29.11087], [96.20467, 29.02325], [96.3626, 29.10607], [96.61391, 28.72742], [96.40929, 28.51526], [96.48895, 28.42955], [96.6455, 28.61657], [96.85561, 28.4875], [96.88445, 28.39452], [96.98882, 28.32564], [97.1289, 28.3619], [97.34547, 28.21385], [97.41729, 28.29783], [97.47085, 28.2688], [97.50518, 28.49716], [97.56835, 28.55628], [97.70705, 28.5056], [97.79632, 28.33168], [97.90069, 28.3776], [98.15337, 28.12114], [98.13964, 27.9478], [98.32641, 27.51385], [98.42529, 27.55404], [98.43353, 27.67086], [98.69582, 27.56499], [98.7333, 26.85615], [98.77547, 26.61994], [98.72741, 26.36183], [98.67797, 26.24487], [98.7329, 26.17218], [98.66884, 26.09165], [98.63128, 26.15492], [98.57085, 26.11547], [98.60763, 26.01512], [98.70818, 25.86241], [98.63128, 25.79937], [98.54064, 25.85129], [98.40606, 25.61129], [98.31268, 25.55307], [98.25774, 25.6051], [98.16848, 25.62739], [98.18084, 25.56298], [98.12591, 25.50722], [98.14925, 25.41547], [97.92541, 25.20815], [97.83614, 25.2715], [97.77023, 25.11492], [97.72216, 25.08508], [97.72903, 24.91332], [97.79949, 24.85655], [97.76481, 24.8289], [97.73127, 24.83015], [97.70181, 24.84557], [97.64354, 24.79171], [97.56648, 24.76475], [97.56383, 24.75535], [97.5542, 24.74943], [97.54675, 24.74202], [97.56525, 24.72838], [97.56286, 24.54535], [97.52757, 24.43748], [97.60029, 24.4401], [97.66998, 24.45288], [97.7098, 24.35658], [97.65624, 24.33781], [97.66723, 24.30027], [97.71941, 24.29652], [97.76799, 24.26365], [97.72998, 24.2302], [97.72799, 24.18883], [97.75305, 24.16902], [97.72903, 24.12606], [97.62363, 24.00506], [97.5247, 23.94032], [97.64667, 23.84574], [97.72302, 23.89288], [97.79456, 23.94836], [97.79416, 23.95663], [97.84328, 23.97603], [97.86545, 23.97723], [97.88811, 23.97446], [97.8955, 23.97758], [97.89676, 23.97931], [97.89683, 23.98389], [97.88814, 23.98605], [97.88414, 23.99405], [97.88616, 24.00463], [97.90998, 24.02094], [97.93951, 24.01953], [97.98691, 24.03897], [97.99583, 24.04932], [98.04709, 24.07616], [98.05302, 24.07408], [98.05671, 24.07961], [98.0607, 24.07812], [98.06703, 24.08028], [98.07806, 24.07988], [98.20666, 24.11406], [98.54476, 24.13119], [98.59256, 24.08371], [98.85319, 24.13042], [98.87998, 24.15624], [98.89632, 24.10612], [98.67797, 23.9644], [98.68209, 23.80492], [98.79607, 23.77947], [98.82933, 23.72921], [98.81775, 23.694], [98.88396, 23.59555], [98.80294, 23.5345], [98.82877, 23.47908], [98.87683, 23.48995], [98.92104, 23.36946], [98.87573, 23.33038], [98.93958, 23.31414], [98.92515, 23.29535], [98.88597, 23.18656], [99.05975, 23.16382], [99.04601, 23.12215], [99.25741, 23.09025], [99.34127, 23.13099], [99.52214, 23.08218], [99.54218, 22.90014], [99.43537, 22.94086], [99.45654, 22.85726], [99.31243, 22.73893], [99.38247, 22.57544], [99.37972, 22.50188], [99.28771, 22.4105], [99.17318, 22.18025], [99.19176, 22.16983], [99.1552, 22.15874], [99.33166, 22.09656], [99.47585, 22.13345], [99.85351, 22.04183], [99.96612, 22.05965], [99.99084, 21.97053], [99.94003, 21.82782], [99.98654, 21.71064], [100.04956, 21.66843], [100.12679, 21.70539], [100.17486, 21.65306], [100.10757, 21.59945], [100.12542, 21.50365], [100.1625, 21.48704], [100.18447, 21.51898], [100.25863, 21.47043], [100.35201, 21.53176], [100.42892, 21.54325], [100.4811, 21.46148], [100.57861, 21.45637], [100.72143, 21.51898], [100.87265, 21.67396], [101.11744, 21.77659], [101.15156, 21.56129], [101.2124, 21.56422], [101.19349, 21.41959], [101.26912, 21.36482], [101.2229, 21.23271], [101.29326, 21.17254], [101.54563, 21.25668], [101.6068, 21.23329], [101.59491, 21.18621], [101.60886, 21.17947], [101.66977, 21.20004], [101.70548, 21.14911], [101.7622, 21.14813], [101.79266, 21.19025], [101.76745, 21.21571], [101.83887, 21.20983], [101.84412, 21.25291], [101.74014, 21.30967], [101.74224, 21.48276], [101.7727, 21.51794], [101.7475, 21.5873], [101.80001, 21.57461], [101.83257, 21.61562], [101.74555, 21.72852], [101.7791, 21.83019], [101.62566, 21.96574], [101.57525, 22.13026], [101.60675, 22.13513], [101.53638, 22.24794], [101.56789, 22.28876], [101.61306, 22.27515], [101.68973, 22.46843], [101.7685, 22.50337], [101.86828, 22.38397], [101.90714, 22.38688], [101.91344, 22.44417], [101.98487, 22.42766], [102.03633, 22.46164], [102.1245, 22.43372], [102.14099, 22.40092], [102.16621, 22.43336], [102.26428, 22.41321], [102.25339, 22.4607], [102.41061, 22.64184], [102.38415, 22.67919], [102.42618, 22.69212], [102.46665, 22.77108], [102.51802, 22.77969], [102.57095, 22.7036], [102.60675, 22.73376], [102.8636, 22.60735], [102.9321, 22.48659], [103.0722, 22.44775], [103.07843, 22.50097], [103.17961, 22.55705], [103.15782, 22.59873], [103.18895, 22.64471], [103.28079, 22.68063], [103.32282, 22.8127], [103.43179, 22.75816], [103.43646, 22.70648], [103.52675, 22.59155], [103.57812, 22.65764], [103.56255, 22.69499], [103.64506, 22.79979], [103.87904, 22.56683], [103.93286, 22.52703], [103.94513, 22.52553], [103.95191, 22.5134], [103.96352, 22.50584], [103.96783, 22.51173], [103.97384, 22.50634], [103.99247, 22.51958], [104.01088, 22.51823], [104.03734, 22.72945], [104.11384, 22.80363], [104.27084, 22.8457], [104.25683, 22.76534], [104.35593, 22.69353], [104.47225, 22.75813], [104.58122, 22.85571], [104.60457, 22.81841], [104.65283, 22.83419], [104.72755, 22.81984], [104.77114, 22.90017], [104.84942, 22.93631], [104.86765, 22.95178], [104.8334, 23.01484], [104.79478, 23.12934], [104.87382, 23.12854], [104.87992, 23.17141], [104.91435, 23.18666], [104.9486, 23.17235], [104.96532, 23.20463], [104.98712, 23.19176], [105.07002, 23.26248], [105.11672, 23.25247], [105.17276, 23.28679], [105.22569, 23.27249], [105.32376, 23.39684], [105.40782, 23.28107], [105.42805, 23.30824], [105.49966, 23.20669], [105.56037, 23.16806], [105.57594, 23.075], [105.72382, 23.06641], [105.8726, 22.92756], [105.90119, 22.94168], [105.99568, 22.94178], [106.00179, 22.99049], [106.19705, 22.98475], [106.27022, 22.87722], [106.34961, 22.86718], [106.49749, 22.91164], [106.51306, 22.94891], [106.55976, 22.92311], [106.60179, 22.92884], [106.6516, 22.86862], [106.6734, 22.89587], [106.71387, 22.88296], [106.71128, 22.85982], [106.78422, 22.81532], [106.81271, 22.8226], [106.83685, 22.8098], [106.82404, 22.7881], [106.76293, 22.73491], [106.72321, 22.63606], [106.71698, 22.58432], [106.65316, 22.5757], [106.61269, 22.60301], [106.58395, 22.474], [106.55665, 22.46498], [106.57221, 22.37], [106.55976, 22.34841], [106.6516, 22.33977], [106.69986, 22.22309], [106.67495, 22.1885], [106.6983, 22.15102], [106.70142, 22.02409], [106.68274, 21.99811], [106.69276, 21.96013], [106.72551, 21.97923], [106.74345, 22.00965], [106.81038, 21.97934], [106.9178, 21.97357], [106.92714, 21.93459], [106.97228, 21.92592], [106.99252, 21.95191], [107.05634, 21.92303], [107.06101, 21.88982], [107.00964, 21.85948], [107.02615, 21.81981], [107.10771, 21.79879], [107.20734, 21.71493], [107.24625, 21.7077], [107.29296, 21.74674], [107.35834, 21.6672], [107.35989, 21.60063], [107.38636, 21.59774], [107.41593, 21.64839], [107.47197, 21.6672], [107.49532, 21.62958], [107.49065, 21.59774], [107.54047, 21.5934], [107.56537, 21.61945], [107.66967, 21.60787], [107.80355, 21.66141], [107.86114, 21.65128], [107.90006, 21.5905], [107.92652, 21.58906], [107.95232, 21.5388], [107.96774, 21.53601], [107.97074, 21.54072], [107.97383, 21.53961], [107.97932, 21.54503], [108.02926, 21.54997], [108.0569, 21.53604], [108.10003, 21.47338], [108.00365, 17.98159], [111.60491, 13.57105], [118.41371, 24.06775], [118.11703, 24.39734], [118.28244, 24.51231], [118.35291, 24.51645], [118.42453, 24.54644], [118.56434, 24.49266], [120.49232, 25.22863], [121.03532, 26.8787], [123.5458, 31.01942], [122.29378, 31.76513], [122.80525, 33.30571], [123.85601, 37.49093], [123.90497, 38.79949], [124.17532, 39.8232], [124.23201, 39.9248], [124.35029, 39.95639], [124.37089, 40.03004], [124.3322, 40.05573], [124.38556, 40.11047], [124.40719, 40.13655], [124.86913, 40.45387], [125.71172, 40.85223], [125.76869, 40.87908], [126.00335, 40.92835], [126.242, 41.15454], [126.53189, 41.35206], [126.60631, 41.65565], [126.90729, 41.79955], [127.17841, 41.59714], [127.29712, 41.49473], [127.92943, 41.44291], [128.02633, 41.42103], [128.03311, 41.39232], [128.12967, 41.37931], [128.18546, 41.41279], [128.20061, 41.40895], [128.30716, 41.60322], [128.15119, 41.74568], [128.04487, 42.01769], [128.94007, 42.03537], [128.96068, 42.06657], [129.15178, 42.17224], [129.22285, 42.26491], [129.22423, 42.3553], [129.28541, 42.41574], [129.42882, 42.44702], [129.54701, 42.37254], [129.60482, 42.44461], [129.72541, 42.43739], [129.75294, 42.59409], [129.77183, 42.69435], [129.7835, 42.76521], [129.80719, 42.79218], [129.83277, 42.86746], [129.85261, 42.96494], [129.8865, 43.00395], [129.95082, 43.01051], [129.96409, 42.97306], [130.12957, 42.98361], [130.09764, 42.91425], [130.26095, 42.9027], [130.23068, 42.80125], [130.2385, 42.71127], [130.41826, 42.6011], [130.44361, 42.54849], [130.50123, 42.61636], [130.55143, 42.52158], [130.62107, 42.58413], [130.56576, 42.68925], [130.40213, 42.70788], [130.44361, 42.76205], [130.66524, 42.84753], [131.02438, 42.86518], [131.02668, 42.91246], [131.135, 42.94114], [131.10274, 43.04734], [131.20414, 43.13654], [131.19031, 43.21385], [131.30324, 43.39498], [131.29402, 43.46695], [131.19492, 43.53047], [131.21105, 43.82383], [131.26176, 43.94011], [131.23583, 43.96085], [131.25484, 44.03131], [131.30365, 44.04262], [131.1108, 44.70266], [130.95639, 44.85154], [131.48415, 44.99513], [131.68466, 45.12374], [131.66852, 45.2196], [131.76532, 45.22609], [131.86903, 45.33636], [131.99417, 45.2567], [132.83978, 45.05916], [132.96373, 45.0212], [133.12293, 45.1332], [133.09279, 45.25693], [133.19419, 45.51913], [133.41083, 45.57723], [133.48457, 45.86203], [133.60442, 45.90053], [133.67569, 45.9759], [133.72695, 46.05576], [133.68047, 46.14697], [133.88097, 46.25066], [133.91496, 46.4274], [133.84104, 46.46681], [134.03538, 46.75668], [134.20016, 47.33458], [134.50898, 47.4812], [134.7671, 47.72051], [134.55508, 47.98651], [134.67098, 48.1564], [134.75328, 48.36763], [134.49516, 48.42884], [132.66989, 47.96491], [132.57309, 47.71741], [131.90448, 47.68011], [131.2635, 47.73325], [131.09871, 47.6852], [130.95985, 47.6957], [130.90915, 47.90623], [130.65103, 48.10052], [130.84462, 48.30942], [130.52147, 48.61745], [130.66946, 48.88251], [130.43232, 48.90844], [130.2355, 48.86741], [129.85416, 49.11067], [129.67598, 49.29596], [129.50685, 49.42398], [129.40398, 49.44194], [129.35317, 49.3481], [129.23232, 49.40353], [129.11153, 49.36813], [128.72896, 49.58676], [127.83476, 49.5748], [127.53516, 49.84306], [127.49299, 50.01251], [127.60515, 50.23503], [127.37384, 50.28393], [127.36009, 50.43787], [127.28765, 50.46585], [127.36335, 50.58306], [127.28165, 50.72075], [127.14586, 50.91152], [126.93135, 51.0841], [126.90369, 51.3238], [126.68349, 51.70607], [126.44606, 51.98254], [126.558, 52.13738], [125.6131, 53.07229]], [[113.56865, 22.20973], [113.57123, 22.20416], [113.60504, 22.20464], [113.63011, 22.10782], [113.57191, 22.07696], [113.54839, 22.10909], [113.54942, 22.14519], [113.54093, 22.15497], [113.52659, 22.18271], [113.53552, 22.20607], [113.53301, 22.21235], [113.53591, 22.21369], [113.54093, 22.21314], [113.54333, 22.21688], [113.5508, 22.21672], [113.56865, 22.20973]], [[114.50148, 22.15017], [113.92195, 22.13873], [113.83338, 22.1826], [113.81621, 22.2163], [113.86771, 22.42972], [114.03113, 22.5065], [114.05438, 22.5026], [114.05729, 22.51104], [114.06272, 22.51617], [114.07267, 22.51855], [114.07817, 22.52997], [114.08606, 22.53276], [114.09048, 22.53716], [114.09692, 22.53435], [114.1034, 22.5352], [114.11181, 22.52878], [114.11656, 22.53415], [114.12665, 22.54003], [114.13823, 22.54319], [114.1482, 22.54091], [114.15123, 22.55163], [114.1597, 22.56041], [114.17247, 22.55944], [114.18338, 22.55444], [114.20655, 22.55706], [114.22185, 22.55343], [114.22888, 22.5436], [114.25154, 22.55977], [114.44998, 22.55977], [114.50148, 22.15017]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q22890", + nameEn: "Ireland", + level: "sharedLandform" + }, + geometry: null + }, { + type: "Feature", + properties: { + wikidata: "Q23666", + nameEn: "Great Britain", + country: "GB", + level: "sharedLandform" + }, + geometry: null + }, { + type: "Feature", + properties: { + wikidata: "Q23681", + nameEn: "Northern Cyprus", + groups: ["Q644636", "145", "142"], + driveSide: "left", + callingCodes: ["90 392"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[33.67678, 35.03866], [33.67742, 35.05963], [33.68474, 35.06602], [33.69095, 35.06237], [33.70861, 35.07644], [33.7161, 35.07279], [33.70209, 35.04882], [33.71482, 35.03722], [33.73824, 35.05321], [33.76106, 35.04253], [33.78581, 35.05104], [33.82067, 35.07826], [33.84168, 35.06823], [33.8541, 35.07201], [33.87479, 35.08881], [33.87097, 35.09389], [33.87622, 35.10457], [33.87224, 35.12293], [33.88561, 35.12449], [33.88943, 35.12007], [33.88737, 35.11408], [33.89853, 35.11377], [33.91789, 35.08688], [33.91299, 35.07579], [33.90247, 35.07686], [33.89485, 35.06873], [33.88367, 35.07877], [33.85261, 35.0574], [33.8355, 35.05777], [33.82051, 35.0667], [33.8012, 35.04786], [33.81524, 35.04192], [33.83055, 35.02865], [33.82875, 35.01685], [33.84045, 35.00616], [33.85216, 35.00579], [33.85891, 35.001], [33.85621, 34.98956], [33.83505, 34.98108], [33.84811, 34.97075], [33.86432, 34.97592], [33.90075, 34.96623], [33.98684, 34.76642], [35.48515, 34.70851], [35.51152, 36.10954], [32.82353, 35.70297], [32.46489, 35.48584], [32.60361, 35.16647], [32.64864, 35.19967], [32.70947, 35.18328], [32.70779, 35.14127], [32.85733, 35.07742], [32.86406, 35.1043], [32.94471, 35.09422], [33.01192, 35.15639], [33.08249, 35.17319], [33.11105, 35.15639], [33.15138, 35.19504], [33.27068, 35.16815], [33.3072, 35.16816], [33.31955, 35.18096], [33.35056, 35.18328], [33.34964, 35.17803], [33.35596, 35.17942], [33.35612, 35.17402], [33.36569, 35.17479], [33.3717, 35.1788], [33.37248, 35.18698], [33.38575, 35.2018], [33.4076, 35.20062], [33.41675, 35.16325], [33.46813, 35.10564], [33.48136, 35.0636], [33.47825, 35.04103], [33.45178, 35.02078], [33.45256, 35.00288], [33.47666, 35.00701], [33.48915, 35.06594], [33.53975, 35.08151], [33.57478, 35.06049], [33.567, 35.04803], [33.59658, 35.03635], [33.61215, 35.0527], [33.63765, 35.03869], [33.67678, 35.03866]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q25231", + nameEn: "Svalbard", + aliases: ["NO-21"], + country: "NO", + groups: ["SJ", "154", "150", "UN"], + level: "subterritory", + callingCodes: ["47 79"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-7.49892, 77.24208], [32.07813, 72.01005], [36.85549, 84.09565], [-7.49892, 77.24208]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q25263", + nameEn: "Azores", + aliases: ["PT-20"], + country: "PT", + groups: ["Q3320166", "Q2914565", "Q105472", "EU", "039", "150", "UN"], + callingCodes: ["351"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-23.12984, 40.26428], [-36.43765, 41.39418], [-22.54767, 33.34416], [-23.12984, 40.26428]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q25359", + nameEn: "Navassa Island", + aliases: ["UM-76"], + country: "US", + groups: ["UM", "Q1352230", "029", "003", "419", "019", "UN"], + level: "subterritory", + roadSpeedUnit: "mph", + roadHeightUnit: "ft" + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-74.7289, 18.71009], [-75.71816, 18.46438], [-74.76465, 18.06252], [-74.7289, 18.71009]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q25396", + nameEn: "Bonaire", + aliases: ["BQ-BO", "NL-BQ1"], + country: "NL", + groups: ["Q1451600", "BQ", "029", "003", "419", "019", "UN"], + level: "subterritory", + callingCodes: ["599 7"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-67.89186, 12.4116], [-68.90012, 12.62309], [-68.33524, 11.78151], [-68.01417, 11.77722], [-67.89186, 12.4116]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q25528", + nameEn: "Saba", + aliases: ["BQ-SA", "NL-BQ2"], + country: "NL", + groups: ["Q1451600", "BQ", "029", "003", "419", "019", "UN"], + level: "subterritory", + callingCodes: ["599 4"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-63.07669, 17.79659], [-63.81314, 17.95045], [-63.22932, 17.32592], [-63.07669, 17.79659]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q26180", + nameEn: "Sint Eustatius", + aliases: ["BQ-SE", "NL-BQ3"], + country: "NL", + groups: ["Q1451600", "BQ", "029", "003", "419", "019", "UN"], + level: "subterritory", + callingCodes: ["599 3"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-63.07669, 17.79659], [-63.34999, 16.94218], [-62.76692, 17.64353], [-63.07669, 17.79659]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q26253", + nameEn: "Madeira", + aliases: ["PT-30"], + country: "PT", + groups: ["Q3320166", "Q2914565", "Q105472", "EU", "039", "150", "UN"], + callingCodes: ["351"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-19.30302, 33.65304], [-16.04789, 29.65076], [-11.68307, 33.12333], [-19.30302, 33.65304]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q26927", + nameEn: "Lakshadweep", + aliases: ["IN-LD"], + country: "IN", + groups: ["034", "142", "UN"], + driveSide: "left", + callingCodes: ["91"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[67.64074, 11.57295], [76.59015, 5.591], [72.67494, 13.58102], [67.64074, 11.57295]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q27329", + nameEn: "Asian Russia", + country: "RU", + groups: ["142", "UN"], + callingCodes: ["7"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-179.99933, 64.74703], [-172.76104, 63.77445], [-169.03888, 65.48473], [-168.95635, 65.98512], [-168.25765, 71.99091], [-179.9843, 71.90735], [-179.99933, 64.74703]]], [[[59.99809, 51.98263], [60.19925, 51.99173], [60.48915, 52.15175], [60.72581, 52.15538], [60.78201, 52.22067], [61.05417, 52.35096], [60.98021, 52.50068], [60.84709, 52.52228], [60.84118, 52.63912], [60.71693, 52.66245], [60.71989, 52.75923], [61.05842, 52.92217], [61.23462, 53.03227], [62.0422, 52.96105], [62.12799, 52.99133], [62.14574, 53.09626], [61.19024, 53.30536], [61.14291, 53.41481], [61.29082, 53.50992], [61.37957, 53.45887], [61.57185, 53.50112], [61.55706, 53.57144], [60.90626, 53.62937], [61.22574, 53.80268], [61.14283, 53.90063], [60.99796, 53.93699], [61.26863, 53.92797], [61.3706, 54.08464], [61.47603, 54.08048], [61.56941, 53.95703], [61.65318, 54.02445], [62.03913, 53.94768], [62.00966, 54.04134], [62.38535, 54.03961], [62.45931, 53.90737], [62.56876, 53.94047], [62.58651, 54.05871], [63.80604, 54.27079], [63.91224, 54.20013], [64.02715, 54.22679], [63.97686, 54.29763], [64.97216, 54.4212], [65.11033, 54.33028], [65.24663, 54.35721], [65.20174, 54.55216], [68.21308, 54.98645], [68.26661, 55.09226], [68.19206, 55.18823], [68.90865, 55.38148], [69.34224, 55.36344], [69.74917, 55.35545], [70.19179, 55.1476], [70.76493, 55.3027], [70.96009, 55.10558], [71.08288, 54.71253], [71.24185, 54.64965], [71.08706, 54.33376], [71.10379, 54.13326], [71.96141, 54.17736], [72.17477, 54.36303], [72.43415, 53.92685], [72.71026, 54.1161], [73.37963, 53.96132], [73.74778, 54.07194], [73.68921, 53.86522], [73.25412, 53.61532], [73.39218, 53.44623], [75.07405, 53.80831], [75.43398, 53.98652], [75.3668, 54.07439], [76.91052, 54.4677], [76.82266, 54.1798], [76.44076, 54.16017], [76.54243, 53.99329], [77.90383, 53.29807], [79.11255, 52.01171], [80.08138, 50.77658], [80.4127, 50.95581], [80.44819, 51.20855], [80.80318, 51.28262], [81.16999, 51.15662], [81.06091, 50.94833], [81.41248, 50.97524], [81.46581, 50.77658], [81.94999, 50.79307], [82.55443, 50.75412], [83.14607, 51.00796], [83.8442, 50.87375], [84.29385, 50.27257], [84.99198, 50.06793], [85.24047, 49.60239], [86.18709, 49.50259], [86.63674, 49.80136], [86.79056, 49.74787], [86.61307, 49.60239], [86.82606, 49.51796], [87.03071, 49.25142], [87.31465, 49.23603], [87.28386, 49.11626], [87.478, 49.07403], [87.48983, 49.13794], [87.81333, 49.17354], [87.98977, 49.18147], [88.15543, 49.30314], [88.17223, 49.46934], [88.42449, 49.48821], [88.82499, 49.44808], [89.70687, 49.72535], [89.59711, 49.90851], [91.86048, 50.73734], [92.07173, 50.69585], [92.44714, 50.78762], [93.01109, 50.79001], [92.99595, 50.63183], [94.30823, 50.57498], [94.39258, 50.22193], [94.49477, 50.17832], [94.6121, 50.04239], [94.97166, 50.04725], [95.02465, 49.96941], [95.74757, 49.97915], [95.80056, 50.04239], [96.97388, 49.88413], [97.24639, 49.74737], [97.56811, 49.84265], [97.56432, 49.92801], [97.76871, 49.99861], [97.85197, 49.91339], [98.29481, 50.33561], [98.31373, 50.4996], [98.06393, 50.61262], [97.9693, 50.78044], [98.01472, 50.86652], [97.83305, 51.00248], [98.05257, 51.46696], [98.22053, 51.46579], [98.33222, 51.71832], [98.74142, 51.8637], [98.87768, 52.14563], [99.27888, 51.96876], [99.75578, 51.90108], [99.89203, 51.74903], [100.61116, 51.73028], [101.39085, 51.45753], [101.5044, 51.50467], [102.14032, 51.35566], [102.32194, 50.67982], [102.71178, 50.38873], [103.70343, 50.13952], [105.32528, 50.4648], [106.05562, 50.40582], [106.07865, 50.33474], [106.47156, 50.31909], [106.49628, 50.32436], [106.51122, 50.34408], [106.58373, 50.34044], [106.80326, 50.30177], [107.00007, 50.1977], [107.1174, 50.04239], [107.36407, 49.97612], [107.96116, 49.93191], [107.95387, 49.66659], [108.27937, 49.53167], [108.53969, 49.32325], [109.18017, 49.34709], [109.51325, 49.22859], [110.24373, 49.16676], [110.39891, 49.25083], [110.64493, 49.1816], [113.02647, 49.60772], [113.20216, 49.83356], [114.325, 50.28098], [114.9703, 50.19254], [115.26068, 49.97367], [115.73602, 49.87688], [116.22402, 50.04477], [116.62502, 49.92919], [116.71193, 49.83813], [117.27597, 49.62544], [117.48208, 49.62324], [117.82343, 49.52696], [118.61623, 49.93809], [119.11003, 50.00276], [119.27996, 50.13348], [119.38598, 50.35162], [119.13553, 50.37412], [120.10963, 51.671], [120.65907, 51.93544], [120.77337, 52.20805], [120.61346, 52.32447], [120.71673, 52.54099], [120.46454, 52.63811], [120.04049, 52.58773], [120.0451, 52.7359], [120.85633, 53.28499], [121.39213, 53.31888], [122.35063, 53.49565], [122.85966, 53.47395], [123.26989, 53.54843], [123.86158, 53.49391], [124.46078, 53.21881], [125.17522, 53.20225], [125.6131, 53.07229], [126.558, 52.13738], [126.44606, 51.98254], [126.68349, 51.70607], [126.90369, 51.3238], [126.93135, 51.0841], [127.14586, 50.91152], [127.28165, 50.72075], [127.36335, 50.58306], [127.28765, 50.46585], [127.36009, 50.43787], [127.37384, 50.28393], [127.60515, 50.23503], [127.49299, 50.01251], [127.53516, 49.84306], [127.83476, 49.5748], [128.72896, 49.58676], [129.11153, 49.36813], [129.23232, 49.40353], [129.35317, 49.3481], [129.40398, 49.44194], [129.50685, 49.42398], [129.67598, 49.29596], [129.85416, 49.11067], [130.2355, 48.86741], [130.43232, 48.90844], [130.66946, 48.88251], [130.52147, 48.61745], [130.84462, 48.30942], [130.65103, 48.10052], [130.90915, 47.90623], [130.95985, 47.6957], [131.09871, 47.6852], [131.2635, 47.73325], [131.90448, 47.68011], [132.57309, 47.71741], [132.66989, 47.96491], [134.49516, 48.42884], [134.75328, 48.36763], [134.67098, 48.1564], [134.55508, 47.98651], [134.7671, 47.72051], [134.50898, 47.4812], [134.20016, 47.33458], [134.03538, 46.75668], [133.84104, 46.46681], [133.91496, 46.4274], [133.88097, 46.25066], [133.68047, 46.14697], [133.72695, 46.05576], [133.67569, 45.9759], [133.60442, 45.90053], [133.48457, 45.86203], [133.41083, 45.57723], [133.19419, 45.51913], [133.09279, 45.25693], [133.12293, 45.1332], [132.96373, 45.0212], [132.83978, 45.05916], [131.99417, 45.2567], [131.86903, 45.33636], [131.76532, 45.22609], [131.66852, 45.2196], [131.68466, 45.12374], [131.48415, 44.99513], [130.95639, 44.85154], [131.1108, 44.70266], [131.30365, 44.04262], [131.25484, 44.03131], [131.23583, 43.96085], [131.26176, 43.94011], [131.21105, 43.82383], [131.19492, 43.53047], [131.29402, 43.46695], [131.30324, 43.39498], [131.19031, 43.21385], [131.20414, 43.13654], [131.10274, 43.04734], [131.135, 42.94114], [131.02668, 42.91246], [131.02438, 42.86518], [130.66524, 42.84753], [130.44361, 42.76205], [130.40213, 42.70788], [130.56576, 42.68925], [130.62107, 42.58413], [130.55143, 42.52158], [130.56835, 42.43281], [130.60805, 42.4317], [130.64181, 42.41422], [130.66367, 42.38024], [130.65022, 42.32281], [131.95041, 41.5445], [140.9182, 45.92937], [145.82343, 44.571], [145.23667, 43.76813], [153.94307, 38.42848], [180, 62.52334], [180, 71.53642], [155.31937, 81.93282], [76.13964, 83.37843], [64.18965, 69.94255], [66.1708, 67.61252], [61.98014, 65.72191], [60.74386, 64.95767], [59.63945, 64.78384], [59.80579, 64.13948], [59.24834, 63.01859], [59.61398, 62.44915], [59.36223, 61.3882], [59.50685, 60.91162], [58.3853, 59.487], [59.15636, 59.14682], [59.40376, 58.45822], [58.71104, 58.07475], [58.81412, 57.71602], [58.13789, 57.68097], [58.07604, 57.08308], [57.28024, 56.87898], [57.51527, 56.08729], [59.28419, 56.15739], [59.49035, 55.60486], [58.81825, 55.03378], [57.25137, 55.26262], [57.14829, 54.84204], [57.95234, 54.39672], [59.95217, 54.85853], [59.70487, 54.14846], [58.94336, 53.953], [58.79644, 52.43392], [59.22409, 52.28437], [59.25033, 52.46803], [60.17516, 52.39457], [60.17253, 52.25814], [59.91279, 52.06924], [59.99809, 51.98263]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q34366", + nameEn: "Tasmania", + aliases: ["AU-TAS"], + country: "AU", + groups: ["053", "009", "UN"], + driveSide: "left", + callingCodes: ["61"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[123.64533, -39.13605], [159.69067, -56.28945], [159.74028, -39.1978], [123.64533, -39.13605]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q34497", + nameEn: "Saint Helena", + aliases: ["SH-HL"], + country: "GB", + groups: ["SH", "BOTS", "011", "202", "002", "UN"], + level: "subterritory", + driveSide: "left", + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["290"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-8.3824, -13.9131], [-6.17428, -19.07236], [-3.29308, -15.22647], [-8.3824, -13.9131]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q35657", + nameEn: "US States", + country: "US", + level: "subcountryGroup" + }, + geometry: null + }, { + type: "Feature", + properties: { + wikidata: "Q36117", + nameEn: "Borneo", + level: "sharedLandform" + }, + geometry: null + }, { + type: "Feature", + properties: { + wikidata: "Q36678", + nameEn: "West Bank", + country: "PS", + groups: ["145", "142"], + callingCodes: ["970"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[35.47672, 31.49578], [35.55941, 31.76535], [35.52758, 31.9131], [35.54375, 31.96587], [35.52012, 32.04076], [35.57111, 32.21877], [35.55807, 32.38674], [35.42078, 32.41562], [35.41048, 32.43706], [35.41598, 32.45593], [35.42034, 32.46009], [35.40224, 32.50136], [35.35212, 32.52047], [35.30685, 32.51024], [35.29306, 32.50947], [35.25049, 32.52453], [35.2244, 32.55289], [35.15937, 32.50466], [35.10882, 32.4757], [35.10024, 32.47856], [35.09236, 32.47614], [35.08564, 32.46948], [35.07059, 32.4585], [35.05423, 32.41754], [35.05311, 32.4024], [35.0421, 32.38242], [35.05142, 32.3667], [35.04243, 32.35008], [35.01772, 32.33863], [35.01119, 32.28684], [35.02939, 32.2671], [35.01841, 32.23981], [34.98885, 32.20758], [34.95703, 32.19522], [34.96009, 32.17503], [34.99039, 32.14626], [34.98507, 32.12606], [34.99437, 32.10962], [34.9863, 32.09551], [35.00261, 32.027], [34.98682, 31.96935], [35.00124, 31.93264], [35.03489, 31.92448], [35.03978, 31.89276], [35.03489, 31.85919], [34.99712, 31.85569], [34.9724, 31.83352], [35.01978, 31.82944], [35.05617, 31.85685], [35.07677, 31.85627], [35.14174, 31.81325], [35.18603, 31.80901], [35.18169, 31.82542], [35.19461, 31.82687], [35.21469, 31.81835], [35.216, 31.83894], [35.21128, 31.863], [35.20381, 31.86716], [35.20673, 31.88151], [35.20791, 31.8821], [35.20945, 31.8815], [35.21016, 31.88237], [35.21276, 31.88153], [35.2136, 31.88241], [35.22014, 31.88264], [35.22294, 31.87889], [35.22567, 31.86745], [35.22817, 31.8638], [35.2249, 31.85433], [35.2304, 31.84222], [35.24816, 31.8458], [35.25753, 31.8387], [35.251, 31.83085], [35.26404, 31.82567], [35.25573, 31.81362], [35.26058, 31.79064], [35.25225, 31.7678], [35.26319, 31.74846], [35.25182, 31.73945], [35.24981, 31.72543], [35.2438, 31.7201], [35.24315, 31.71244], [35.23972, 31.70896], [35.22392, 31.71899], [35.21937, 31.71578], [35.20538, 31.72388], [35.18023, 31.72067], [35.16478, 31.73242], [35.15474, 31.73352], [35.15119, 31.73634], [35.13931, 31.73012], [35.12933, 31.7325], [35.11895, 31.71454], [35.10782, 31.71594], [35.08226, 31.69107], [35.00879, 31.65426], [34.95249, 31.59813], [34.9415, 31.55601], [34.94356, 31.50743], [34.93258, 31.47816], [34.89756, 31.43891], [34.87833, 31.39321], [34.88932, 31.37093], [34.92571, 31.34337], [35.02459, 31.35979], [35.13033, 31.3551], [35.22921, 31.37445], [35.39675, 31.49572], [35.47672, 31.49578]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q37362", + nameEn: "Akrotiri and Dhekelia", + aliases: ["SBA"], + country: "GB" + }, + geometry: null + }, { + type: "Feature", + properties: { + wikidata: "Q38095", + nameEn: "Gal\xE1pagos Islands", + aliases: ["EC-W"], + country: "EC", + groups: ["005", "419", "019", "UN"], + callingCodes: ["593"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-93.12365, 2.64343], [-92.46744, -2.52874], [-87.07749, -0.8849], [-93.12365, 2.64343]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q39760", + nameEn: "Gaza Strip", + country: "PS", + groups: ["145", "142"], + callingCodes: ["970"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[34.052, 31.46619], [34.21853, 31.32363], [34.23572, 31.2966], [34.24012, 31.29591], [34.26742, 31.21998], [34.29417, 31.24194], [34.36523, 31.28963], [34.37381, 31.30598], [34.36505, 31.36404], [34.40077, 31.40926], [34.48892, 31.48365], [34.56797, 31.54197], [34.48681, 31.59711], [34.29262, 31.70393], [34.052, 31.46619]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q40888", + nameEn: "Andaman and Nicobar Islands", + aliases: ["IN-AN"], + country: "IN", + groups: ["034", "142", "UN"], + driveSide: "left", + callingCodes: ["91"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[94.42132, 5.96581], [94.6371, 13.81803], [86.7822, 13.41052], [94.42132, 5.96581]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q41684", + nameEn: "Stewart Island", + country: "NZ", + groups: ["053", "009", "UN"], + driveSide: "left", + callingCodes: ["64"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[166.59185, -47.61313], [169.70504, -47.56021], [167.52103, -46.41337], [166.59185, -47.61313]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q43296", + nameEn: "Wake Island", + aliases: ["WK", "WAK", "WKUM", "872", "UM-79"], + country: "US", + groups: ["UM", "Q1352230", "057", "009", "UN"], + level: "subterritory", + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["1"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[167.34779, 18.97692], [166.67967, 20.14834], [165.82549, 18.97692], [167.34779, 18.97692]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q46275", + nameEn: "New Zealand Subantarctic Islands", + country: "NZ", + groups: ["Q851132", "053", "009", "UN"], + driveSide: "left" + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[164.30551, -47.88072], [161.96603, -56.07661], [179.49541, -50.04657], [179.49541, -47.2902], [169.91032, -47.66283], [164.30551, -47.88072]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q46395", + nameEn: "British Overseas Territories", + aliases: ["BOTS", "UKOTS"], + country: "GB", + level: "subcountryGroup" + }, + geometry: null + }, { + type: "Feature", + properties: { + wikidata: "Q46772", + nameEn: "Kerguelen Islands", + country: "FR", + groups: ["TF", "Q1451600", "014", "202", "002", "UN"], + level: "subterritory" + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[61.9216, -49.39746], [70.67507, -51.14192], [74.25129, -45.45074], [61.9216, -49.39746]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q46879", + nameEn: "Baker Island", + aliases: ["UM-81"], + country: "US", + groups: ["UM", "Q1352230", "061", "009", "UN"], + level: "subterritory", + roadSpeedUnit: "mph", + roadHeightUnit: "ft" + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-175.33482, -1.40631], [-175.31323, 0.5442], [-177.91421, 0.39582], [-175.33482, -1.40631]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q47863", + nameEn: "Midway Atoll", + aliases: ["MI", "MID", "MIUM", "488", "UM-71"], + country: "US", + groups: ["UM", "Q1352230", "061", "009", "UN"], + level: "subterritory", + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["1"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-176.29741, 29.09786], [-177.77531, 29.29793], [-177.5224, 27.7635], [-176.29741, 29.09786]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q62218", + nameEn: "Jarvis Island", + aliases: ["UM-86"], + country: "US", + groups: ["UM", "Q1352230", "061", "009", "UN"], + level: "subterritory", + roadSpeedUnit: "mph", + roadHeightUnit: "ft" + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-160.42921, -1.4364], [-159.12443, 0.19975], [-160.38779, 0.30331], [-160.42921, -1.4364]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q105472", + nameEn: "Macaronesia", + level: "sharedLandform" + }, + geometry: null + }, { + type: "Feature", + properties: { + wikidata: "Q114935", + nameEn: "Kermadec Islands", + country: "NZ", + groups: ["Q851132", "053", "009", "UN"], + driveSide: "left", + callingCodes: ["64"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-174.40891, -29.09438], [-180, -24.21376], [-179.96512, -35.00791], [-174.40891, -29.09438]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q115459", + nameEn: "Chatham Islands", + aliases: ["NZ-CIT"], + country: "NZ", + groups: ["Q851132", "053", "009", "UN"], + driveSide: "left", + callingCodes: ["64"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-179.93224, -45.18423], [-172.47015, -45.17912], [-176.30998, -41.38382], [-179.93224, -45.18423]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q118863", + nameEn: "North Island", + country: "NZ", + groups: ["053", "009", "UN"], + driveSide: "left", + callingCodes: ["64"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[179.49541, -47.2902], [179.49541, -36.79303], [174.17679, -32.62487], [170.27492, -36.38133], [174.58663, -40.80446], [174.46634, -41.55028], [179.49541, -47.2902]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q120755", + nameEn: "South Island", + country: "NZ", + groups: ["053", "009", "UN"], + driveSide: "left", + callingCodes: ["64"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[169.70504, -47.56021], [179.49541, -47.2902], [174.46634, -41.55028], [174.58663, -40.80446], [170.27492, -36.38133], [166.56976, -39.94841], [164.8365, -46.0205], [167.52103, -46.41337], [169.70504, -47.56021]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q123076", + nameEn: "Palmyra Atoll", + aliases: ["UM-95"], + country: "US", + groups: ["UM", "Q1352230", "061", "009", "UN"], + level: "subterritory", + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["1"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-161.06795, 5.2462], [-161.0731, 7.1291], [-163.24478, 5.24198], [-161.06795, 5.2462]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q130574", + nameEn: "Chafarinas Islands", + country: "ES", + groups: ["EU", "Q191011", "015", "002", "UN"], + level: "subterritory" + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-2.40316, 35.16893], [-2.43262, 35.20652], [-2.45965, 35.16527], [-2.40316, 35.16893]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q130895", + nameEn: "Kingman Reef", + aliases: ["UM-89"], + country: "US", + groups: ["UM", "Q1352230", "061", "009", "UN"], + level: "subterritory", + roadSpeedUnit: "mph", + roadHeightUnit: "ft" + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-161.0731, 7.1291], [-163.16627, 7.15036], [-163.24478, 5.24198], [-161.0731, 7.1291]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q131008", + nameEn: "Johnston Atoll", + aliases: ["JT", "JTN", "JTUM", "396", "UM-67"], + country: "US", + groups: ["UM", "Q1352230", "061", "009", "UN"], + level: "subterritory", + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["1"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-170.65691, 16.57199], [-168.87689, 16.01159], [-169.2329, 17.4933], [-170.65691, 16.57199]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q131305", + nameEn: "Howland Island", + aliases: ["UM-84"], + country: "US", + groups: ["UM", "Q1352230", "061", "009", "UN"], + level: "subterritory", + roadSpeedUnit: "mph", + roadHeightUnit: "ft" + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-177.91421, 0.39582], [-175.31323, 0.5442], [-176.74464, 2.28109], [-177.91421, 0.39582]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q133888", + nameEn: "Ashmore and Cartier Islands", + country: "AU", + groups: ["053", "009", "UN"], + driveSide: "left", + callingCodes: ["61"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[123.7463, -11.1783], [120.6877, -13.59408], [125.29076, -12.33139], [123.7463, -11.1783]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q153732", + nameEn: "Mariana Islands", + level: "sharedLandform" + }, + geometry: null + }, { + type: "Feature", + properties: { + wikidata: "Q172216", + nameEn: "Coral Sea Islands", + country: "AU", + groups: ["053", "009", "UN"], + driveSide: "left", + callingCodes: ["61"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[159.77159, -28.41151], [156.73836, -14.50464], [145.2855, -9.62524], [147.69992, -17.5933], [152.93188, -20.92631], [154.02855, -24.43238], [159.77159, -28.41151]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q179313", + nameEn: "Alderney", + country: "GB", + groups: ["GG", "830", "Q185086", "154", "150", "UN"], + level: "subterritory", + driveSide: "left", + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["44 01481"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-2.36485, 49.48223], [-2.09454, 49.46288], [-2.02963, 49.91866], [-2.49556, 49.79012], [-2.36485, 49.48223]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q185086", + nameEn: "Crown Dependencies", + country: "GB", + level: "subcountryGroup" + }, + geometry: null + }, { + type: "Feature", + properties: { + wikidata: "Q190571", + nameEn: "Scattered Islands", + country: "FR", + groups: ["TF", "Q1451600", "014", "202", "002", "UN"], + level: "subterritory" + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[53.53458, -16.36909], [54.96649, -16.28353], [54.61476, -15.02273], [53.53458, -16.36909]]], [[[38.55969, -20.75596], [40.68027, -23.38889], [43.52893, -15.62903], [38.55969, -20.75596]]], [[[47.03092, -11.05648], [47.11593, -12.08552], [47.96702, -11.46447], [47.03092, -11.05648]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q191011", + nameEn: "Plazas de soberan\xEDa", + country: "ES" + }, + geometry: null + }, { + type: "Feature", + properties: { + wikidata: "Q191146", + nameEn: "Pe\xF1\xF3n de V\xE9lez de la Gomera", + country: "ES", + groups: ["EU", "Q191011", "015", "002", "UN"], + level: "subterritory" + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-4.30191, 35.17419], [-4.30112, 35.17058], [-4.29436, 35.17149], [-4.30191, 35.17419]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q201698", + nameEn: "Crozet Islands", + country: "FR", + groups: ["TF", "Q1451600", "014", "202", "002", "UN"], + level: "subterritory" + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[55.03425, -43.65017], [46.31615, -46.28749], [54.5587, -47.93013], [55.03425, -43.65017]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q578170", + nameEn: "Contiguous United States", + aliases: ["CONUS"], + country: "US", + groups: ["Q35657", "021", "003", "019", "UN"], + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["1"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-97.13927, 25.96583], [-96.92418, 25.97377], [-80.57035, 24.0565], [-78.91214, 27.76553], [-61.98255, 37.34815], [-67.16117, 44.20069], [-66.93432, 44.82597], [-66.96824, 44.83078], [-66.98249, 44.87071], [-66.96824, 44.90965], [-67.0216, 44.95333], [-67.11316, 45.11176], [-67.15965, 45.16179], [-67.19603, 45.16771], [-67.20349, 45.1722], [-67.22751, 45.16344], [-67.27039, 45.1934], [-67.29748, 45.18173], [-67.29754, 45.14865], [-67.34927, 45.122], [-67.48201, 45.27351], [-67.42394, 45.37969], [-67.50578, 45.48971], [-67.42144, 45.50584], [-67.43815, 45.59162], [-67.6049, 45.60725], [-67.80705, 45.69528], [-67.80653, 45.80022], [-67.75654, 45.82324], [-67.80961, 45.87531], [-67.75196, 45.91814], [-67.78111, 45.9392], [-67.78578, 47.06473], [-67.87993, 47.10377], [-67.94843, 47.1925], [-68.23244, 47.35712], [-68.37458, 47.35851], [-68.38332, 47.28723], [-68.57914, 47.28431], [-68.60575, 47.24659], [-68.70125, 47.24399], [-68.89222, 47.1807], [-69.05039, 47.2456], [-69.05073, 47.30076], [-69.05148, 47.42012], [-69.22119, 47.46461], [-69.99966, 46.69543], [-70.05812, 46.41768], [-70.18547, 46.35357], [-70.29078, 46.18832], [-70.23855, 46.1453], [-70.31025, 45.96424], [-70.24694, 45.95138], [-70.25976, 45.89675], [-70.41523, 45.79497], [-70.38934, 45.73215], [-70.54019, 45.67291], [-70.68516, 45.56964], [-70.72651, 45.49771], [-70.62518, 45.42286], [-70.65383, 45.37592], [-70.78372, 45.43269], [-70.82638, 45.39828], [-70.80236, 45.37444], [-70.84816, 45.22698], [-70.89864, 45.2398], [-70.91169, 45.29849], [-70.95193, 45.33895], [-71.0107, 45.34819], [-71.01866, 45.31573], [-71.08364, 45.30623], [-71.14568, 45.24128], [-71.19723, 45.25438], [-71.22338, 45.25184], [-71.29371, 45.29996], [-71.37133, 45.24624], [-71.44252, 45.2361], [-71.40364, 45.21382], [-71.42778, 45.12624], [-71.48735, 45.07784], [-71.50067, 45.01357], [-73.35025, 45.00942], [-74.32699, 44.99029], [-74.66689, 45.00646], [-74.8447, 45.00606], [-74.99101, 44.98051], [-75.01363, 44.95608], [-75.2193, 44.87821], [-75.41441, 44.76614], [-75.76813, 44.51537], [-75.8217, 44.43176], [-75.95947, 44.34463], [-76.00018, 44.34896], [-76.16285, 44.28262], [-76.1664, 44.23051], [-76.244, 44.19643], [-76.31222, 44.19894], [-76.35324, 44.13493], [-76.43859, 44.09393], [-76.79706, 43.63099], [-79.25796, 43.54052], [-79.06921, 43.26183], [-79.05512, 43.25375], [-79.05544, 43.21224], [-79.05002, 43.20133], [-79.05384, 43.17418], [-79.04652, 43.16396], [-79.0427, 43.13934], [-79.06881, 43.12029], [-79.05671, 43.10937], [-79.07486, 43.07845], [-79.01055, 43.06659], [-78.99941, 43.05612], [-79.02424, 43.01983], [-79.02074, 42.98444], [-78.98126, 42.97], [-78.96312, 42.95509], [-78.93224, 42.95229], [-78.90905, 42.93022], [-78.90712, 42.89733], [-78.93684, 42.82887], [-82.67862, 41.67615], [-83.11184, 41.95671], [-83.14962, 42.04089], [-83.12724, 42.2376], [-83.09837, 42.28877], [-83.07837, 42.30978], [-83.02253, 42.33045], [-82.82964, 42.37355], [-82.64242, 42.55594], [-82.58873, 42.54984], [-82.57583, 42.5718], [-82.51858, 42.611], [-82.51063, 42.66025], [-82.46613, 42.76615], [-82.4826, 42.8068], [-82.45331, 42.93139], [-82.4253, 42.95423], [-82.4146, 42.97626], [-82.42469, 42.992], [-82.48419, 45.30225], [-83.59589, 45.82131], [-83.43746, 45.99749], [-83.57017, 46.105], [-83.83329, 46.12169], [-83.90453, 46.05922], [-83.95399, 46.05634], [-84.1096, 46.23987], [-84.09756, 46.25512], [-84.11615, 46.2681], [-84.11254, 46.32329], [-84.13451, 46.39218], [-84.11196, 46.50248], [-84.12885, 46.53068], [-84.17723, 46.52753], [-84.1945, 46.54061], [-84.2264, 46.53337], [-84.26351, 46.49508], [-84.29893, 46.49127], [-84.34174, 46.50683], [-84.42101, 46.49853], [-84.4481, 46.48972], [-84.47607, 46.45225], [-84.55635, 46.45974], [-84.85871, 46.88881], [-88.37033, 48.30586], [-89.48837, 48.01412], [-89.57972, 48.00023], [-89.77248, 48.02607], [-89.89974, 47.98109], [-90.07418, 48.11043], [-90.56312, 48.09488], [-90.56444, 48.12184], [-90.75045, 48.09143], [-90.87588, 48.2484], [-91.08016, 48.18096], [-91.25025, 48.08522], [-91.43248, 48.04912], [-91.45829, 48.07454], [-91.58025, 48.04339], [-91.55649, 48.10611], [-91.70451, 48.11805], [-91.71231, 48.19875], [-91.86125, 48.21278], [-91.98929, 48.25409], [-92.05339, 48.35958], [-92.14732, 48.36578], [-92.202, 48.35252], [-92.26662, 48.35651], [-92.30939, 48.31251], [-92.27167, 48.25046], [-92.37185, 48.22259], [-92.48147, 48.36609], [-92.45588, 48.40624], [-92.50712, 48.44921], [-92.65606, 48.43471], [-92.71323, 48.46081], [-92.69927, 48.49573], [-92.62747, 48.50278], [-92.6342, 48.54133], [-92.7287, 48.54005], [-92.94973, 48.60866], [-93.25391, 48.64266], [-93.33946, 48.62787], [-93.3712, 48.60599], [-93.39758, 48.60364], [-93.40693, 48.60948], [-93.44472, 48.59147], [-93.47022, 48.54357], [-93.66382, 48.51845], [-93.79267, 48.51631], [-93.80939, 48.52439], [-93.80676, 48.58232], [-93.83288, 48.62745], [-93.85769, 48.63284], [-94.23215, 48.65202], [-94.25104, 48.65729], [-94.25172, 48.68404], [-94.27153, 48.70232], [-94.4174, 48.71049], [-94.44258, 48.69223], [-94.53826, 48.70216], [-94.54885, 48.71543], [-94.58903, 48.71803], [-94.69335, 48.77883], [-94.69669, 48.80918], [-94.70486, 48.82365], [-94.70087, 48.8339], [-94.687, 48.84077], [-94.75017, 49.09931], [-94.77355, 49.11998], [-94.82487, 49.29483], [-94.8159, 49.32299], [-94.85381, 49.32492], [-94.95681, 49.37035], [-94.99532, 49.36579], [-95.01419, 49.35647], [-95.05825, 49.35311], [-95.12903, 49.37056], [-95.15357, 49.384], [-95.15355, 48.9996], [-123.32163, 49.00419], [-123.0093, 48.83186], [-123.0093, 48.76586], [-123.26565, 48.6959], [-123.15614, 48.35395], [-123.50039, 48.21223], [-125.03842, 48.53282], [-133.98258, 38.06389], [-118.48109, 32.5991], [-117.1243, 32.53427], [-115.88053, 32.63624], [-114.71871, 32.71894], [-114.76736, 32.64094], [-114.80584, 32.62028], [-114.81141, 32.55543], [-114.79524, 32.55731], [-114.82011, 32.49609], [-111.07523, 31.33232], [-108.20979, 31.33316], [-108.20899, 31.78534], [-106.529, 31.784], [-106.52266, 31.77509], [-106.51251, 31.76922], [-106.50962, 31.76155], [-106.50111, 31.75714], [-106.48815, 31.74769], [-106.47298, 31.75054], [-106.46726, 31.75998], [-106.45244, 31.76523], [-106.43419, 31.75478], [-106.41773, 31.75196], [-106.38003, 31.73151], [-106.3718, 31.71165], [-106.34864, 31.69663], [-106.33419, 31.66303], [-106.30305, 31.62154], [-106.28084, 31.56173], [-106.24612, 31.54193], [-106.23711, 31.51262], [-106.20346, 31.46305], [-106.09025, 31.40569], [-106.00363, 31.39181], [-104.77674, 30.4236], [-104.5171, 29.64671], [-104.3969, 29.57105], [-104.39363, 29.55396], [-104.37752, 29.54255], [-103.15787, 28.93865], [-102.60596, 29.8192], [-101.47277, 29.7744], [-101.05686, 29.44738], [-101.01128, 29.36947], [-100.96725, 29.3477], [-100.94579, 29.34523], [-100.94056, 29.33371], [-100.87982, 29.296], [-100.79696, 29.24688], [-100.67294, 29.09744], [-100.63689, 28.90812], [-100.59809, 28.88197], [-100.52313, 28.75598], [-100.5075, 28.74066], [-100.51222, 28.70679], [-100.50029, 28.66117], [-99.55409, 27.61314], [-99.51478, 27.55836], [-99.52955, 27.49747], [-99.50208, 27.50021], [-99.48045, 27.49016], [-99.482, 27.47128], [-99.49744, 27.43746], [-99.53573, 27.30926], [-99.08477, 26.39849], [-99.03053, 26.41249], [-99.00546, 26.3925], [-98.35126, 26.15129], [-98.30491, 26.10475], [-98.27075, 26.09457], [-98.24603, 26.07191], [-97.97017, 26.05232], [-97.95155, 26.0625], [-97.66511, 26.01708], [-97.52025, 25.88518], [-97.49828, 25.89877], [-97.45669, 25.86874], [-97.42511, 25.83969], [-97.37332, 25.83854], [-97.35946, 25.92189], [-97.13927, 25.96583]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q620634", + nameEn: "Bir Tawil", + groups: ["015", "002"], + level: "territory" + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[33.17563, 22.00405], [33.57251, 21.72406], [33.99686, 21.76784], [34.0765, 22.00501], [33.17563, 22.00405]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q639185", + nameEn: "Peros Banhos", + country: "GB", + groups: ["IO", "BOTS", "014", "202", "002", "UN"], + level: "subterritory" + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[72.12587, -4.02588], [70.1848, -6.37445], [72.09518, -5.61768], [72.12587, -4.02588]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q644636", + nameEn: "Cyprus", + level: "sharedLandform" + }, + geometry: null + }, { + type: "Feature", + properties: { + wikidata: "Q851132", + nameEn: "New Zealand Outlying Islands", + country: "NZ", + level: "subcountryGroup" + }, + geometry: null + }, { + type: "Feature", + properties: { + wikidata: "Q875134", + nameEn: "European Russia", + country: "RU", + groups: ["151", "150", "UN"], + callingCodes: ["7"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[18.57853, 55.25302], [19.64312, 54.45423], [19.8038, 54.44203], [20.63871, 54.3706], [21.41123, 54.32395], [22.79705, 54.36264], [22.7253, 54.41732], [22.70208, 54.45312], [22.67788, 54.532], [22.71293, 54.56454], [22.68021, 54.58486], [22.7522, 54.63525], [22.74225, 54.64339], [22.75467, 54.6483], [22.73397, 54.66604], [22.73631, 54.72952], [22.87317, 54.79492], [22.85083, 54.88711], [22.76422, 54.92521], [22.68723, 54.9811], [22.65451, 54.97037], [22.60075, 55.01863], [22.58907, 55.07085], [22.47688, 55.04408], [22.31562, 55.0655], [22.14267, 55.05345], [22.11697, 55.02131], [22.06087, 55.02935], [22.02582, 55.05078], [22.03984, 55.07888], [21.99543, 55.08691], [21.96505, 55.07353], [21.85521, 55.09493], [21.64954, 55.1791], [21.55605, 55.20311], [21.51095, 55.18507], [21.46766, 55.21115], [21.38446, 55.29348], [21.35465, 55.28427], [21.26425, 55.24456], [20.95181, 55.27994], [20.60454, 55.40986], [18.57853, 55.25302]]], [[[26.32936, 60.00121], [26.90044, 59.63819], [27.85643, 59.58538], [28.04187, 59.47017], [28.19061, 59.39962], [28.21137, 59.38058], [28.20537, 59.36491], [28.19284, 59.35791], [28.14215, 59.28934], [28.00689, 59.28351], [27.90911, 59.24353], [27.87978, 59.18097], [27.80482, 59.1116], [27.74429, 58.98351], [27.36366, 58.78381], [27.55489, 58.39525], [27.48541, 58.22615], [27.62393, 58.09462], [27.67282, 57.92627], [27.81841, 57.89244], [27.78526, 57.83963], [27.56689, 57.83356], [27.50171, 57.78842], [27.52615, 57.72843], [27.3746, 57.66834], [27.40393, 57.62125], [27.31919, 57.57672], [27.34698, 57.52242], [27.56832, 57.53728], [27.52453, 57.42826], [27.86101, 57.29402], [27.66511, 56.83921], [27.86101, 56.88204], [28.04768, 56.59004], [28.13526, 56.57989], [28.10069, 56.524], [28.19057, 56.44637], [28.16599, 56.37806], [28.23716, 56.27588], [28.15217, 56.16964], [28.30571, 56.06035], [28.36888, 56.05805], [28.37987, 56.11399], [28.43068, 56.09407], [28.5529, 56.11705], [28.68337, 56.10173], [28.63668, 56.07262], [28.73418, 55.97131], [29.08299, 56.03427], [29.21717, 55.98971], [29.44692, 55.95978], [29.3604, 55.75862], [29.51283, 55.70294], [29.61446, 55.77716], [29.80672, 55.79569], [29.97975, 55.87281], [30.12136, 55.8358], [30.27776, 55.86819], [30.30987, 55.83592], [30.48257, 55.81066], [30.51346, 55.78982], [30.51037, 55.76568], [30.63344, 55.73079], [30.67464, 55.64176], [30.72957, 55.66268], [30.7845, 55.58514], [30.86003, 55.63169], [30.93419, 55.6185], [30.95204, 55.50667], [30.90123, 55.46621], [30.93144, 55.3914], [30.8257, 55.3313], [30.81946, 55.27931], [30.87944, 55.28223], [30.97369, 55.17134], [31.02071, 55.06167], [31.00972, 55.02783], [30.94243, 55.03964], [30.9081, 55.02232], [30.95754, 54.98609], [30.93144, 54.9585], [30.81759, 54.94064], [30.8264, 54.90062], [30.75165, 54.80699], [30.95479, 54.74346], [30.97127, 54.71967], [31.0262, 54.70698], [30.98226, 54.68872], [30.99187, 54.67046], [31.19339, 54.66947], [31.21399, 54.63113], [31.08543, 54.50361], [31.22945, 54.46585], [31.3177, 54.34067], [31.30791, 54.25315], [31.57002, 54.14535], [31.89599, 54.0837], [31.88744, 54.03653], [31.85019, 53.91801], [31.77028, 53.80015], [31.89137, 53.78099], [32.12621, 53.81586], [32.36663, 53.7166], [32.45717, 53.74039], [32.50112, 53.68594], [32.40499, 53.6656], [32.47777, 53.5548], [32.74968, 53.45597], [32.73257, 53.33494], [32.51725, 53.28431], [32.40773, 53.18856], [32.15368, 53.07594], [31.82373, 53.10042], [31.787, 53.18033], [31.62496, 53.22886], [31.56316, 53.19432], [31.40523, 53.21406], [31.36403, 53.13504], [31.3915, 53.09712], [31.33519, 53.08805], [31.32283, 53.04101], [31.24147, 53.031], [31.35667, 52.97854], [31.592, 52.79011], [31.57277, 52.71613], [31.50406, 52.69707], [31.63869, 52.55361], [31.56316, 52.51518], [31.61397, 52.48843], [31.62084, 52.33849], [31.57971, 52.32146], [31.70735, 52.26711], [31.6895, 52.1973], [31.77877, 52.18636], [31.7822, 52.11406], [31.81722, 52.09955], [31.85018, 52.11305], [31.96141, 52.08015], [31.92159, 52.05144], [32.08813, 52.03319], [32.23331, 52.08085], [32.2777, 52.10266], [32.34044, 52.1434], [32.33083, 52.23685], [32.38988, 52.24946], [32.3528, 52.32842], [32.54781, 52.32423], [32.69475, 52.25535], [32.85405, 52.27888], [32.89937, 52.2461], [33.18913, 52.3754], [33.51323, 52.35779], [33.48027, 52.31499], [33.55718, 52.30324], [33.78789, 52.37204], [34.05239, 52.20132], [34.11199, 52.14087], [34.09413, 52.00835], [34.41136, 51.82793], [34.42922, 51.72852], [34.07765, 51.67065], [34.17599, 51.63253], [34.30562, 51.5205], [34.22048, 51.4187], [34.33446, 51.363], [34.23009, 51.26429], [34.31661, 51.23936], [34.38802, 51.2746], [34.6613, 51.25053], [34.6874, 51.18], [34.82472, 51.17483], [34.97304, 51.2342], [35.14058, 51.23162], [35.12685, 51.16191], [35.20375, 51.04723], [35.31774, 51.08434], [35.40837, 51.04119], [35.32598, 50.94524], [35.39307, 50.92145], [35.41367, 50.80227], [35.47704, 50.77274], [35.48116, 50.66405], [35.39464, 50.64751], [35.47463, 50.49247], [35.58003, 50.45117], [35.61711, 50.35707], [35.73659, 50.35489], [35.80388, 50.41356], [35.8926, 50.43829], [36.06893, 50.45205], [36.20763, 50.3943], [36.30101, 50.29088], [36.47817, 50.31457], [36.58371, 50.28563], [36.56655, 50.2413], [36.64571, 50.218], [36.69377, 50.26982], [36.91762, 50.34963], [37.08468, 50.34935], [37.48204, 50.46079], [37.47243, 50.36277], [37.62486, 50.29966], [37.62879, 50.24481], [37.61113, 50.21976], [37.75807, 50.07896], [37.79515, 50.08425], [37.90776, 50.04194], [38.02999, 49.94482], [38.02999, 49.90592], [38.21675, 49.98104], [38.18517, 50.08161], [38.32524, 50.08866], [38.35408, 50.00664], [38.65688, 49.97176], [38.68677, 50.00904], [38.73311, 49.90238], [38.90477, 49.86787], [38.9391, 49.79524], [39.1808, 49.88911], [39.27968, 49.75976], [39.44496, 49.76067], [39.59142, 49.73758], [39.65047, 49.61761], [39.84548, 49.56064], [40.13249, 49.61672], [40.16683, 49.56865], [40.03636, 49.52321], [40.03087, 49.45452], [40.1141, 49.38798], [40.14912, 49.37681], [40.18331, 49.34996], [40.22176, 49.25683], [40.01988, 49.1761], [39.93437, 49.05709], [39.6836, 49.05121], [39.6683, 48.99454], [39.71353, 48.98959], [39.72649, 48.9754], [39.74874, 48.98675], [39.78368, 48.91596], [39.98967, 48.86901], [40.03636, 48.91957], [40.08168, 48.87443], [39.97182, 48.79398], [39.79466, 48.83739], [39.73104, 48.7325], [39.71765, 48.68673], [39.67226, 48.59368], [39.79764, 48.58668], [39.84548, 48.57821], [39.86196, 48.46633], [39.88794, 48.44226], [39.94847, 48.35055], [39.84136, 48.33321], [39.84273, 48.30947], [39.90041, 48.3049], [39.91465, 48.26743], [39.95248, 48.29972], [39.9693, 48.29904], [39.97325, 48.31399], [39.99241, 48.31768], [40.00752, 48.22445], [39.94847, 48.22811], [39.83724, 48.06501], [39.88256, 48.04482], [39.77544, 48.04206], [39.82213, 47.96396], [39.73935, 47.82876], [38.87979, 47.87719], [38.79628, 47.81109], [38.76379, 47.69346], [38.35062, 47.61631], [38.28679, 47.53552], [38.28954, 47.39255], [38.22225, 47.30788], [38.33074, 47.30508], [38.32112, 47.2585], [38.23049, 47.2324], [38.22955, 47.12069], [38.3384, 46.98085], [38.12112, 46.86078], [37.62608, 46.82615], [35.23066, 45.79231], [35.04991, 45.76827], [36.6645, 45.4514], [36.6545, 45.3417], [36.5049, 45.3136], [36.475, 45.2411], [36.4883, 45.0488], [33.5943, 44.03313], [39.81147, 43.06294], [40.0078, 43.38551], [40.00853, 43.40578], [40.01552, 43.42025], [40.01007, 43.42411], [40.03312, 43.44262], [40.04445, 43.47776], [40.10657, 43.57344], [40.65957, 43.56212], [41.64935, 43.22331], [42.40563, 43.23226], [42.66667, 43.13917], [42.75889, 43.19651], [43.03322, 43.08883], [43.0419, 43.02413], [43.81453, 42.74297], [43.73119, 42.62043], [43.95517, 42.55396], [44.54202, 42.75699], [44.70002, 42.74679], [44.80941, 42.61277], [44.88754, 42.74934], [45.15318, 42.70598], [45.36501, 42.55268], [45.78692, 42.48358], [45.61676, 42.20768], [46.42738, 41.91323], [46.5332, 41.87389], [46.58924, 41.80547], [46.75269, 41.8623], [46.8134, 41.76252], [47.00955, 41.63583], [46.99554, 41.59743], [47.03757, 41.55434], [47.10762, 41.59044], [47.34579, 41.27884], [47.49004, 41.26366], [47.54504, 41.20275], [47.62288, 41.22969], [47.75831, 41.19455], [47.87973, 41.21798], [48.07587, 41.49957], [48.22064, 41.51472], [48.2878, 41.56221], [48.40277, 41.60441], [48.42301, 41.65444], [48.55078, 41.77917], [48.5867, 41.84306], [48.80971, 41.95365], [49.2134, 44.84989], [49.88945, 46.04554], [49.32259, 46.26944], [49.16518, 46.38542], [48.54988, 46.56267], [48.51142, 46.69268], [49.01136, 46.72716], [48.52326, 47.4102], [48.45173, 47.40818], [48.15348, 47.74545], [47.64973, 47.76559], [47.41689, 47.83687], [47.38731, 47.68176], [47.12107, 47.83687], [47.11516, 48.27188], [46.49011, 48.43019], [46.78392, 48.95352], [47.00857, 49.04921], [47.04658, 49.19834], [46.78398, 49.34026], [46.9078, 49.86707], [47.18319, 49.93721], [47.34589, 50.09308], [47.30448, 50.30894], [47.58551, 50.47867], [48.10044, 50.09242], [48.24519, 49.86099], [48.42564, 49.82283], [48.68352, 49.89546], [48.90782, 50.02281], [48.57946, 50.63278], [48.86936, 50.61589], [49.12673, 50.78639], [49.41959, 50.85927], [49.39001, 51.09396], [49.76866, 51.11067], [49.97277, 51.2405], [50.26859, 51.28677], [50.59695, 51.61859], [51.26254, 51.68466], [51.301, 51.48799], [51.77431, 51.49536], [51.8246, 51.67916], [52.36119, 51.74161], [52.54329, 51.48444], [53.46165, 51.49445], [53.69299, 51.23466], [54.12248, 51.11542], [54.46331, 50.85554], [54.41894, 50.61214], [54.55797, 50.52006], [54.71476, 50.61214], [54.56685, 51.01958], [54.72067, 51.03261], [55.67774, 50.54508], [56.11398, 50.7471], [56.17906, 50.93204], [57.17302, 51.11253], [57.44221, 50.88354], [57.74986, 50.93017], [57.75578, 51.13852], [58.3208, 51.15151], [58.87974, 50.70852], [59.48928, 50.64216], [59.51886, 50.49937], [59.81172, 50.54451], [60.01288, 50.8163], [60.17262, 50.83312], [60.31914, 50.67705], [60.81833, 50.6629], [61.4431, 50.80679], [61.56889, 51.23679], [61.6813, 51.25716], [61.55114, 51.32746], [61.50677, 51.40687], [60.95655, 51.48615], [60.92401, 51.61124], [60.5424, 51.61675], [60.36787, 51.66815], [60.50986, 51.7964], [60.09867, 51.87135], [59.99809, 51.98263], [59.91279, 52.06924], [60.17253, 52.25814], [60.17516, 52.39457], [59.25033, 52.46803], [59.22409, 52.28437], [58.79644, 52.43392], [58.94336, 53.953], [59.70487, 54.14846], [59.95217, 54.85853], [57.95234, 54.39672], [57.14829, 54.84204], [57.25137, 55.26262], [58.81825, 55.03378], [59.49035, 55.60486], [59.28419, 56.15739], [57.51527, 56.08729], [57.28024, 56.87898], [58.07604, 57.08308], [58.13789, 57.68097], [58.81412, 57.71602], [58.71104, 58.07475], [59.40376, 58.45822], [59.15636, 59.14682], [58.3853, 59.487], [59.50685, 60.91162], [59.36223, 61.3882], [59.61398, 62.44915], [59.24834, 63.01859], [59.80579, 64.13948], [59.63945, 64.78384], [60.74386, 64.95767], [61.98014, 65.72191], [66.1708, 67.61252], [64.18965, 69.94255], [76.13964, 83.37843], [36.85549, 84.09565], [32.07813, 72.01005], [31.59909, 70.16571], [30.84095, 69.80584], [30.95011, 69.54699], [30.52662, 69.54699], [30.16363, 69.65244], [29.97205, 69.41623], [29.27631, 69.2811], [29.26623, 69.13794], [29.0444, 69.0119], [28.91738, 69.04774], [28.45957, 68.91417], [28.78224, 68.86696], [28.43941, 68.53366], [28.62982, 68.19816], [29.34179, 68.06655], [29.66955, 67.79872], [30.02041, 67.67523], [29.91155, 67.51507], [28.9839, 66.94139], [29.91155, 66.13863], [30.16363, 65.66935], [29.97205, 65.70256], [29.74013, 65.64025], [29.84096, 65.56945], [29.68972, 65.31803], [29.61914, 65.23791], [29.8813, 65.22101], [29.84096, 65.1109], [29.61914, 65.05993], [29.68972, 64.80789], [30.05271, 64.79072], [30.12329, 64.64862], [30.01238, 64.57513], [30.06279, 64.35782], [30.4762, 64.25728], [30.55687, 64.09036], [30.25437, 63.83364], [29.98213, 63.75795], [30.49637, 63.46666], [31.23244, 63.22239], [31.29294, 63.09035], [31.58535, 62.91642], [31.38369, 62.66284], [31.10136, 62.43042], [29.01829, 61.17448], [28.82816, 61.1233], [28.47974, 60.93365], [27.77352, 60.52722], [27.71177, 60.3893], [27.44953, 60.22766], [26.32936, 60.00121]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q1083368", + nameEn: "Mainland Finland", + country: "FI", + groups: ["EU", "154", "150", "UN"], + callingCodes: ["358"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[29.12697, 69.69193], [28.36883, 69.81658], [28.32849, 69.88605], [27.97558, 69.99671], [27.95542, 70.0965], [27.57226, 70.06215], [27.05802, 69.92069], [26.64461, 69.96565], [26.40261, 69.91377], [25.96904, 69.68397], [25.69679, 69.27039], [25.75729, 68.99383], [25.61613, 68.89602], [25.42455, 68.90328], [25.12206, 68.78684], [25.10189, 68.63307], [24.93048, 68.61102], [24.90023, 68.55579], [24.74898, 68.65143], [24.18432, 68.73936], [24.02299, 68.81601], [23.781, 68.84514], [23.68017, 68.70276], [23.13064, 68.64684], [22.53321, 68.74393], [22.38367, 68.71561], [22.27276, 68.89514], [21.63833, 69.27485], [21.27827, 69.31281], [21.00732, 69.22755], [20.98641, 69.18809], [21.11099, 69.10291], [21.05775, 69.0356], [20.72171, 69.11874], [20.55258, 69.06069], [20.78802, 69.03087], [20.91658, 68.96764], [20.85104, 68.93142], [20.90649, 68.89696], [21.03001, 68.88969], [22.00429, 68.50692], [22.73028, 68.40881], [23.10336, 68.26551], [23.15377, 68.14759], [23.26469, 68.15134], [23.40081, 68.05545], [23.65793, 67.9497], [23.45627, 67.85297], [23.54701, 67.59306], [23.39577, 67.46974], [23.75372, 67.43688], [23.75372, 67.29914], [23.54701, 67.25435], [23.58735, 67.20752], [23.56214, 67.17038], [23.98563, 66.84149], [23.98059, 66.79585], [23.89488, 66.772], [23.85959, 66.56434], [23.63776, 66.43568], [23.67591, 66.3862], [23.64982, 66.30603], [23.71339, 66.21299], [23.90497, 66.15802], [24.15791, 65.85385], [24.14798, 65.83466], [24.15107, 65.81427], [24.14112, 65.39731], [20.15877, 63.06556], [19.23413, 60.61414], [20.96741, 60.71528], [21.15143, 60.54555], [21.08159, 60.20167], [21.02509, 60.12142], [21.35468, 59.67511], [20.5104, 59.15546], [26.32936, 60.00121], [27.44953, 60.22766], [27.71177, 60.3893], [27.77352, 60.52722], [28.47974, 60.93365], [28.82816, 61.1233], [29.01829, 61.17448], [31.10136, 62.43042], [31.38369, 62.66284], [31.58535, 62.91642], [31.29294, 63.09035], [31.23244, 63.22239], [30.49637, 63.46666], [29.98213, 63.75795], [30.25437, 63.83364], [30.55687, 64.09036], [30.4762, 64.25728], [30.06279, 64.35782], [30.01238, 64.57513], [30.12329, 64.64862], [30.05271, 64.79072], [29.68972, 64.80789], [29.61914, 65.05993], [29.84096, 65.1109], [29.8813, 65.22101], [29.61914, 65.23791], [29.68972, 65.31803], [29.84096, 65.56945], [29.74013, 65.64025], [29.97205, 65.70256], [30.16363, 65.66935], [29.91155, 66.13863], [28.9839, 66.94139], [29.91155, 67.51507], [30.02041, 67.67523], [29.66955, 67.79872], [29.34179, 68.06655], [28.62982, 68.19816], [28.43941, 68.53366], [28.78224, 68.86696], [28.45957, 68.91417], [28.91738, 69.04774], [28.81248, 69.11997], [28.8629, 69.22395], [29.31664, 69.47994], [29.12697, 69.69193]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q1184963", + nameEn: "Alhucemas Islands", + country: "ES", + groups: ["EU", "Q191011", "015", "002", "UN"], + level: "subterritory" + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-3.90602, 35.21494], [-3.88372, 35.20767], [-3.89343, 35.22728], [-3.90602, 35.21494]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q1298289", + nameEn: "Egmont Islands", + country: "GB", + groups: ["IO", "BOTS", "014", "202", "002", "UN"], + level: "subterritory" + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[70.1848, -6.37445], [70.67958, -8.2663], [72.17991, -6.68509], [70.1848, -6.37445]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q1352230", + nameEn: "US Territories", + country: "US", + level: "subcountryGroup" + }, + geometry: null + }, { + type: "Feature", + properties: { + wikidata: "Q1451600", + nameEn: "Overseas Countries and Territories of the EU", + aliases: ["OCT"], + level: "subunion" + }, + geometry: null + }, { + type: "Feature", + properties: { + wikidata: "Q1544253", + nameEn: "Great Chagos Bank", + country: "GB", + groups: ["IO", "BOTS", "014", "202", "002", "UN"], + level: "subterritory" + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[70.1848, -6.37445], [72.17991, -6.68509], [73.20573, -5.20727], [70.1848, -6.37445]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q1585511", + nameEn: "Salomon Atoll", + country: "GB", + groups: ["IO", "BOTS", "014", "202", "002", "UN"], + level: "subterritory" + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[72.09518, -5.61768], [73.20573, -5.20727], [72.12587, -4.02588], [72.09518, -5.61768]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q1681727", + nameEn: "Saint-Paul and Amsterdam", + country: "FR", + groups: ["TF", "Q1451600", "014", "202", "002", "UN"], + level: "subterritory" + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[76.31747, -42.16264], [80.15867, -36.04977], [71.22311, -38.75287], [76.31747, -42.16264]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q1901211", + nameEn: "East Malaysia", + country: "MY", + groups: ["Q36117", "035", "142", "UN"], + driveSide: "left", + callingCodes: ["60"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[110.90339, 7.52694], [109.82788, 2.86812], [109.62558, 1.99182], [109.53794, 1.91771], [109.57923, 1.80624], [109.66397, 1.79972], [109.66397, 1.60425], [110.35354, 0.98869], [110.49182, 0.88088], [110.62374, 0.873], [111.22979, 1.08326], [111.55434, 0.97864], [111.82846, 0.99349], [111.94553, 1.12016], [112.15679, 1.17004], [112.2127, 1.44135], [112.48648, 1.56516], [113.021, 1.57819], [113.01448, 1.42832], [113.64677, 1.23933], [114.03788, 1.44787], [114.57892, 1.5], [114.80706, 1.92351], [114.80706, 2.21665], [115.1721, 2.49671], [115.11343, 2.82879], [115.53713, 3.14776], [115.58276, 3.93499], [115.90217, 4.37708], [117.25801, 4.35108], [117.47313, 4.18857], [117.67641, 4.16535], [118.06469, 4.16638], [118.93936, 4.09009], [119.52945, 5.35672], [117.98544, 6.27477], [117.93857, 6.89845], [117.17735, 7.52841], [116.79524, 7.43869], [115.02521, 5.35005], [115.16236, 5.01011], [115.15092, 4.87604], [115.20737, 4.8256], [115.27819, 4.63661], [115.2851, 4.42295], [115.36346, 4.33563], [115.31275, 4.30806], [115.09978, 4.39123], [115.07737, 4.53418], [115.04064, 4.63706], [115.02278, 4.74137], [115.02955, 4.82087], [115.05038, 4.90275], [114.99417, 4.88201], [114.96982, 4.81146], [114.88841, 4.81905], [114.8266, 4.75062], [114.77303, 4.72871], [114.83189, 4.42387], [114.88039, 4.4257], [114.78539, 4.12205], [114.64211, 4.00694], [114.49922, 4.13108], [114.4416, 4.27588], [114.32176, 4.2552], [114.32176, 4.34942], [114.26876, 4.49878], [114.15813, 4.57], [114.07448, 4.58441], [114.10166, 4.76112], [110.90339, 7.52694]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q1973345", + nameEn: "Peninsular Malaysia", + country: "MY", + groups: ["035", "142", "UN"], + driveSide: "left", + callingCodes: ["60"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[102.46318, 7.22462], [102.09086, 6.23546], [102.08127, 6.22679], [102.07732, 6.193], [102.09182, 6.14161], [102.01835, 6.05407], [101.99209, 6.04075], [101.97114, 6.01992], [101.9714, 6.00575], [101.94712, 5.98421], [101.92819, 5.85511], [101.91776, 5.84269], [101.89188, 5.8386], [101.80144, 5.74505], [101.75074, 5.79091], [101.69773, 5.75881], [101.58019, 5.93534], [101.25524, 5.78633], [101.25755, 5.71065], [101.14062, 5.61613], [100.98815, 5.79464], [101.02708, 5.91013], [101.087, 5.9193], [101.12388, 6.11411], [101.06165, 6.14161], [101.12618, 6.19431], [101.10313, 6.25617], [100.85884, 6.24929], [100.81045, 6.45086], [100.74822, 6.46231], [100.74361, 6.50811], [100.66986, 6.45086], [100.43027, 6.52389], [100.42351, 6.51762], [100.41791, 6.5189], [100.41152, 6.52299], [100.35413, 6.54932], [100.31929, 6.65413], [100.32607, 6.65933], [100.32671, 6.66526], [100.31884, 6.66423], [100.31618, 6.66781], [100.30828, 6.66462], [100.29651, 6.68439], [100.19511, 6.72559], [100.12, 6.42105], [100.0756, 6.4045], [99.91873, 6.50233], [99.50117, 6.44501], [99.31854, 5.99868], [99.75778, 3.86466], [103.03657, 1.30383], [103.56591, 1.19719], [103.62738, 1.35255], [103.67468, 1.43166], [103.7219, 1.46108], [103.74161, 1.4502], [103.76395, 1.45183], [103.81181, 1.47953], [103.86383, 1.46288], [103.89565, 1.42841], [103.93384, 1.42926], [104.00131, 1.42405], [104.02277, 1.4438], [104.04622, 1.44691], [104.07348, 1.43322], [104.08871, 1.42015], [104.09162, 1.39694], [104.08072, 1.35998], [104.12282, 1.27714], [104.34728, 1.33529], [104.56723, 1.44271], [105.01437, 3.24936], [102.46318, 7.22462]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q2093907", + nameEn: "Three Kings Islands", + country: "NZ", + groups: ["Q851132", "053", "009", "UN"], + driveSide: "left" + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[174.17679, -32.62487], [170.93268, -32.97889], [171.97383, -34.64644], [174.17679, -32.62487]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q2298216", + nameEn: "Solander Islands", + country: "NZ", + groups: ["Q851132", "053", "009", "UN"], + driveSide: "left" + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[167.39068, -46.49187], [166.5534, -46.39484], [166.84561, -46.84889], [167.39068, -46.49187]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q2872203", + nameEn: "Mainland Australia", + country: "AU", + groups: ["053", "009", "UN"], + level: "subcountryGroup", + driveSide: "left", + callingCodes: ["61"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[88.16419, -23.49578], [123.64533, -39.13605], [159.74028, -39.1978], [159.76765, -29.76946], [154.02855, -24.43238], [152.93188, -20.92631], [147.69992, -17.5933], [145.2855, -9.62524], [143.87386, -9.02382], [143.29772, -9.33993], [142.48658, -9.36754], [142.19246, -9.15378], [141.88934, -9.36111], [141.01842, -9.35091], [135.49042, -9.2276], [127.55165, -9.05052], [125.29076, -12.33139], [88.16419, -23.49578]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q2914565", + nameEn: "Autonomous Regions of Portugal", + country: "PT", + level: "subcountryGroup" + }, + geometry: null + }, { + type: "Feature", + properties: { + wikidata: "Q2915956", + nameEn: "Mainland Portugal", + country: "PT", + groups: ["Q12837", "EU", "039", "150", "UN"], + level: "subcountryGroup", + callingCodes: ["351"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-10.39881, 36.12218], [-7.37282, 36.96896], [-7.39769, 37.16868], [-7.41133, 37.20314], [-7.41854, 37.23813], [-7.43227, 37.25152], [-7.43974, 37.38913], [-7.46878, 37.47127], [-7.51759, 37.56119], [-7.41981, 37.75729], [-7.33441, 37.81193], [-7.27314, 37.90145], [-7.24544, 37.98884], [-7.12648, 38.00296], [-7.10366, 38.04404], [-7.05966, 38.01966], [-7.00375, 38.01914], [-6.93418, 38.21454], [-7.09389, 38.17227], [-7.15581, 38.27597], [-7.32529, 38.44336], [-7.265, 38.61674], [-7.26174, 38.72107], [-7.03848, 38.87221], [-7.051, 38.907], [-6.95211, 39.0243], [-6.97004, 39.07619], [-7.04011, 39.11919], [-7.10692, 39.10275], [-7.14929, 39.11287], [-7.12811, 39.17101], [-7.23566, 39.20132], [-7.23403, 39.27579], [-7.3149, 39.34857], [-7.2927, 39.45847], [-7.49477, 39.58794], [-7.54121, 39.66717], [-7.33507, 39.64569], [-7.24707, 39.66576], [-7.01613, 39.66877], [-6.97492, 39.81488], [-6.91463, 39.86618], [-6.86737, 40.01986], [-6.94233, 40.10716], [-7.00589, 40.12087], [-7.02544, 40.18564], [-7.00426, 40.23169], [-6.86085, 40.26776], [-6.86085, 40.2976], [-6.80218, 40.33239], [-6.78426, 40.36468], [-6.84618, 40.42177], [-6.84944, 40.46394], [-6.7973, 40.51723], [-6.80218, 40.55067], [-6.84292, 40.56801], [-6.79567, 40.65955], [-6.82826, 40.74603], [-6.82337, 40.84472], [-6.79892, 40.84842], [-6.80707, 40.88047], [-6.84292, 40.89771], [-6.8527, 40.93958], [-6.9357, 41.02888], [-6.913, 41.03922], [-6.88843, 41.03027], [-6.84781, 41.02692], [-6.80942, 41.03629], [-6.79241, 41.05397], [-6.75655, 41.10187], [-6.77319, 41.13049], [-6.69711, 41.1858], [-6.68286, 41.21641], [-6.65046, 41.24725], [-6.55937, 41.24417], [-6.38551, 41.35274], [-6.38553, 41.38655], [-6.3306, 41.37677], [-6.26777, 41.48796], [-6.19128, 41.57638], [-6.29863, 41.66432], [-6.44204, 41.68258], [-6.49907, 41.65823], [-6.54633, 41.68623], [-6.56426, 41.74219], [-6.51374, 41.8758], [-6.56752, 41.88429], [-6.5447, 41.94371], [-6.58544, 41.96674], [-6.61967, 41.94008], [-6.75004, 41.94129], [-6.76959, 41.98734], [-6.81196, 41.99097], [-6.82174, 41.94493], [-6.94396, 41.94403], [-6.95537, 41.96553], [-6.98144, 41.9728], [-7.01078, 41.94977], [-7.07596, 41.94977], [-7.08574, 41.97401], [-7.14115, 41.98855], [-7.18549, 41.97515], [-7.18677, 41.88793], [-7.32366, 41.8406], [-7.37092, 41.85031], [-7.42864, 41.80589], [-7.42854, 41.83262], [-7.44759, 41.84451], [-7.45566, 41.86488], [-7.49803, 41.87095], [-7.52737, 41.83939], [-7.62188, 41.83089], [-7.58603, 41.87944], [-7.65774, 41.88308], [-7.69848, 41.90977], [-7.84188, 41.88065], [-7.88055, 41.84571], [-7.88751, 41.92553], [-7.90707, 41.92432], [-7.92336, 41.8758], [-7.9804, 41.87337], [-8.01136, 41.83453], [-8.0961, 41.81024], [-8.16455, 41.81753], [-8.16944, 41.87944], [-8.19551, 41.87459], [-8.2185, 41.91237], [-8.16232, 41.9828], [-8.08796, 42.01398], [-8.08847, 42.05767], [-8.11729, 42.08537], [-8.18178, 42.06436], [-8.19406, 42.12141], [-8.18947, 42.13853], [-8.1986, 42.15402], [-8.22406, 42.1328], [-8.24681, 42.13993], [-8.2732, 42.12396], [-8.29809, 42.106], [-8.32161, 42.10218], [-8.33912, 42.08358], [-8.36353, 42.09065], [-8.38323, 42.07683], [-8.40143, 42.08052], [-8.42512, 42.07199], [-8.44123, 42.08218], [-8.48185, 42.0811], [-8.52837, 42.07658], [-8.5252, 42.06264], [-8.54563, 42.0537], [-8.58086, 42.05147], [-8.59493, 42.05708], [-8.63791, 42.04691], [-8.64626, 42.03668], [-8.65832, 42.02972], [-8.6681, 41.99703], [-8.69071, 41.98862], [-8.7478, 41.96282], [-8.74606, 41.9469], [-8.75712, 41.92833], [-8.81794, 41.90375], [-8.87157, 41.86488], [-11.19304, 41.83075], [-10.39881, 36.12218]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q3311985", + nameEn: "Guernsey", + country: "GB", + groups: ["GG", "830", "Q185086", "154", "150", "UN"], + level: "subterritory", + driveSide: "left", + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["44 01481"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-2.49556, 49.79012], [-3.28154, 49.57329], [-2.65349, 49.15373], [-2.36485, 49.48223], [-2.49556, 49.79012]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q3320166", + nameEn: "Outermost Regions of the EU", + aliases: ["OMR"], + level: "subunion" + }, + geometry: null + }, { + type: "Feature", + properties: { + wikidata: "Q3336843", + nameEn: "Countries of the United Kingdom", + country: "GB", + level: "subcountryGroup" + }, + geometry: null + }, { + type: "Feature", + properties: { + wikidata: "Q6736667", + nameEn: "Mainland India", + country: "IN", + groups: ["034", "142", "UN"], + driveSide: "left", + callingCodes: ["91"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[89.08044, 21.41871], [89.07114, 22.15335], [88.9367, 22.58527], [88.94614, 22.66941], [88.9151, 22.75228], [88.96713, 22.83346], [88.87063, 22.95235], [88.88327, 23.03885], [88.86377, 23.08759], [88.99148, 23.21134], [88.71133, 23.2492], [88.79254, 23.46028], [88.79351, 23.50535], [88.74841, 23.47361], [88.56507, 23.64044], [88.58087, 23.87105], [88.66189, 23.87607], [88.73743, 23.91751], [88.6976, 24.14703], [88.74841, 24.1959], [88.68801, 24.31464], [88.50934, 24.32474], [88.12296, 24.51301], [88.08786, 24.63232], [88.00683, 24.66477], [88.15515, 24.85806], [88.14004, 24.93529], [88.21832, 24.96642], [88.27325, 24.88796], [88.33917, 24.86803], [88.46277, 25.07468], [88.44766, 25.20149], [88.94067, 25.18534], [89.00463, 25.26583], [89.01105, 25.30303], [88.85278, 25.34679], [88.81296, 25.51546], [88.677, 25.46959], [88.4559, 25.59227], [88.45103, 25.66245], [88.242, 25.80811], [88.13138, 25.78773], [88.08804, 25.91334], [88.16581, 26.0238], [88.1844, 26.14417], [88.34757, 26.22216], [88.35153, 26.29123], [88.51649, 26.35923], [88.48749, 26.45855], [88.36938, 26.48683], [88.35153, 26.45241], [88.33093, 26.48929], [88.41196, 26.63837], [88.4298, 26.54489], [88.62144, 26.46783], [88.69485, 26.38353], [88.67837, 26.26291], [88.78961, 26.31093], [88.85004, 26.23211], [89.05328, 26.2469], [88.91321, 26.37984], [88.92357, 26.40711], [88.95612, 26.4564], [89.08899, 26.38845], [89.15869, 26.13708], [89.35953, 26.0077], [89.53515, 26.00382], [89.57101, 25.9682], [89.63968, 26.22595], [89.70201, 26.15138], [89.73581, 26.15818], [89.77865, 26.08387], [89.77728, 26.04254], [89.86592, 25.93115], [89.80585, 25.82489], [89.84388, 25.70042], [89.86129, 25.61714], [89.81208, 25.37244], [89.84086, 25.31854], [89.83371, 25.29548], [89.87629, 25.28337], [89.90478, 25.31038], [90.1155, 25.22686], [90.40034, 25.1534], [90.65042, 25.17788], [90.87427, 25.15799], [91.25517, 25.20677], [91.63648, 25.12846], [92.0316, 25.1834], [92.33957, 25.07593], [92.39147, 25.01471], [92.49887, 24.88796], [92.38626, 24.86055], [92.25854, 24.9191], [92.15796, 24.54435], [92.11662, 24.38997], [91.96603, 24.3799], [91.89258, 24.14674], [91.82596, 24.22345], [91.76004, 24.23848], [91.73257, 24.14703], [91.65292, 24.22095], [91.63782, 24.1132], [91.55542, 24.08687], [91.37414, 24.10693], [91.35741, 23.99072], [91.29587, 24.0041], [91.22308, 23.89616], [91.25192, 23.83463], [91.15579, 23.6599], [91.28293, 23.37538], [91.36453, 23.06612], [91.40848, 23.07117], [91.4035, 23.27522], [91.46615, 23.2328], [91.54993, 23.01051], [91.61571, 22.93929], [91.7324, 23.00043], [91.81634, 23.08001], [91.76417, 23.26619], [91.84789, 23.42235], [91.95642, 23.47361], [91.95093, 23.73284], [92.04706, 23.64229], [92.15417, 23.73409], [92.26541, 23.70392], [92.38214, 23.28705], [92.37665, 22.9435], [92.5181, 22.71441], [92.60029, 22.1522], [92.56616, 22.13554], [92.60949, 21.97638], [92.67532, 22.03547], [92.70416, 22.16017], [92.86208, 22.05456], [92.89504, 21.95143], [92.93899, 22.02656], [92.99804, 21.98964], [92.99255, 22.05965], [93.04885, 22.20595], [93.15734, 22.18687], [93.14224, 22.24535], [93.19991, 22.25425], [93.18206, 22.43716], [93.13537, 22.45873], [93.11477, 22.54374], [93.134, 22.59573], [93.09417, 22.69459], [93.134, 22.92498], [93.12988, 23.05772], [93.2878, 23.00464], [93.38478, 23.13698], [93.36862, 23.35426], [93.38781, 23.36139], [93.39981, 23.38828], [93.38805, 23.4728], [93.43475, 23.68299], [93.3908, 23.7622], [93.3908, 23.92925], [93.36059, 23.93176], [93.32351, 24.04468], [93.34735, 24.10151], [93.41415, 24.07854], [93.46633, 23.97067], [93.50616, 23.94432], [93.62871, 24.00922], [93.75952, 24.0003], [93.80279, 23.92549], [93.92089, 23.95812], [94.14081, 23.83333], [94.30215, 24.23752], [94.32362, 24.27692], [94.45279, 24.56656], [94.50729, 24.59281], [94.5526, 24.70764], [94.60204, 24.70889], [94.73937, 25.00545], [94.74212, 25.13606], [94.57458, 25.20318], [94.68032, 25.47003], [94.80117, 25.49359], [95.18556, 26.07338], [95.11428, 26.1019], [95.12801, 26.38397], [95.05798, 26.45408], [95.23513, 26.68499], [95.30339, 26.65372], [95.437, 26.7083], [95.81603, 27.01335], [95.93002, 27.04149], [96.04949, 27.19428], [96.15591, 27.24572], [96.40779, 27.29818], [96.55761, 27.29928], [96.73888, 27.36638], [96.88445, 27.25046], [96.85287, 27.2065], [96.89132, 27.17474], [97.14675, 27.09041], [97.17422, 27.14052], [96.91431, 27.45752], [96.90112, 27.62149], [97.29919, 27.92233], [97.35824, 27.87256], [97.38845, 28.01329], [97.35412, 28.06663], [97.31292, 28.06784], [97.34547, 28.21385], [97.1289, 28.3619], [96.98882, 28.32564], [96.88445, 28.39452], [96.85561, 28.4875], [96.6455, 28.61657], [96.48895, 28.42955], [96.40929, 28.51526], [96.61391, 28.72742], [96.3626, 29.10607], [96.20467, 29.02325], [96.18682, 29.11087], [96.31316, 29.18643], [96.05361, 29.38167], [95.84899, 29.31464], [95.75149, 29.32063], [95.72086, 29.20797], [95.50842, 29.13487], [95.41091, 29.13007], [95.3038, 29.13847], [95.26122, 29.07727], [95.2214, 29.10727], [95.11291, 29.09527], [95.0978, 29.14446], [94.81353, 29.17804], [94.69318, 29.31739], [94.2752, 29.11687], [94.35897, 29.01965], [93.72797, 28.68821], [93.44621, 28.67189], [93.18069, 28.50319], [93.14635, 28.37035], [92.93075, 28.25671], [92.67486, 28.15018], [92.65472, 28.07632], [92.73025, 28.05814], [92.7275, 27.98662], [92.42538, 27.80092], [92.32101, 27.79363], [92.27432, 27.89077], [91.87057, 27.7195], [91.84722, 27.76325], [91.6469, 27.76358], [91.55819, 27.6144], [91.65007, 27.48287], [92.01132, 27.47352], [92.12019, 27.27829], [92.04702, 27.26861], [92.03457, 27.07334], [92.11863, 26.893], [92.05523, 26.8692], [91.83181, 26.87318], [91.50067, 26.79223], [90.67715, 26.77215], [90.48504, 26.8594], [90.39271, 26.90704], [90.30402, 26.85098], [90.04535, 26.72422], [89.86124, 26.73307], [89.63369, 26.74402], [89.42349, 26.83727], [89.3901, 26.84225], [89.38319, 26.85963], [89.37913, 26.86224], [89.1926, 26.81329], [89.12825, 26.81661], [89.09554, 26.89089], [88.95807, 26.92668], [88.92301, 26.99286], [88.8714, 26.97488], [88.86984, 27.10937], [88.74219, 27.144], [88.91901, 27.32483], [88.82981, 27.38814], [88.77517, 27.45415], [88.88091, 27.85192], [88.83559, 28.01936], [88.63235, 28.12356], [88.54858, 28.06057], [88.25332, 27.9478], [88.1278, 27.95417], [88.13378, 27.88015], [88.1973, 27.85067], [88.19107, 27.79285], [88.04008, 27.49223], [88.07277, 27.43007], [88.01646, 27.21612], [88.01587, 27.21388], [87.9887, 27.11045], [88.11719, 26.98758], [88.13422, 26.98705], [88.12302, 26.95324], [88.19107, 26.75516], [88.1659, 26.68177], [88.16452, 26.64111], [88.09963, 26.54195], [88.09414, 26.43732], [88.00895, 26.36029], [87.90115, 26.44923], [87.89085, 26.48565], [87.84193, 26.43663], [87.7918, 26.46737], [87.76004, 26.40711], [87.67893, 26.43501], [87.66803, 26.40294], [87.59175, 26.38342], [87.55274, 26.40596], [87.51571, 26.43106], [87.46566, 26.44058], [87.37314, 26.40815], [87.34568, 26.34787], [87.26568, 26.37294], [87.26587, 26.40592], [87.24682, 26.4143], [87.18863, 26.40558], [87.14751, 26.40542], [87.09147, 26.45039], [87.0707, 26.58571], [87.04691, 26.58685], [87.01559, 26.53228], [86.95912, 26.52076], [86.94543, 26.52076], [86.82898, 26.43919], [86.76797, 26.45892], [86.74025, 26.42386], [86.69124, 26.45169], [86.62686, 26.46891], [86.61313, 26.48658], [86.57073, 26.49825], [86.54258, 26.53819], [86.49726, 26.54218], [86.31564, 26.61925], [86.26235, 26.61886], [86.22513, 26.58863], [86.13596, 26.60651], [86.02729, 26.66756], [85.8492, 26.56667], [85.85126, 26.60866], [85.83126, 26.61134], [85.76907, 26.63076], [85.72315, 26.67471], [85.73483, 26.79613], [85.66239, 26.84822], [85.61621, 26.86721], [85.59461, 26.85161], [85.5757, 26.85955], [85.56471, 26.84133], [85.47752, 26.79292], [85.34302, 26.74954], [85.21159, 26.75933], [85.18046, 26.80519], [85.19291, 26.86909], [85.15883, 26.86966], [85.02635, 26.85381], [85.05592, 26.88991], [85.00536, 26.89523], [84.97186, 26.9149], [84.96687, 26.95599], [84.85754, 26.98984], [84.82913, 27.01989], [84.793, 26.9968], [84.64496, 27.04669], [84.69166, 27.21294], [84.62161, 27.33885], [84.29315, 27.39], [84.25735, 27.44941], [84.21376, 27.45218], [84.10791, 27.52399], [84.02229, 27.43836], [83.93306, 27.44939], [83.86182, 27.4241], [83.85595, 27.35797], [83.61288, 27.47013], [83.39495, 27.4798], [83.38872, 27.39276], [83.35136, 27.33885], [83.29999, 27.32778], [83.2673, 27.36235], [83.27197, 27.38309], [83.19413, 27.45632], [82.94938, 27.46036], [82.93261, 27.50328], [82.74119, 27.49838], [82.70378, 27.72122], [82.46405, 27.6716], [82.06554, 27.92222], [81.97214, 27.93322], [81.91223, 27.84995], [81.47867, 28.08303], [81.48179, 28.12148], [81.38683, 28.17638], [81.32923, 28.13521], [81.19847, 28.36284], [81.03471, 28.40054], [80.55142, 28.69182], [80.50575, 28.6706], [80.52443, 28.54897], [80.44504, 28.63098], [80.37188, 28.63371], [80.12125, 28.82346], [80.06957, 28.82763], [80.05743, 28.91479], [80.18085, 29.13649], [80.23178, 29.11626], [80.26602, 29.13938], [80.24112, 29.21414], [80.28626, 29.20327], [80.31428, 29.30784], [80.24322, 29.44299], [80.37939, 29.57098], [80.41858, 29.63581], [80.38428, 29.68513], [80.36803, 29.73865], [80.41554, 29.79451], [80.43458, 29.80466], [80.48997, 29.79566], [80.56247, 29.86661], [80.57179, 29.91422], [80.60226, 29.95732], [80.67076, 29.95732], [80.8778, 30.13384], [80.86673, 30.17321], [80.91143, 30.22173], [80.92547, 30.17193], [81.03953, 30.20059], [80.83343, 30.32023], [80.54504, 30.44936], [80.20721, 30.58541], [79.93255, 30.88288], [79.59884, 30.93943], [79.30694, 31.17357], [79.14016, 31.43403], [79.01931, 31.42817], [78.89344, 31.30481], [78.77898, 31.31209], [78.71032, 31.50197], [78.84516, 31.60631], [78.69933, 31.78723], [78.78036, 31.99478], [78.74404, 32.00384], [78.68754, 32.10256], [78.49609, 32.2762], [78.4645, 32.45367], [78.38897, 32.53938], [78.73916, 32.69438], [78.7831, 32.46873], [78.96713, 32.33655], [78.99322, 32.37948], [79.0979, 32.38051], [79.13174, 32.47766], [79.26768, 32.53277], [79.46562, 32.69668], [79.14016, 33.02545], [79.15252, 33.17156], [78.73636, 33.56521], [78.67599, 33.66445], [78.77349, 33.73871], [78.73367, 34.01121], [78.65657, 34.03195], [78.66225, 34.08858], [78.91769, 34.15452], [78.99802, 34.3027], [79.05364, 34.32482], [78.74465, 34.45174], [78.56475, 34.50835], [78.54964, 34.57283], [78.27781, 34.61484], [78.18435, 34.7998], [78.22692, 34.88771], [78.00033, 35.23954], [78.03466, 35.3785], [78.11664, 35.48022], [77.80532, 35.52058], [77.70232, 35.46244], [77.44277, 35.46132], [76.96624, 35.5932], [76.84539, 35.67356], [76.77323, 35.66062], [76.75475, 35.52617], [76.85088, 35.39754], [76.93465, 35.39866], [77.11796, 35.05419], [76.99251, 34.93349], [76.87193, 34.96906], [76.74514, 34.92488], [76.74377, 34.84039], [76.67648, 34.76371], [76.47186, 34.78965], [76.15463, 34.6429], [76.04614, 34.67566], [75.75438, 34.51827], [75.38009, 34.55021], [75.01479, 34.64629], [74.6663, 34.703], [74.58083, 34.77386], [74.31239, 34.79626], [74.12897, 34.70073], [73.96423, 34.68244], [73.93401, 34.63386], [73.93951, 34.57169], [73.89419, 34.54568], [73.88732, 34.48911], [73.74999, 34.3781], [73.74862, 34.34183], [73.8475, 34.32935], [73.90517, 34.35317], [73.98208, 34.2522], [73.90677, 34.10504], [73.88732, 34.05105], [73.91341, 34.01235], [74.21554, 34.03853], [74.25262, 34.01577], [74.26086, 33.92237], [74.14001, 33.83002], [74.05898, 33.82089], [74.00891, 33.75437], [73.96423, 33.73071], [73.98968, 33.66155], [73.97367, 33.64061], [74.03576, 33.56718], [74.10115, 33.56392], [74.18121, 33.4745], [74.17983, 33.3679], [74.08782, 33.26232], [74.01366, 33.25199], [74.02144, 33.18908], [74.15374, 33.13477], [74.17571, 33.07495], [74.31854, 33.02891], [74.34875, 32.97823], [74.31227, 32.92795], [74.41467, 32.90563], [74.45312, 32.77755], [74.6289, 32.75561], [74.64675, 32.82604], [74.7113, 32.84219], [74.65345, 32.71225], [74.69542, 32.66792], [74.64424, 32.60985], [74.65251, 32.56416], [74.67431, 32.56676], [74.68362, 32.49298], [74.84725, 32.49075], [74.97634, 32.45367], [75.03265, 32.49538], [75.28259, 32.36556], [75.38046, 32.26836], [75.25649, 32.10187], [75.00793, 32.03786], [74.9269, 32.0658], [74.86236, 32.04485], [74.79919, 31.95983], [74.58907, 31.87824], [74.47771, 31.72227], [74.57498, 31.60382], [74.61517, 31.55698], [74.59319, 31.50197], [74.64713, 31.45605], [74.59773, 31.4136], [74.53223, 31.30321], [74.51629, 31.13829], [74.56023, 31.08303], [74.60281, 31.10419], [74.60006, 31.13711], [74.6852, 31.12771], [74.67971, 31.05479], [74.5616, 31.04153], [73.88993, 30.36305], [73.95736, 30.28466], [73.97225, 30.19829], [73.80299, 30.06969], [73.58665, 30.01848], [73.3962, 29.94707], [73.28094, 29.56646], [73.05886, 29.1878], [73.01337, 29.16422], [72.94272, 29.02487], [72.40402, 28.78283], [72.29495, 28.66367], [72.20329, 28.3869], [71.9244, 28.11555], [71.89921, 27.96035], [70.79054, 27.68423], [70.60927, 28.02178], [70.37307, 28.01208], [70.12502, 27.8057], [70.03136, 27.56627], [69.58519, 27.18109], [69.50904, 26.74892], [69.88555, 26.56836], [70.05584, 26.60398], [70.17532, 26.55362], [70.17532, 26.24118], [70.08193, 26.08094], [70.0985, 25.93238], [70.2687, 25.71156], [70.37444, 25.67443], [70.53649, 25.68928], [70.60378, 25.71898], [70.67382, 25.68186], [70.66695, 25.39314], [70.89148, 25.15064], [70.94002, 24.92843], [71.09405, 24.69017], [70.97594, 24.60904], [71.00341, 24.46038], [71.12838, 24.42662], [71.04461, 24.34657], [70.94985, 24.3791], [70.85784, 24.30903], [70.88393, 24.27398], [70.71502, 24.23517], [70.57906, 24.27774], [70.5667, 24.43787], [70.11712, 24.30915], [70.03428, 24.172], [69.73335, 24.17007], [69.59579, 24.29777], [69.29778, 24.28712], [69.19341, 24.25646], [69.07806, 24.29777], [68.97781, 24.26021], [68.90914, 24.33156], [68.7416, 24.31904], [68.74643, 23.97027], [68.39339, 23.96838], [68.20763, 23.85849], [68.11329, 23.53945], [76.59015, 5.591], [79.50447, 8.91876], [79.42124, 9.80115], [80.48418, 10.20786], [89.08044, 21.41871]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q9143535", + nameEn: "Akrotiri", + country: "GB", + groups: ["Q644636", "Q37362", "BOTS", "145", "142", "UN"], + level: "subterritory", + driveSide: "left", + callingCodes: ["357"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[32.86014, 34.70585], [32.82717, 34.70622], [32.79433, 34.67883], [32.76136, 34.68318], [32.75515, 34.64985], [32.74412, 34.43926], [33.26744, 34.49942], [33.0138, 34.64424], [32.96968, 34.64046], [32.96718, 34.63446], [32.95891, 34.62919], [32.95323, 34.64075], [32.95471, 34.64528], [32.94976, 34.65204], [32.94796, 34.6587], [32.95325, 34.66462], [32.97079, 34.66112], [32.97736, 34.65277], [32.99014, 34.65518], [32.98668, 34.67268], [32.99135, 34.68061], [32.95539, 34.68471], [32.94683, 34.67907], [32.94379, 34.67111], [32.93693, 34.67027], [32.93449, 34.66241], [32.92807, 34.66736], [32.93043, 34.67091], [32.91398, 34.67343], [32.9068, 34.66102], [32.86167, 34.68734], [32.86014, 34.70585]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q9206745", + nameEn: "Dhekelia", + country: "GB", + groups: ["Q644636", "Q37362", "BOTS", "145", "142", "UN"], + level: "subterritory", + driveSide: "left", + callingCodes: ["357"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[33.70575, 34.97947], [33.83531, 34.73974], [33.98684, 34.76642], [33.90075, 34.96623], [33.86432, 34.97592], [33.84811, 34.97075], [33.83505, 34.98108], [33.85621, 34.98956], [33.85891, 35.001], [33.85216, 35.00579], [33.84045, 35.00616], [33.82875, 35.01685], [33.83055, 35.02865], [33.81524, 35.04192], [33.8012, 35.04786], [33.82051, 35.0667], [33.8355, 35.05777], [33.85261, 35.0574], [33.88367, 35.07877], [33.89485, 35.06873], [33.90247, 35.07686], [33.91299, 35.07579], [33.91789, 35.08688], [33.89853, 35.11377], [33.88737, 35.11408], [33.88943, 35.12007], [33.88561, 35.12449], [33.87224, 35.12293], [33.87622, 35.10457], [33.87097, 35.09389], [33.87479, 35.08881], [33.8541, 35.07201], [33.84168, 35.06823], [33.82067, 35.07826], [33.78581, 35.05104], [33.76106, 35.04253], [33.73824, 35.05321], [33.71482, 35.03722], [33.70209, 35.04882], [33.7161, 35.07279], [33.70861, 35.07644], [33.69095, 35.06237], [33.68474, 35.06602], [33.67742, 35.05963], [33.67678, 35.03866], [33.69938, 35.03123], [33.69731, 35.01754], [33.71514, 35.00294], [33.70639, 34.99303], [33.70575, 34.97947]], [[33.77312, 34.9976], [33.77553, 34.99518], [33.78516, 34.99582], [33.79191, 34.98914], [33.78917, 34.98854], [33.78571, 34.98951], [33.78318, 34.98699], [33.78149, 34.98854], [33.77843, 34.988], [33.7778, 34.98981], [33.76738, 34.99188], [33.76605, 34.99543], [33.75682, 34.99916], [33.75994, 35.00113], [33.77312, 34.9976]], [[33.74144, 35.01053], [33.7343, 35.01178], [33.73781, 35.02181], [33.74265, 35.02329], [33.74983, 35.02274], [33.7492, 35.01319], [33.74144, 35.01053]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q16390686", + nameEn: "Peninsular Spain", + country: "ES", + groups: ["Q12837", "EU", "039", "150", "UN"], + callingCodes: ["34"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[3.75438, 42.33445], [3.17156, 42.43545], [3.11379, 42.43646], [3.10027, 42.42621], [3.08167, 42.42748], [3.03734, 42.47363], [2.96518, 42.46692], [2.94283, 42.48174], [2.92107, 42.4573], [2.88413, 42.45938], [2.86983, 42.46843], [2.85675, 42.45444], [2.84335, 42.45724], [2.77464, 42.41046], [2.75497, 42.42578], [2.72056, 42.42298], [2.65311, 42.38771], [2.6747, 42.33974], [2.57934, 42.35808], [2.55516, 42.35351], [2.54382, 42.33406], [2.48457, 42.33933], [2.43508, 42.37568], [2.43299, 42.39423], [2.38504, 42.39977], [2.25551, 42.43757], [2.20578, 42.41633], [2.16599, 42.42314], [2.12789, 42.41291], [2.11621, 42.38393], [2.06241, 42.35906], [2.00488, 42.35399], [1.96482, 42.37787], [1.9574, 42.42401], [1.94084, 42.43039], [1.94061, 42.43333], [1.94292, 42.44316], [1.93663, 42.45439], [1.88853, 42.4501], [1.83037, 42.48395], [1.76335, 42.48863], [1.72515, 42.50338], [1.70571, 42.48867], [1.66826, 42.50779], [1.65674, 42.47125], [1.58933, 42.46275], [1.57953, 42.44957], [1.55937, 42.45808], [1.55073, 42.43299], [1.5127, 42.42959], [1.44529, 42.43724], [1.43838, 42.47848], [1.41648, 42.48315], [1.46661, 42.50949], [1.44759, 42.54431], [1.41245, 42.53539], [1.4234, 42.55959], [1.44529, 42.56722], [1.42512, 42.58292], [1.44197, 42.60217], [1.35562, 42.71944], [1.15928, 42.71407], [1.0804, 42.78569], [0.98292, 42.78754], [0.96166, 42.80629], [0.93089, 42.79154], [0.711, 42.86372], [0.66121, 42.84021], [0.65421, 42.75872], [0.67873, 42.69458], [0.40214, 42.69779], [0.36251, 42.72282], [0.29407, 42.67431], [0.25336, 42.7174], [0.17569, 42.73424], [-0.02468, 42.68513], [-0.10519, 42.72761], [-0.16141, 42.79535], [-0.17939, 42.78974], [-0.3122, 42.84788], [-0.38833, 42.80132], [-0.41319, 42.80776], [-0.44334, 42.79939], [-0.50863, 42.82713], [-0.55497, 42.77846], [-0.67637, 42.88303], [-0.69837, 42.87945], [-0.72608, 42.89318], [-0.73422, 42.91228], [-0.72037, 42.92541], [-0.75478, 42.96916], [-0.81652, 42.95166], [-0.97133, 42.96239], [-1.00963, 42.99279], [-1.10333, 43.0059], [-1.22881, 43.05534], [-1.25244, 43.04164], [-1.30531, 43.06859], [-1.30052, 43.09581], [-1.27118, 43.11961], [-1.32209, 43.1127], [-1.34419, 43.09665], [-1.35272, 43.02658], [-1.44067, 43.047], [-1.47555, 43.08372], [-1.41562, 43.12815], [-1.3758, 43.24511], [-1.40942, 43.27272], [-1.45289, 43.27049], [-1.50992, 43.29481], [-1.55963, 43.28828], [-1.57674, 43.25269], [-1.61341, 43.25269], [-1.63052, 43.28591], [-1.62481, 43.30726], [-1.69407, 43.31378], [-1.73074, 43.29481], [-1.7397, 43.32979], [-1.75079, 43.3317], [-1.75334, 43.34107], [-1.77068, 43.34396], [-1.78714, 43.35476], [-1.78332, 43.36399], [-1.79319, 43.37497], [-1.77289, 43.38957], [-1.81005, 43.59738], [-10.14298, 44.17365], [-11.19304, 41.83075], [-8.87157, 41.86488], [-8.81794, 41.90375], [-8.75712, 41.92833], [-8.74606, 41.9469], [-8.7478, 41.96282], [-8.69071, 41.98862], [-8.6681, 41.99703], [-8.65832, 42.02972], [-8.64626, 42.03668], [-8.63791, 42.04691], [-8.59493, 42.05708], [-8.58086, 42.05147], [-8.54563, 42.0537], [-8.5252, 42.06264], [-8.52837, 42.07658], [-8.48185, 42.0811], [-8.44123, 42.08218], [-8.42512, 42.07199], [-8.40143, 42.08052], [-8.38323, 42.07683], [-8.36353, 42.09065], [-8.33912, 42.08358], [-8.32161, 42.10218], [-8.29809, 42.106], [-8.2732, 42.12396], [-8.24681, 42.13993], [-8.22406, 42.1328], [-8.1986, 42.15402], [-8.18947, 42.13853], [-8.19406, 42.12141], [-8.18178, 42.06436], [-8.11729, 42.08537], [-8.08847, 42.05767], [-8.08796, 42.01398], [-8.16232, 41.9828], [-8.2185, 41.91237], [-8.19551, 41.87459], [-8.16944, 41.87944], [-8.16455, 41.81753], [-8.0961, 41.81024], [-8.01136, 41.83453], [-7.9804, 41.87337], [-7.92336, 41.8758], [-7.90707, 41.92432], [-7.88751, 41.92553], [-7.88055, 41.84571], [-7.84188, 41.88065], [-7.69848, 41.90977], [-7.65774, 41.88308], [-7.58603, 41.87944], [-7.62188, 41.83089], [-7.52737, 41.83939], [-7.49803, 41.87095], [-7.45566, 41.86488], [-7.44759, 41.84451], [-7.42854, 41.83262], [-7.42864, 41.80589], [-7.37092, 41.85031], [-7.32366, 41.8406], [-7.18677, 41.88793], [-7.18549, 41.97515], [-7.14115, 41.98855], [-7.08574, 41.97401], [-7.07596, 41.94977], [-7.01078, 41.94977], [-6.98144, 41.9728], [-6.95537, 41.96553], [-6.94396, 41.94403], [-6.82174, 41.94493], [-6.81196, 41.99097], [-6.76959, 41.98734], [-6.75004, 41.94129], [-6.61967, 41.94008], [-6.58544, 41.96674], [-6.5447, 41.94371], [-6.56752, 41.88429], [-6.51374, 41.8758], [-6.56426, 41.74219], [-6.54633, 41.68623], [-6.49907, 41.65823], [-6.44204, 41.68258], [-6.29863, 41.66432], [-6.19128, 41.57638], [-6.26777, 41.48796], [-6.3306, 41.37677], [-6.38553, 41.38655], [-6.38551, 41.35274], [-6.55937, 41.24417], [-6.65046, 41.24725], [-6.68286, 41.21641], [-6.69711, 41.1858], [-6.77319, 41.13049], [-6.75655, 41.10187], [-6.79241, 41.05397], [-6.80942, 41.03629], [-6.84781, 41.02692], [-6.88843, 41.03027], [-6.913, 41.03922], [-6.9357, 41.02888], [-6.8527, 40.93958], [-6.84292, 40.89771], [-6.80707, 40.88047], [-6.79892, 40.84842], [-6.82337, 40.84472], [-6.82826, 40.74603], [-6.79567, 40.65955], [-6.84292, 40.56801], [-6.80218, 40.55067], [-6.7973, 40.51723], [-6.84944, 40.46394], [-6.84618, 40.42177], [-6.78426, 40.36468], [-6.80218, 40.33239], [-6.86085, 40.2976], [-6.86085, 40.26776], [-7.00426, 40.23169], [-7.02544, 40.18564], [-7.00589, 40.12087], [-6.94233, 40.10716], [-6.86737, 40.01986], [-6.91463, 39.86618], [-6.97492, 39.81488], [-7.01613, 39.66877], [-7.24707, 39.66576], [-7.33507, 39.64569], [-7.54121, 39.66717], [-7.49477, 39.58794], [-7.2927, 39.45847], [-7.3149, 39.34857], [-7.23403, 39.27579], [-7.23566, 39.20132], [-7.12811, 39.17101], [-7.14929, 39.11287], [-7.10692, 39.10275], [-7.04011, 39.11919], [-6.97004, 39.07619], [-6.95211, 39.0243], [-7.051, 38.907], [-7.03848, 38.87221], [-7.26174, 38.72107], [-7.265, 38.61674], [-7.32529, 38.44336], [-7.15581, 38.27597], [-7.09389, 38.17227], [-6.93418, 38.21454], [-7.00375, 38.01914], [-7.05966, 38.01966], [-7.10366, 38.04404], [-7.12648, 38.00296], [-7.24544, 37.98884], [-7.27314, 37.90145], [-7.33441, 37.81193], [-7.41981, 37.75729], [-7.51759, 37.56119], [-7.46878, 37.47127], [-7.43974, 37.38913], [-7.43227, 37.25152], [-7.41854, 37.23813], [-7.41133, 37.20314], [-7.39769, 37.16868], [-7.37282, 36.96896], [-7.2725, 35.73269], [-5.10878, 36.05227], [-2.27707, 35.35051], [3.75438, 42.33445]], [[-5.27801, 36.14942], [-5.34064, 36.03744], [-5.40526, 36.15488], [-5.34536, 36.15501], [-5.33822, 36.15272], [-5.27801, 36.14942]]], [[[1.99838, 42.44682], [2.01564, 42.45171], [1.99216, 42.46208], [1.98579, 42.47486], [1.99766, 42.4858], [1.98916, 42.49351], [1.98022, 42.49569], [1.97697, 42.48568], [1.97227, 42.48487], [1.97003, 42.48081], [1.96215, 42.47854], [1.95606, 42.45785], [1.96125, 42.45364], [1.98378, 42.44697], [1.99838, 42.44682]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q98059339", + nameEn: "Mainland Norway", + country: "NO", + groups: ["154", "150", "UN"], + callingCodes: ["47"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[10.40861, 58.38489], [10.64958, 58.89391], [11.08911, 58.98745], [11.15367, 59.07862], [11.34459, 59.11672], [11.4601, 58.99022], [11.45199, 58.89604], [11.65732, 58.90177], [11.8213, 59.24985], [11.69297, 59.59442], [11.92112, 59.69531], [11.87121, 59.86039], [12.15641, 59.8926], [12.36317, 59.99259], [12.52003, 60.13846], [12.59133, 60.50559], [12.2277, 61.02442], [12.69115, 61.06584], [12.86939, 61.35427], [12.57707, 61.56547], [12.40595, 61.57226], [12.14746, 61.7147], [12.29187, 62.25699], [12.07085, 62.6297], [12.19919, 63.00104], [11.98529, 63.27487], [12.19919, 63.47935], [12.14928, 63.59373], [12.74105, 64.02171], [13.23411, 64.09087], [13.98222, 64.00953], [14.16051, 64.18725], [14.11117, 64.46674], [13.64276, 64.58402], [14.50926, 65.31786], [14.53778, 66.12399], [15.05113, 66.15572], [15.49318, 66.28509], [15.37197, 66.48217], [16.35589, 67.06419], [16.39154, 67.21653], [16.09922, 67.4364], [16.12774, 67.52106], [16.38441, 67.52923], [16.7409, 67.91037], [17.30416, 68.11591], [17.90787, 67.96537], [18.13836, 68.20874], [18.1241, 68.53721], [18.39503, 68.58672], [18.63032, 68.50849], [18.97255, 68.52416], [19.93508, 68.35911], [20.22027, 68.48759], [19.95647, 68.55546], [20.22027, 68.67246], [20.33435, 68.80174], [20.28444, 68.93283], [20.0695, 69.04469], [20.55258, 69.06069], [20.72171, 69.11874], [21.05775, 69.0356], [21.11099, 69.10291], [20.98641, 69.18809], [21.00732, 69.22755], [21.27827, 69.31281], [21.63833, 69.27485], [22.27276, 68.89514], [22.38367, 68.71561], [22.53321, 68.74393], [23.13064, 68.64684], [23.68017, 68.70276], [23.781, 68.84514], [24.02299, 68.81601], [24.18432, 68.73936], [24.74898, 68.65143], [24.90023, 68.55579], [24.93048, 68.61102], [25.10189, 68.63307], [25.12206, 68.78684], [25.42455, 68.90328], [25.61613, 68.89602], [25.75729, 68.99383], [25.69679, 69.27039], [25.96904, 69.68397], [26.40261, 69.91377], [26.64461, 69.96565], [27.05802, 69.92069], [27.57226, 70.06215], [27.95542, 70.0965], [27.97558, 69.99671], [28.32849, 69.88605], [28.36883, 69.81658], [29.12697, 69.69193], [29.31664, 69.47994], [28.8629, 69.22395], [28.81248, 69.11997], [28.91738, 69.04774], [29.0444, 69.0119], [29.26623, 69.13794], [29.27631, 69.2811], [29.97205, 69.41623], [30.16363, 69.65244], [30.52662, 69.54699], [30.95011, 69.54699], [30.84095, 69.80584], [31.59909, 70.16571], [32.07813, 72.01005], [-11.60274, 67.73467], [7.28637, 57.35913], [10.40861, 58.38489]]]] + } + }, { + type: "Feature", + properties: { + wikidata: "Q98543636", + nameEn: "Mainland Ecuador", + country: "EC", + groups: ["005", "419", "019", "UN"], + callingCodes: ["593"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-84.52388, -3.36941], [-80.30602, -3.39149], [-80.20647, -3.431], [-80.24123, -3.46124], [-80.24586, -3.48677], [-80.23651, -3.48652], [-80.22629, -3.501], [-80.20535, -3.51667], [-80.21642, -3.5888], [-80.19848, -3.59249], [-80.18741, -3.63994], [-80.19926, -3.68894], [-80.13232, -3.90317], [-80.46386, -4.01342], [-80.4822, -4.05477], [-80.45023, -4.20938], [-80.32114, -4.21323], [-80.46386, -4.41516], [-80.39256, -4.48269], [-80.13945, -4.29786], [-79.79722, -4.47558], [-79.59402, -4.46848], [-79.26248, -4.95167], [-79.1162, -4.97774], [-79.01659, -5.01481], [-78.85149, -4.66795], [-78.68394, -4.60754], [-78.34362, -3.38633], [-78.24589, -3.39907], [-78.22642, -3.51113], [-78.14324, -3.47653], [-78.19369, -3.36431], [-77.94147, -3.05454], [-76.6324, -2.58397], [-76.05203, -2.12179], [-75.57429, -1.55961], [-75.3872, -0.9374], [-75.22862, -0.95588], [-75.22862, -0.60048], [-75.53615, -0.19213], [-75.60169, -0.18708], [-75.61997, -0.10012], [-75.40192, -0.17196], [-75.25764, -0.11943], [-75.82927, 0.09578], [-76.23441, 0.42294], [-76.41215, 0.38228], [-76.4094, 0.24015], [-76.89177, 0.24736], [-77.52001, 0.40782], [-77.49984, 0.64476], [-77.67815, 0.73863], [-77.66416, 0.81604], [-77.68613, 0.83029], [-77.7148, 0.85003], [-77.85677, 0.80197], [-78.42749, 1.15389], [-78.87137, 1.47457], [-82.12561, 4.00341], [-84.52388, -3.36941]]]] + } + }, { + type: "Feature", + properties: { + m49: "001", + wikidata: "Q2", + nameEn: "World", + aliases: ["Earth", "Planet"], + level: "world" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "002", + wikidata: "Q15", + nameEn: "Africa", + level: "region" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "003", + wikidata: "Q49", + nameEn: "North America", + level: "subregion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "005", + wikidata: "Q18", + nameEn: "South America", + level: "intermediateRegion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "009", + wikidata: "Q538", + nameEn: "Oceania", + level: "region" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "011", + wikidata: "Q4412", + nameEn: "Western Africa", + level: "intermediateRegion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "013", + wikidata: "Q27611", + nameEn: "Central America", + level: "intermediateRegion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "014", + wikidata: "Q27407", + nameEn: "Eastern Africa", + level: "intermediateRegion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "015", + wikidata: "Q27381", + nameEn: "Northern Africa", + level: "subregion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "017", + wikidata: "Q27433", + nameEn: "Middle Africa", + level: "intermediateRegion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "018", + wikidata: "Q27394", + nameEn: "Southern Africa", + level: "intermediateRegion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "019", + wikidata: "Q828", + nameEn: "Americas", + level: "region" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "021", + wikidata: "Q2017699", + nameEn: "Northern America", + level: "subregion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "029", + wikidata: "Q664609", + nameEn: "Caribbean", + level: "intermediateRegion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "030", + wikidata: "Q27231", + nameEn: "Eastern Asia", + level: "subregion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "034", + wikidata: "Q771405", + nameEn: "Southern Asia", + level: "subregion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "035", + wikidata: "Q11708", + nameEn: "South-eastern Asia", + level: "subregion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "039", + wikidata: "Q27449", + nameEn: "Southern Europe", + level: "subregion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "053", + wikidata: "Q45256", + nameEn: "Australia and New Zealand", + aliases: ["Australasia"], + level: "subregion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "054", + wikidata: "Q37394", + nameEn: "Melanesia", + level: "subregion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "057", + wikidata: "Q3359409", + nameEn: "Micronesia", + level: "subregion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "061", + wikidata: "Q35942", + nameEn: "Polynesia", + level: "subregion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "142", + wikidata: "Q48", + nameEn: "Asia", + level: "region" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "143", + wikidata: "Q27275", + nameEn: "Central Asia", + level: "subregion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "145", + wikidata: "Q27293", + nameEn: "Western Asia", + level: "subregion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "150", + wikidata: "Q46", + nameEn: "Europe", + level: "region" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "151", + wikidata: "Q27468", + nameEn: "Eastern Europe", + level: "subregion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "154", + wikidata: "Q27479", + nameEn: "Northern Europe", + level: "subregion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "155", + wikidata: "Q27496", + nameEn: "Western Europe", + level: "subregion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "202", + wikidata: "Q132959", + nameEn: "Sub-Saharan Africa", + level: "subregion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "419", + wikidata: "Q72829598", + nameEn: "Latin America and the Caribbean", + level: "subregion" + }, + geometry: null + }, { + type: "Feature", + properties: { + m49: "680", + wikidata: "Q3405693", + nameEn: "Sark", + country: "GB", + groups: ["GG", "830", "Q185086", "154", "150", "UN"], + level: "subterritory", + driveSide: "left", + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["44 01481"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-2.36485, 49.48223], [-2.65349, 49.15373], [-2.09454, 49.46288], [-2.36485, 49.48223]]]] + } + }, { + type: "Feature", + properties: { + m49: "830", + wikidata: "Q42314", + nameEn: "Channel Islands", + level: "intermediateRegion" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "AC", + iso1A3: "ASC", + wikidata: "Q46197", + nameEn: "Ascension Island", + aliases: ["SH-AC"], + country: "GB", + groups: ["SH", "BOTS", "011", "202", "002", "UN"], + isoStatus: "excRes", + driveSide: "left", + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["247"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-14.82771, -8.70814], [-13.33271, -8.07391], [-14.91926, -6.63386], [-14.82771, -8.70814]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "AD", + iso1A3: "AND", + iso1N3: "020", + wikidata: "Q228", + nameEn: "Andorra", + groups: ["Q12837", "039", "150", "UN"], + callingCodes: ["376"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[1.72515, 42.50338], [1.73683, 42.55492], [1.7858, 42.57698], [1.72588, 42.59098], [1.73452, 42.61515], [1.68267, 42.62533], [1.6625, 42.61982], [1.63485, 42.62957], [1.60085, 42.62703], [1.55418, 42.65669], [1.50867, 42.64483], [1.48043, 42.65203], [1.46718, 42.63296], [1.47986, 42.61346], [1.44197, 42.60217], [1.42512, 42.58292], [1.44529, 42.56722], [1.4234, 42.55959], [1.41245, 42.53539], [1.44759, 42.54431], [1.46661, 42.50949], [1.41648, 42.48315], [1.43838, 42.47848], [1.44529, 42.43724], [1.5127, 42.42959], [1.55073, 42.43299], [1.55937, 42.45808], [1.57953, 42.44957], [1.58933, 42.46275], [1.65674, 42.47125], [1.66826, 42.50779], [1.70571, 42.48867], [1.72515, 42.50338]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "AE", + iso1A3: "ARE", + iso1N3: "784", + wikidata: "Q878", + nameEn: "United Arab Emirates", + groups: ["145", "142", "UN"], + callingCodes: ["971"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[56.26534, 25.62825], [56.25341, 25.61443], [56.26636, 25.60643], [56.25365, 25.60211], [56.20473, 25.61119], [56.18363, 25.65508], [56.14826, 25.66351], [56.13579, 25.73524], [56.17416, 25.77239], [56.13963, 25.82765], [56.19334, 25.9795], [56.15498, 26.06828], [56.08666, 26.05038], [55.81777, 26.18798], [55.14145, 25.62624], [53.97892, 24.64436], [52.82259, 25.51697], [52.35509, 25.00368], [52.02277, 24.75635], [51.83108, 24.71675], [51.58834, 24.66608], [51.41644, 24.39615], [51.58871, 24.27256], [51.59617, 24.12041], [52.56622, 22.94341], [55.13599, 22.63334], [55.2137, 22.71065], [55.22634, 23.10378], [55.57358, 23.669], [55.48677, 23.94946], [55.73301, 24.05994], [55.8308, 24.01633], [56.01799, 24.07426], [55.95472, 24.2172], [55.83367, 24.20193], [55.77658, 24.23476], [55.76558, 24.23227], [55.75257, 24.23466], [55.75382, 24.2466], [55.75939, 24.26114], [55.76781, 24.26209], [55.79145, 24.27914], [55.80747, 24.31069], [55.83395, 24.32776], [55.83271, 24.41521], [55.76461, 24.5287], [55.83271, 24.68567], [55.83408, 24.77858], [55.81348, 24.80102], [55.81116, 24.9116], [55.85094, 24.96858], [55.90849, 24.96771], [55.96316, 25.00857], [56.05715, 24.95727], [56.05106, 24.87461], [55.97467, 24.89639], [55.97836, 24.87673], [56.03535, 24.81161], [56.06128, 24.74457], [56.13684, 24.73699], [56.20062, 24.78565], [56.20568, 24.85063], [56.30269, 24.88334], [56.34873, 24.93205], [56.3227, 24.97284], [56.86325, 25.03856], [56.82555, 25.7713], [56.26534, 25.62825]], [[56.26062, 25.33108], [56.3005, 25.31815], [56.3111, 25.30107], [56.35172, 25.30681], [56.34438, 25.26653], [56.27628, 25.23404], [56.24341, 25.22867], [56.20872, 25.24104], [56.20838, 25.25668], [56.24465, 25.27505], [56.25008, 25.28843], [56.23362, 25.31253], [56.26062, 25.33108]]], [[[56.28423, 25.26344], [56.29379, 25.2754], [56.28102, 25.28486], [56.2716, 25.27916], [56.27086, 25.26128], [56.28423, 25.26344]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "AF", + iso1A3: "AFG", + iso1N3: "004", + wikidata: "Q889", + nameEn: "Afghanistan", + groups: ["034", "142", "UN"], + callingCodes: ["93"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[70.61526, 38.34774], [70.60407, 38.28046], [70.54673, 38.24541], [70.4898, 38.12546], [70.17206, 37.93276], [70.1863, 37.84296], [70.27694, 37.81258], [70.28243, 37.66706], [70.15015, 37.52519], [69.95971, 37.5659], [69.93362, 37.61378], [69.84435, 37.60616], [69.80041, 37.5746], [69.51888, 37.5844], [69.44954, 37.4869], [69.36645, 37.40462], [69.45022, 37.23315], [69.39529, 37.16752], [69.25152, 37.09426], [69.03274, 37.25174], [68.96407, 37.32603], [68.88168, 37.33368], [68.91189, 37.26704], [68.80889, 37.32494], [68.81438, 37.23862], [68.6798, 37.27906], [68.61851, 37.19815], [68.41888, 37.13906], [68.41201, 37.10402], [68.29253, 37.10621], [68.27605, 37.00977], [68.18542, 37.02074], [68.02194, 36.91923], [67.87917, 37.0591], [67.7803, 37.08978], [67.78329, 37.1834], [67.51868, 37.26102], [67.2581, 37.17216], [67.2224, 37.24545], [67.13039, 37.27168], [67.08232, 37.35469], [66.95598, 37.40162], [66.64699, 37.32958], [66.55743, 37.35409], [66.30993, 37.32409], [65.72274, 37.55438], [65.64137, 37.45061], [65.64263, 37.34388], [65.51778, 37.23881], [64.97945, 37.21913], [64.61141, 36.6351], [64.62514, 36.44311], [64.57295, 36.34362], [64.43288, 36.24401], [64.05385, 36.10433], [63.98519, 36.03773], [63.56496, 35.95106], [63.53475, 35.90881], [63.29579, 35.85985], [63.12276, 35.86208], [63.10318, 35.81782], [63.23262, 35.67487], [63.10079, 35.63024], [63.12276, 35.53196], [63.0898, 35.43131], [62.90853, 35.37086], [62.74098, 35.25432], [62.62288, 35.22067], [62.48006, 35.28796], [62.29878, 35.13312], [62.29191, 35.25964], [62.15871, 35.33278], [62.05709, 35.43803], [61.97743, 35.4604], [61.77693, 35.41341], [61.58742, 35.43803], [61.27371, 35.61482], [61.18187, 35.30249], [61.0991, 35.27845], [61.12831, 35.09938], [61.06926, 34.82139], [61.00197, 34.70631], [60.99922, 34.63064], [60.72316, 34.52857], [60.91321, 34.30411], [60.66502, 34.31539], [60.50209, 34.13992], [60.5838, 33.80793], [60.5485, 33.73422], [60.57762, 33.59772], [60.69573, 33.56054], [60.91133, 33.55596], [60.88908, 33.50219], [60.56485, 33.12944], [60.86191, 32.22565], [60.84541, 31.49561], [61.70929, 31.37391], [61.80569, 31.16167], [61.80957, 31.12576], [61.83257, 31.0452], [61.8335, 30.97669], [61.78268, 30.92724], [61.80829, 30.84224], [60.87231, 29.86514], [62.47751, 29.40782], [63.5876, 29.50456], [64.12966, 29.39157], [64.19796, 29.50407], [64.62116, 29.58903], [65.04005, 29.53957], [66.24175, 29.85181], [66.36042, 29.9583], [66.23609, 30.06321], [66.34869, 30.404], [66.28413, 30.57001], [66.39194, 30.9408], [66.42645, 30.95309], [66.58175, 30.97532], [66.68166, 31.07597], [66.72561, 31.20526], [66.83273, 31.26867], [67.04147, 31.31561], [67.03323, 31.24519], [67.29964, 31.19586], [67.78854, 31.33203], [67.7748, 31.4188], [67.62374, 31.40473], [67.58323, 31.52772], [67.72056, 31.52304], [67.86887, 31.63536], [68.00071, 31.6564], [68.1655, 31.82691], [68.25614, 31.80357], [68.27605, 31.75863], [68.44222, 31.76446], [68.57475, 31.83158], [68.6956, 31.75687], [68.79997, 31.61665], [68.91078, 31.59687], [68.95995, 31.64822], [69.00939, 31.62249], [69.11514, 31.70782], [69.20577, 31.85957], [69.3225, 31.93186], [69.27032, 32.14141], [69.27932, 32.29119], [69.23599, 32.45946], [69.2868, 32.53938], [69.38155, 32.56601], [69.44747, 32.6678], [69.43649, 32.7302], [69.38018, 32.76601], [69.47082, 32.85834], [69.5436, 32.8768], [69.49854, 32.88843], [69.49004, 33.01509], [69.57656, 33.09911], [69.71526, 33.09911], [69.79766, 33.13247], [69.85259, 33.09451], [70.02563, 33.14282], [70.07369, 33.22557], [70.13686, 33.21064], [70.32775, 33.34496], [70.17062, 33.53535], [70.20141, 33.64387], [70.14785, 33.6553], [70.14236, 33.71701], [70.00503, 33.73528], [69.85671, 33.93719], [69.87307, 33.9689], [69.90203, 34.04194], [70.54336, 33.9463], [70.88119, 33.97933], [71.07345, 34.06242], [71.06933, 34.10564], [71.09307, 34.11961], [71.09453, 34.13524], [71.13078, 34.16503], [71.12815, 34.26619], [71.17662, 34.36769], [71.02401, 34.44835], [71.0089, 34.54568], [71.11602, 34.63047], [71.08718, 34.69034], [71.28356, 34.80882], [71.29472, 34.87728], [71.50329, 34.97328], [71.49917, 35.00478], [71.55273, 35.02615], [71.52938, 35.09023], [71.67495, 35.21262], [71.5541, 35.28776], [71.54294, 35.31037], [71.65435, 35.4479], [71.49917, 35.6267], [71.55273, 35.71483], [71.37969, 35.95865], [71.19505, 36.04134], [71.60491, 36.39429], [71.80267, 36.49924], [72.18135, 36.71838], [72.6323, 36.84601], [73.82685, 36.91421], [74.04856, 36.82648], [74.43389, 37.00977], [74.53739, 36.96224], [74.56453, 37.03023], [74.49981, 37.24518], [74.80605, 37.21565], [74.88887, 37.23275], [74.8294, 37.3435], [74.68383, 37.3948], [74.56161, 37.37734], [74.41055, 37.3948], [74.23339, 37.41116], [74.20308, 37.34208], [73.8564, 37.26158], [73.82552, 37.22659], [73.64974, 37.23643], [73.61129, 37.27469], [73.76647, 37.33913], [73.77197, 37.4417], [73.29633, 37.46495], [73.06884, 37.31729], [72.79693, 37.22222], [72.66381, 37.02014], [72.54095, 37.00007], [72.31676, 36.98115], [71.83229, 36.68084], [71.67083, 36.67346], [71.57195, 36.74943], [71.51502, 36.89128], [71.48481, 36.93218], [71.46923, 36.99925], [71.45578, 37.03094], [71.43097, 37.05855], [71.44127, 37.11856], [71.4494, 37.18137], [71.4555, 37.21418], [71.47386, 37.2269], [71.48339, 37.23937], [71.4824, 37.24921], [71.48536, 37.26017], [71.50674, 37.31502], [71.49821, 37.31975], [71.4862, 37.33405], [71.47685, 37.40281], [71.49612, 37.4279], [71.5256, 37.47971], [71.50616, 37.50733], [71.49693, 37.53527], [71.5065, 37.60912], [71.51972, 37.61945], [71.54186, 37.69691], [71.55234, 37.73209], [71.53053, 37.76534], [71.54324, 37.77104], [71.55752, 37.78677], [71.59255, 37.79956], [71.58843, 37.92425], [71.51565, 37.95349], [71.32871, 37.88564], [71.296, 37.93403], [71.2809, 37.91995], [71.24969, 37.93031], [71.27278, 37.96496], [71.27622, 37.99946], [71.28922, 38.01272], [71.29878, 38.04429], [71.36444, 38.15358], [71.37803, 38.25641], [71.33869, 38.27335], [71.33114, 38.30339], [71.21291, 38.32797], [71.1451, 38.40106], [71.10957, 38.40671], [71.10592, 38.42077], [71.09542, 38.42517], [71.0556, 38.40176], [71.03545, 38.44779], [70.98693, 38.48862], [70.92728, 38.43021], [70.88719, 38.46826], [70.84376, 38.44688], [70.82538, 38.45394], [70.81697, 38.44507], [70.80521, 38.44447], [70.79766, 38.44944], [70.78702, 38.45031], [70.78581, 38.45502], [70.77132, 38.45548], [70.75455, 38.4252], [70.72485, 38.4131], [70.69807, 38.41861], [70.67438, 38.40597], [70.6761, 38.39144], [70.69189, 38.37031], [70.64966, 38.34999], [70.61526, 38.34774]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "AG", + iso1A3: "ATG", + iso1N3: "028", + wikidata: "Q781", + nameEn: "Antigua and Barbuda", + groups: ["029", "003", "419", "019", "UN"], + driveSide: "left", + roadSpeedUnit: "mph", + callingCodes: ["1 268"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-61.66959, 18.6782], [-62.58307, 16.68909], [-62.1023, 16.97277], [-61.23098, 16.62484], [-61.66959, 18.6782]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "AI", + iso1A3: "AIA", + iso1N3: "660", + wikidata: "Q25228", + nameEn: "Anguilla", + country: "GB", + groups: ["BOTS", "029", "003", "419", "019", "UN"], + driveSide: "left", + roadSpeedUnit: "mph", + callingCodes: ["1 264"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-63.79029, 19.11219], [-63.35989, 18.06012], [-62.62718, 18.26185], [-63.79029, 19.11219]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "AL", + iso1A3: "ALB", + iso1N3: "008", + wikidata: "Q222", + nameEn: "Albania", + groups: ["039", "150", "UN"], + callingCodes: ["355"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[20.07761, 42.55582], [20.01834, 42.54622], [20.00842, 42.5109], [19.9324, 42.51699], [19.82333, 42.46581], [19.76549, 42.50237], [19.74731, 42.57422], [19.77375, 42.58517], [19.73244, 42.66299], [19.65972, 42.62774], [19.4836, 42.40831], [19.42352, 42.36546], [19.42, 42.33019], [19.28623, 42.17745], [19.40687, 42.10024], [19.37548, 42.06835], [19.36867, 42.02564], [19.37691, 41.96977], [19.34601, 41.95675], [19.33812, 41.90669], [19.37451, 41.8842], [19.37597, 41.84849], [19.26406, 41.74971], [19.0384, 40.35325], [19.95905, 39.82857], [19.97622, 39.78684], [19.92466, 39.69533], [19.98042, 39.6504], [20.00957, 39.69227], [20.05189, 39.69112], [20.12956, 39.65805], [20.15988, 39.652], [20.22376, 39.64532], [20.22707, 39.67459], [20.27412, 39.69884], [20.31961, 39.72799], [20.29152, 39.80421], [20.30804, 39.81563], [20.38572, 39.78516], [20.41475, 39.81437], [20.41546, 39.82832], [20.31135, 39.99438], [20.37911, 39.99058], [20.42373, 40.06777], [20.48487, 40.06271], [20.51297, 40.08168], [20.55593, 40.06524], [20.61081, 40.07866], [20.62566, 40.0897], [20.67162, 40.09433], [20.71789, 40.27739], [20.78234, 40.35803], [20.7906, 40.42726], [20.83688, 40.47882], [20.94925, 40.46625], [20.96908, 40.51526], [21.03932, 40.56299], [21.05833, 40.66586], [20.98134, 40.76046], [20.95752, 40.76982], [20.98396, 40.79109], [20.97887, 40.85475], [20.97693, 40.90103], [20.94305, 40.92399], [20.83671, 40.92752], [20.81567, 40.89662], [20.73504, 40.9081], [20.71634, 40.91781], [20.65558, 41.08009], [20.63454, 41.0889], [20.59832, 41.09066], [20.58546, 41.11179], [20.59715, 41.13644], [20.51068, 41.2323], [20.49432, 41.33679], [20.52119, 41.34381], [20.55976, 41.4087], [20.51301, 41.442], [20.49039, 41.49277], [20.45331, 41.51436], [20.45809, 41.5549], [20.52103, 41.56473], [20.55508, 41.58113], [20.51769, 41.65975], [20.52937, 41.69292], [20.51301, 41.72433], [20.53405, 41.78099], [20.57144, 41.7897], [20.55976, 41.87068], [20.59524, 41.8818], [20.57946, 41.91593], [20.63069, 41.94913], [20.59434, 42.03879], [20.55633, 42.08173], [20.56955, 42.12097], [20.48857, 42.25444], [20.3819, 42.3029], [20.34479, 42.32656], [20.24399, 42.32168], [20.21797, 42.41237], [20.17127, 42.50469], [20.07761, 42.55582]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "AM", + iso1A3: "ARM", + iso1N3: "051", + wikidata: "Q399", + nameEn: "Armenia", + groups: ["145", "142", "UN"], + callingCodes: ["374"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[45.0133, 41.29747], [44.93493, 41.25685], [44.81437, 41.30371], [44.80053, 41.25949], [44.81749, 41.23488], [44.84358, 41.23088], [44.89911, 41.21366], [44.87887, 41.20195], [44.82084, 41.21513], [44.72814, 41.20338], [44.61462, 41.24018], [44.59322, 41.1933], [44.46791, 41.18204], [44.34417, 41.2382], [44.34337, 41.20312], [44.32139, 41.2079], [44.18148, 41.24644], [44.16591, 41.19141], [43.84835, 41.16329], [43.74717, 41.1117], [43.67712, 41.13398], [43.4717, 41.12611], [43.44984, 41.0988], [43.47319, 41.02251], [43.58683, 40.98961], [43.67712, 40.93084], [43.67712, 40.84846], [43.74872, 40.7365], [43.7425, 40.66805], [43.63664, 40.54159], [43.54791, 40.47413], [43.60862, 40.43267], [43.59928, 40.34019], [43.71136, 40.16673], [43.65221, 40.14889], [43.65688, 40.11199], [43.92307, 40.01787], [44.1057, 40.03555], [44.1778, 40.02845], [44.26973, 40.04866], [44.46635, 39.97733], [44.61845, 39.8281], [44.75779, 39.7148], [44.88354, 39.74432], [44.92869, 39.72157], [45.06604, 39.79277], [45.18554, 39.67846], [45.17464, 39.58614], [45.21784, 39.58074], [45.23535, 39.61373], [45.30385, 39.61373], [45.29606, 39.57654], [45.46992, 39.49888], [45.70547, 39.60174], [45.80804, 39.56716], [45.83, 39.46487], [45.79225, 39.3695], [45.99774, 39.28931], [46.02303, 39.09978], [46.06973, 39.0744], [46.14785, 38.84206], [46.20601, 38.85262], [46.34059, 38.92076], [46.53497, 38.86548], [46.51805, 38.94982], [46.54296, 39.07078], [46.44022, 39.19636], [46.52584, 39.18912], [46.54141, 39.15895], [46.58032, 39.21204], [46.63481, 39.23013], [46.56476, 39.24942], [46.50093, 39.33736], [46.43244, 39.35181], [46.37795, 39.42039], [46.4013, 39.45405], [46.53051, 39.47809], [46.51027, 39.52373], [46.57721, 39.54414], [46.57098, 39.56694], [46.52117, 39.58734], [46.42465, 39.57534], [46.40286, 39.63651], [46.18493, 39.60533], [45.96543, 39.78859], [45.82533, 39.82925], [45.7833, 39.9475], [45.60895, 39.97733], [45.59806, 40.0131], [45.78642, 40.03218], [45.83779, 39.98925], [45.97944, 40.181], [45.95609, 40.27846], [45.65098, 40.37696], [45.42994, 40.53804], [45.45484, 40.57707], [45.35366, 40.65979], [45.4206, 40.7424], [45.55914, 40.78366], [45.60584, 40.87436], [45.40814, 40.97904], [45.44083, 41.01663], [45.39725, 41.02603], [45.35677, 40.99784], [45.28859, 41.03757], [45.26162, 41.0228], [45.25897, 41.0027], [45.1994, 41.04518], [45.16493, 41.05068], [45.1634, 41.08082], [45.1313, 41.09369], [45.12923, 41.06059], [45.06784, 41.05379], [45.08028, 41.10917], [45.19942, 41.13299], [45.1969, 41.168], [45.11811, 41.19967], [45.05201, 41.19211], [45.02932, 41.2101], [45.05497, 41.2464], [45.0133, 41.29747]], [[45.21324, 40.9817], [45.21219, 40.99001], [45.20518, 40.99348], [45.19312, 40.98998], [45.18382, 41.0066], [45.20625, 41.01484], [45.23487, 41.00226], [45.23095, 40.97828], [45.21324, 40.9817]], [[45.00864, 41.03411], [44.9903, 41.05657], [44.96031, 41.06345], [44.95383, 41.07553], [44.97169, 41.09176], [45.00864, 41.09407], [45.03406, 41.07931], [45.04517, 41.06653], [45.03792, 41.03938], [45.00864, 41.03411]]], [[[45.50279, 40.58424], [45.56071, 40.64765], [45.51825, 40.67382], [45.47927, 40.65023], [45.50279, 40.58424]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "AO", + iso1A3: "AGO", + iso1N3: "024", + wikidata: "Q916", + nameEn: "Angola", + groups: ["017", "202", "002", "UN"], + callingCodes: ["244"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[16.55507, -5.85631], [13.04371, -5.87078], [12.42245, -6.07585], [11.95767, -5.94705], [12.20376, -5.76338], [12.26557, -5.74031], [12.52318, -5.74353], [12.52301, -5.17481], [12.53599, -5.1618], [12.53586, -5.14658], [12.51589, -5.1332], [12.49815, -5.14058], [12.46297, -5.09408], [12.60251, -5.01715], [12.63465, -4.94632], [12.70868, -4.95505], [12.8733, -4.74346], [13.11195, -4.67745], [13.09648, -4.63739], [12.91489, -4.47907], [12.87096, -4.40315], [12.76844, -4.38709], [12.64835, -4.55937], [12.40964, -4.60609], [12.32324, -4.78415], [12.25587, -4.79437], [12.20901, -4.75642], [12.16068, -4.90089], [12.00924, -5.02627], [11.50888, -5.33417], [10.5065, -17.25284], [11.75063, -17.25013], [12.07076, -17.15165], [12.52111, -17.24495], [12.97145, -16.98567], [13.36212, -16.98048], [13.95896, -17.43141], [14.28743, -17.38814], [18.39229, -17.38927], [18.84226, -17.80375], [21.14283, -17.94318], [21.42741, -18.02787], [23.47474, -17.62877], [23.20038, -17.47563], [22.17217, -16.50269], [22.00323, -16.18028], [21.97988, -13.00148], [24.03339, -12.99091], [23.90937, -12.844], [24.06672, -12.29058], [23.98804, -12.13149], [24.02603, -11.15368], [24.00027, -10.89356], [23.86868, -11.02856], [23.45631, -10.946], [23.16602, -11.10577], [22.54205, -11.05784], [22.25951, -11.24911], [22.17954, -10.85884], [22.32604, -10.76291], [22.19039, -9.94628], [21.84856, -9.59871], [21.79824, -7.29628], [20.56263, -7.28566], [20.61689, -6.90876], [20.31846, -6.91953], [20.30218, -6.98955], [19.5469, -7.00195], [19.33698, -7.99743], [18.33635, -8.00126], [17.5828, -8.13784], [16.96282, -7.21787], [16.55507, -5.85631]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "AQ", + iso1A3: "ATA", + iso1N3: "010", + wikidata: "Q51", + nameEn: "Antarctica", + level: "region", + callingCodes: ["672"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[180, -60], [-180, -60], [-180, -90], [180, -90], [180, -60]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "AR", + iso1A3: "ARG", + iso1N3: "032", + wikidata: "Q414", + nameEn: "Argentina", + aliases: ["RA"], + groups: ["005", "419", "019", "UN"], + callingCodes: ["54"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-72.31343, -50.58411], [-72.33873, -51.59954], [-71.99889, -51.98018], [-69.97824, -52.00845], [-68.41683, -52.33516], [-68.60702, -52.65781], [-68.60733, -54.9125], [-68.01394, -54.8753], [-67.46182, -54.92205], [-67.11046, -54.94199], [-66.07313, -55.19618], [-63.67376, -55.11859], [-54.78916, -36.21945], [-57.83001, -34.69099], [-58.34425, -34.15035], [-58.44442, -33.84033], [-58.40475, -33.11777], [-58.1224, -32.98842], [-58.22362, -32.52416], [-58.10036, -32.25338], [-58.20252, -31.86966], [-58.00076, -31.65016], [-58.0023, -31.53084], [-58.07569, -31.44916], [-57.98127, -31.3872], [-57.9908, -31.34924], [-57.86729, -31.06352], [-57.89476, -30.95994], [-57.8024, -30.77193], [-57.89115, -30.49572], [-57.64859, -30.35095], [-57.61478, -30.25165], [-57.65132, -30.19229], [-57.09386, -29.74211], [-56.81251, -29.48154], [-56.62789, -29.18073], [-56.57295, -29.11357], [-56.54171, -29.11447], [-56.05265, -28.62651], [-56.00458, -28.60421], [-56.01729, -28.51223], [-55.65418, -28.18304], [-55.6262, -28.17124], [-55.33303, -27.94661], [-55.16872, -27.86224], [-55.1349, -27.89759], [-54.90805, -27.73149], [-54.90159, -27.63132], [-54.67657, -27.57214], [-54.50416, -27.48232], [-54.41888, -27.40882], [-54.19268, -27.30751], [-54.19062, -27.27639], [-54.15978, -27.2889], [-53.80144, -27.09844], [-53.73372, -26.6131], [-53.68269, -26.33359], [-53.64505, -26.28089], [-53.64186, -26.25976], [-53.64632, -26.24798], [-53.63881, -26.25075], [-53.63739, -26.2496], [-53.65237, -26.23289], [-53.65018, -26.19501], [-53.73968, -26.10012], [-53.73391, -26.07006], [-53.7264, -26.0664], [-53.73086, -26.05842], [-53.73511, -26.04211], [-53.83691, -25.94849], [-53.90831, -25.55513], [-54.52926, -25.62846], [-54.5502, -25.58915], [-54.59398, -25.59224], [-54.62063, -25.91213], [-54.60664, -25.9691], [-54.67359, -25.98607], [-54.69333, -26.37705], [-54.70732, -26.45099], [-54.80868, -26.55669], [-55.00584, -26.78754], [-55.06351, -26.80195], [-55.16948, -26.96068], [-55.25243, -26.93808], [-55.39611, -26.97679], [-55.62322, -27.1941], [-55.59094, -27.32444], [-55.74475, -27.44485], [-55.89195, -27.3467], [-56.18313, -27.29851], [-56.85337, -27.5165], [-58.04205, -27.2387], [-58.59549, -27.29973], [-58.65321, -27.14028], [-58.3198, -26.83443], [-58.1188, -26.16704], [-57.87176, -25.93604], [-57.57431, -25.47269], [-57.80821, -25.13863], [-58.25492, -24.92528], [-58.33055, -24.97099], [-59.33886, -24.49935], [-59.45482, -24.34787], [-60.03367, -24.00701], [-60.28163, -24.04436], [-60.99754, -23.80934], [-61.0782, -23.62932], [-61.9756, -23.0507], [-62.22768, -22.55807], [-62.51761, -22.37684], [-62.64455, -22.25091], [-62.8078, -22.12534], [-62.81124, -21.9987], [-63.66482, -21.99918], [-63.68113, -22.0544], [-63.70963, -21.99934], [-63.93287, -21.99934], [-64.22918, -22.55807], [-64.31489, -22.88824], [-64.35108, -22.73282], [-64.4176, -22.67692], [-64.58888, -22.25035], [-64.67174, -22.18957], [-64.90014, -22.12136], [-64.99524, -22.08255], [-65.47435, -22.08908], [-65.57743, -22.07675], [-65.58694, -22.09794], [-65.61166, -22.09504], [-65.7467, -22.10105], [-65.9261, -21.93335], [-66.04832, -21.9187], [-66.03836, -21.84829], [-66.24077, -21.77837], [-66.29714, -22.08741], [-66.7298, -22.23644], [-67.18382, -22.81525], [-66.99632, -22.99839], [-67.33563, -24.04237], [-68.24825, -24.42596], [-68.56909, -24.69831], [-68.38372, -25.08636], [-68.57622, -25.32505], [-68.38372, -26.15353], [-68.56909, -26.28146], [-68.59048, -26.49861], [-68.27677, -26.90626], [-68.43363, -27.08414], [-68.77586, -27.16029], [-69.22504, -27.95042], [-69.66709, -28.44055], [-69.80969, -29.07185], [-69.99507, -29.28351], [-69.8596, -30.26131], [-70.14479, -30.36595], [-70.55832, -31.51559], [-69.88099, -33.34489], [-69.87386, -34.13344], [-70.49416, -35.24145], [-70.38008, -36.02375], [-70.95047, -36.4321], [-71.24279, -37.20264], [-70.89532, -38.6923], [-71.37826, -38.91474], [-71.92726, -40.72714], [-71.74901, -42.11711], [-72.15541, -42.15941], [-72.14828, -42.85321], [-71.64206, -43.64774], [-71.81318, -44.38097], [-71.16436, -44.46244], [-71.26418, -44.75684], [-72.06985, -44.81756], [-71.35687, -45.22075], [-71.75614, -45.61611], [-71.68577, -46.55385], [-71.94152, -47.13595], [-72.50478, -47.80586], [-72.27662, -48.28727], [-72.54042, -48.52392], [-72.56894, -48.81116], [-73.09655, -49.14342], [-73.45156, -49.79461], [-73.55259, -49.92488], [-73.15765, -50.78337], [-72.31343, -50.58411]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "AS", + iso1A3: "ASM", + iso1N3: "016", + wikidata: "Q16641", + nameEn: "American Samoa", + aliases: ["US-AS"], + country: "US", + groups: ["Q1352230", "061", "009", "UN"], + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["1 684"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-171.39864, -10.21587], [-170.99605, -15.1275], [-166.32598, -15.26169], [-171.39864, -10.21587]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "AT", + iso1A3: "AUT", + iso1N3: "040", + wikidata: "Q40", + nameEn: "Austria", + groups: ["EU", "155", "150", "UN"], + callingCodes: ["43"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[15.34823, 48.98444], [15.28305, 48.98831], [15.26177, 48.95766], [15.16358, 48.94278], [15.15534, 48.99056], [14.99878, 49.01444], [14.97612, 48.96983], [14.98917, 48.90082], [14.95072, 48.79101], [14.98032, 48.77959], [14.9782, 48.7766], [14.98112, 48.77524], [14.9758, 48.76857], [14.95641, 48.75915], [14.94773, 48.76268], [14.81545, 48.7874], [14.80821, 48.77711], [14.80584, 48.73489], [14.72756, 48.69502], [14.71794, 48.59794], [14.66762, 48.58215], [14.60808, 48.62881], [14.56139, 48.60429], [14.4587, 48.64695], [14.43076, 48.58855], [14.33909, 48.55852], [14.20691, 48.5898], [14.09104, 48.5943], [14.01482, 48.63788], [14.06151, 48.66873], [13.84023, 48.76988], [13.82266, 48.75544], [13.81863, 48.73257], [13.79337, 48.71375], [13.81791, 48.69832], [13.81283, 48.68426], [13.81901, 48.6761], [13.82609, 48.62345], [13.80038, 48.59487], [13.80519, 48.58026], [13.76921, 48.55324], [13.7513, 48.5624], [13.74816, 48.53058], [13.72802, 48.51208], [13.66113, 48.53558], [13.65186, 48.55092], [13.62508, 48.55501], [13.59705, 48.57013], [13.57535, 48.55912], [13.51291, 48.59023], [13.50131, 48.58091], [13.50663, 48.57506], [13.46967, 48.55157], [13.45214, 48.56472], [13.43695, 48.55776], [13.45727, 48.51092], [13.42527, 48.45711], [13.43929, 48.43386], [13.40709, 48.37292], [13.30897, 48.31575], [13.26039, 48.29422], [13.18093, 48.29577], [13.126, 48.27867], [13.0851, 48.27711], [13.02083, 48.25689], [12.95306, 48.20629], [12.87126, 48.20318], [12.84475, 48.16556], [12.836, 48.1647], [12.8362, 48.15876], [12.82673, 48.15245], [12.80676, 48.14979], [12.78595, 48.12445], [12.7617, 48.12796], [12.74973, 48.10885], [12.76141, 48.07373], [12.8549, 48.01122], [12.87476, 47.96195], [12.91683, 47.95647], [12.9211, 47.95135], [12.91985, 47.94069], [12.92668, 47.93879], [12.93419, 47.94063], [12.93642, 47.94436], [12.93886, 47.94046], [12.94163, 47.92927], [13.00588, 47.84374], [12.98543, 47.82896], [12.96311, 47.79957], [12.93202, 47.77302], [12.94371, 47.76281], [12.9353, 47.74788], [12.91711, 47.74026], [12.90274, 47.72513], [12.91333, 47.7178], [12.92969, 47.71094], [12.98578, 47.7078], [13.01382, 47.72116], [13.07692, 47.68814], [13.09562, 47.63304], [13.06407, 47.60075], [13.06641, 47.58577], [13.04537, 47.58183], [13.05355, 47.56291], [13.03252, 47.53373], [13.04537, 47.49426], [12.9998, 47.46267], [12.98344, 47.48716], [12.9624, 47.47452], [12.85256, 47.52741], [12.84672, 47.54556], [12.80699, 47.54477], [12.77427, 47.58025], [12.82101, 47.61493], [12.76492, 47.64485], [12.77777, 47.66689], [12.7357, 47.6787], [12.6071, 47.6741], [12.57438, 47.63238], [12.53816, 47.63553], [12.50076, 47.62293], [12.44117, 47.6741], [12.43883, 47.6977], [12.37222, 47.68433], [12.336, 47.69534], [12.27991, 47.68827], [12.26004, 47.67725], [12.24017, 47.69534], [12.26238, 47.73544], [12.2542, 47.7433], [12.22571, 47.71776], [12.18303, 47.70065], [12.16217, 47.70105], [12.16769, 47.68167], [12.18347, 47.66663], [12.18507, 47.65984], [12.19895, 47.64085], [12.20801, 47.61082], [12.20398, 47.60667], [12.18568, 47.6049], [12.17737, 47.60121], [12.18145, 47.61019], [12.17824, 47.61506], [12.13734, 47.60639], [12.05788, 47.61742], [12.02282, 47.61033], [12.0088, 47.62451], [11.85572, 47.60166], [11.84052, 47.58354], [11.63934, 47.59202], [11.60681, 47.57881], [11.58811, 47.55515], [11.58578, 47.52281], [11.52618, 47.50939], [11.4362, 47.51413], [11.38128, 47.47465], [11.4175, 47.44621], [11.33804, 47.44937], [11.29597, 47.42566], [11.27844, 47.39956], [11.22002, 47.3964], [11.25157, 47.43277], [11.20482, 47.43198], [11.12536, 47.41222], [11.11835, 47.39719], [10.97111, 47.39561], [10.97111, 47.41617], [10.98513, 47.42882], [10.92437, 47.46991], [10.93839, 47.48018], [10.90918, 47.48571], [10.87061, 47.4786], [10.86945, 47.5015], [10.91268, 47.51334], [10.88814, 47.53701], [10.77596, 47.51729], [10.7596, 47.53228], [10.6965, 47.54253], [10.68832, 47.55752], [10.63456, 47.5591], [10.60337, 47.56755], [10.56912, 47.53584], [10.48849, 47.54057], [10.47329, 47.58552], [10.43473, 47.58394], [10.44992, 47.5524], [10.4324, 47.50111], [10.44291, 47.48453], [10.46278, 47.47901], [10.47446, 47.43318], [10.4359, 47.41183], [10.4324, 47.38494], [10.39851, 47.37623], [10.33424, 47.30813], [10.23257, 47.27088], [10.17531, 47.27167], [10.17648, 47.29149], [10.2147, 47.31014], [10.19998, 47.32832], [10.23757, 47.37609], [10.22774, 47.38904], [10.2127, 47.38019], [10.17648, 47.38889], [10.16362, 47.36674], [10.11805, 47.37228], [10.09819, 47.35724], [10.06897, 47.40709], [10.1052, 47.4316], [10.09001, 47.46005], [10.07131, 47.45531], [10.03859, 47.48927], [10.00003, 47.48216], [9.96029, 47.53899], [9.92407, 47.53111], [9.87733, 47.54688], [9.87499, 47.52953], [9.8189, 47.54688], [9.82591, 47.58158], [9.80254, 47.59419], [9.76748, 47.5934], [9.72736, 47.53457], [9.55125, 47.53629], [9.56312, 47.49495], [9.58208, 47.48344], [9.59482, 47.46305], [9.60205, 47.46165], [9.60484, 47.46358], [9.60841, 47.47178], [9.62158, 47.45858], [9.62475, 47.45685], [9.6423, 47.45599], [9.65728, 47.45383], [9.65863, 47.44847], [9.64483, 47.43842], [9.6446, 47.43233], [9.65043, 47.41937], [9.65136, 47.40504], [9.6629, 47.39591], [9.67334, 47.39191], [9.67445, 47.38429], [9.6711, 47.37824], [9.66243, 47.37136], [9.65427, 47.36824], [9.62476, 47.36639], [9.59978, 47.34671], [9.58513, 47.31334], [9.55857, 47.29919], [9.54773, 47.2809], [9.53116, 47.27029], [9.56766, 47.24281], [9.55176, 47.22585], [9.56981, 47.21926], [9.58264, 47.20673], [9.56539, 47.17124], [9.62623, 47.14685], [9.63395, 47.08443], [9.61216, 47.07732], [9.60717, 47.06091], [9.87935, 47.01337], [9.88266, 46.93343], [9.98058, 46.91434], [10.10715, 46.84296], [10.22675, 46.86942], [10.24128, 46.93147], [10.30031, 46.92093], [10.36933, 47.00212], [10.48376, 46.93891], [10.47197, 46.85698], [10.54783, 46.84505], [10.66405, 46.87614], [10.75753, 46.82258], [10.72974, 46.78972], [11.00764, 46.76896], [11.10618, 46.92966], [11.33355, 46.99862], [11.50739, 47.00644], [11.74789, 46.98484], [12.19254, 47.09331], [12.21781, 47.03996], [12.11675, 47.01241], [12.2006, 46.88854], [12.27591, 46.88651], [12.38708, 46.71529], [12.59992, 46.6595], [12.94445, 46.60401], [13.27627, 46.56059], [13.64088, 46.53438], [13.7148, 46.5222], [13.89837, 46.52331], [14.00422, 46.48474], [14.04002, 46.49117], [14.12097, 46.47724], [14.15989, 46.43327], [14.28326, 46.44315], [14.314, 46.43327], [14.42608, 46.44614], [14.45877, 46.41717], [14.52176, 46.42617], [14.56463, 46.37208], [14.5942, 46.43434], [14.66892, 46.44936], [14.72185, 46.49974], [14.81836, 46.51046], [14.83549, 46.56614], [14.86419, 46.59411], [14.87129, 46.61], [14.92283, 46.60848], [14.96002, 46.63459], [14.98024, 46.6009], [15.01451, 46.641], [15.14215, 46.66131], [15.23711, 46.63994], [15.41235, 46.65556], [15.45514, 46.63697], [15.46906, 46.61321], [15.54431, 46.6312], [15.55333, 46.64988], [15.54533, 46.66985], [15.59826, 46.68908], [15.62317, 46.67947], [15.63255, 46.68069], [15.6365, 46.6894], [15.6543, 46.69228], [15.6543, 46.70616], [15.67411, 46.70735], [15.69523, 46.69823], [15.72279, 46.69548], [15.73823, 46.70011], [15.76771, 46.69863], [15.78518, 46.70712], [15.8162, 46.71897], [15.87691, 46.7211], [15.94864, 46.68769], [15.98512, 46.68463], [15.99988, 46.67947], [16.04036, 46.6549], [16.04347, 46.68694], [16.02808, 46.71094], [15.99769, 46.7266], [15.98432, 46.74991], [15.99126, 46.78199], [15.99054, 46.82772], [16.05786, 46.83927], [16.10983, 46.867], [16.19904, 46.94134], [16.22403, 46.939], [16.27594, 46.9643], [16.28202, 47.00159], [16.51369, 47.00084], [16.43936, 47.03548], [16.52176, 47.05747], [16.46134, 47.09395], [16.52863, 47.13974], [16.44932, 47.14418], [16.46442, 47.16845], [16.4523, 47.18812], [16.42801, 47.18422], [16.41739, 47.20649], [16.43663, 47.21127], [16.44142, 47.25079], [16.47782, 47.25918], [16.45104, 47.41181], [16.49908, 47.39416], [16.52414, 47.41007], [16.57152, 47.40868], [16.6718, 47.46139], [16.64821, 47.50155], [16.71059, 47.52692], [16.64193, 47.63114], [16.58699, 47.61772], [16.4222, 47.66537], [16.55129, 47.72268], [16.53514, 47.73837], [16.54779, 47.75074], [16.61183, 47.76171], [16.65679, 47.74197], [16.72089, 47.73469], [16.7511, 47.67878], [16.82938, 47.68432], [16.86509, 47.72268], [16.87538, 47.68895], [17.08893, 47.70928], [17.05048, 47.79377], [17.07039, 47.81129], [17.00997, 47.86245], [17.08275, 47.87719], [17.11022, 47.92461], [17.09786, 47.97336], [17.16001, 48.00636], [17.07039, 48.0317], [17.09168, 48.09366], [17.05735, 48.14179], [17.02919, 48.13996], [16.97701, 48.17385], [16.89461, 48.31332], [16.90903, 48.32519], [16.84243, 48.35258], [16.83317, 48.38138], [16.83588, 48.3844], [16.8497, 48.38321], [16.85204, 48.44968], [16.94611, 48.53614], [16.93955, 48.60371], [16.90354, 48.71541], [16.79779, 48.70998], [16.71883, 48.73806], [16.68518, 48.7281], [16.67008, 48.77699], [16.46134, 48.80865], [16.40915, 48.74576], [16.37345, 48.729], [16.06034, 48.75436], [15.84404, 48.86921], [15.78087, 48.87644], [15.75341, 48.8516], [15.6921, 48.85973], [15.61622, 48.89541], [15.51357, 48.91549], [15.48027, 48.94481], [15.34823, 48.98444]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "AU", + iso1A3: "AUS", + iso1N3: "036", + wikidata: "Q408", + nameEn: "Australia" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "AW", + iso1A3: "ABW", + iso1N3: "533", + wikidata: "Q21203", + nameEn: "Aruba", + aliases: ["NL-AW"], + country: "NL", + groups: ["Q1451600", "029", "003", "419", "019", "UN"], + callingCodes: ["297"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-70.00823, 12.98375], [-70.35625, 12.58277], [-69.60231, 12.17], [-70.00823, 12.98375]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "AX", + iso1A3: "ALA", + iso1N3: "248", + wikidata: "Q5689", + nameEn: "\xC5land Islands", + country: "FI", + groups: ["EU", "154", "150", "UN"], + callingCodes: ["358 18", "358 457"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[19.08191, 60.19152], [20.5104, 59.15546], [21.35468, 59.67511], [21.02509, 60.12142], [21.08159, 60.20167], [21.15143, 60.54555], [20.96741, 60.71528], [19.23413, 60.61414], [19.08191, 60.19152]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "AZ", + iso1A3: "AZE", + iso1N3: "031", + wikidata: "Q227", + nameEn: "Azerbaijan", + groups: ["145", "142", "UN"], + callingCodes: ["994"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[46.42738, 41.91323], [46.3984, 41.84399], [46.30863, 41.79133], [46.23962, 41.75811], [46.20538, 41.77205], [46.17891, 41.72094], [46.19759, 41.62327], [46.24429, 41.59883], [46.26531, 41.63339], [46.28182, 41.60089], [46.3253, 41.60912], [46.34039, 41.5947], [46.34126, 41.57454], [46.29794, 41.5724], [46.33925, 41.4963], [46.40307, 41.48464], [46.4669, 41.43331], [46.63658, 41.37727], [46.72375, 41.28609], [46.66148, 41.20533], [46.63969, 41.09515], [46.55096, 41.1104], [46.48558, 41.0576], [46.456, 41.09984], [46.37661, 41.10805], [46.27698, 41.19011], [46.13221, 41.19479], [45.95786, 41.17956], [45.80842, 41.2229], [45.69946, 41.29545], [45.75705, 41.35157], [45.71035, 41.36208], [45.68389, 41.3539], [45.45973, 41.45898], [45.4006, 41.42402], [45.31352, 41.47168], [45.26285, 41.46433], [45.1797, 41.42231], [45.09867, 41.34065], [45.0133, 41.29747], [45.05497, 41.2464], [45.02932, 41.2101], [45.05201, 41.19211], [45.11811, 41.19967], [45.1969, 41.168], [45.19942, 41.13299], [45.08028, 41.10917], [45.06784, 41.05379], [45.12923, 41.06059], [45.1313, 41.09369], [45.1634, 41.08082], [45.16493, 41.05068], [45.1994, 41.04518], [45.25897, 41.0027], [45.26162, 41.0228], [45.28859, 41.03757], [45.35677, 40.99784], [45.39725, 41.02603], [45.44083, 41.01663], [45.40814, 40.97904], [45.60584, 40.87436], [45.55914, 40.78366], [45.4206, 40.7424], [45.35366, 40.65979], [45.45484, 40.57707], [45.42994, 40.53804], [45.65098, 40.37696], [45.95609, 40.27846], [45.97944, 40.181], [45.83779, 39.98925], [45.78642, 40.03218], [45.59806, 40.0131], [45.60895, 39.97733], [45.7833, 39.9475], [45.82533, 39.82925], [45.96543, 39.78859], [46.18493, 39.60533], [46.40286, 39.63651], [46.42465, 39.57534], [46.52117, 39.58734], [46.57098, 39.56694], [46.57721, 39.54414], [46.51027, 39.52373], [46.53051, 39.47809], [46.4013, 39.45405], [46.37795, 39.42039], [46.43244, 39.35181], [46.50093, 39.33736], [46.56476, 39.24942], [46.63481, 39.23013], [46.58032, 39.21204], [46.54141, 39.15895], [46.52584, 39.18912], [46.44022, 39.19636], [46.54296, 39.07078], [46.51805, 38.94982], [46.53497, 38.86548], [46.75752, 39.03231], [46.83822, 39.13143], [46.92539, 39.16644], [46.95341, 39.13505], [47.05771, 39.20143], [47.05927, 39.24846], [47.31301, 39.37492], [47.38978, 39.45999], [47.50099, 39.49615], [47.84774, 39.66285], [47.98977, 39.70999], [48.34264, 39.42935], [48.37385, 39.37584], [48.15984, 39.30028], [48.12404, 39.25208], [48.15361, 39.19419], [48.31239, 39.09278], [48.33884, 39.03022], [48.28437, 38.97186], [48.08627, 38.94434], [48.07734, 38.91616], [48.01409, 38.90333], [48.02581, 38.82705], [48.24773, 38.71883], [48.3146, 38.59958], [48.45084, 38.61013], [48.58793, 38.45076], [48.62217, 38.40198], [48.70001, 38.40564], [48.78979, 38.45026], [48.81072, 38.44853], [48.84969, 38.45015], [48.88288, 38.43975], [52.39847, 39.43556], [48.80971, 41.95365], [48.5867, 41.84306], [48.55078, 41.77917], [48.42301, 41.65444], [48.40277, 41.60441], [48.2878, 41.56221], [48.22064, 41.51472], [48.07587, 41.49957], [47.87973, 41.21798], [47.75831, 41.19455], [47.62288, 41.22969], [47.54504, 41.20275], [47.49004, 41.26366], [47.34579, 41.27884], [47.10762, 41.59044], [47.03757, 41.55434], [46.99554, 41.59743], [47.00955, 41.63583], [46.8134, 41.76252], [46.75269, 41.8623], [46.58924, 41.80547], [46.5332, 41.87389], [46.42738, 41.91323]], [[45.50279, 40.58424], [45.47927, 40.65023], [45.51825, 40.67382], [45.56071, 40.64765], [45.50279, 40.58424]]], [[[45.00864, 41.03411], [45.03792, 41.03938], [45.04517, 41.06653], [45.03406, 41.07931], [45.00864, 41.09407], [44.97169, 41.09176], [44.95383, 41.07553], [44.96031, 41.06345], [44.9903, 41.05657], [45.00864, 41.03411]]], [[[45.21324, 40.9817], [45.23095, 40.97828], [45.23487, 41.00226], [45.20625, 41.01484], [45.18382, 41.0066], [45.19312, 40.98998], [45.20518, 40.99348], [45.21219, 40.99001], [45.21324, 40.9817]]], [[[45.46992, 39.49888], [45.29606, 39.57654], [45.30385, 39.61373], [45.23535, 39.61373], [45.21784, 39.58074], [45.17464, 39.58614], [45.18554, 39.67846], [45.06604, 39.79277], [44.92869, 39.72157], [44.88354, 39.74432], [44.75779, 39.7148], [44.80977, 39.65768], [44.81043, 39.62677], [44.88916, 39.59653], [44.96746, 39.42998], [45.05932, 39.36435], [45.08751, 39.35052], [45.16168, 39.21952], [45.30489, 39.18333], [45.40148, 39.09007], [45.40452, 39.07224], [45.44811, 39.04927], [45.44966, 38.99243], [45.6131, 38.964], [45.6155, 38.94304], [45.65172, 38.95199], [45.83883, 38.90768], [45.90266, 38.87739], [45.94624, 38.89072], [46.00228, 38.87376], [46.06766, 38.87861], [46.14785, 38.84206], [46.06973, 39.0744], [46.02303, 39.09978], [45.99774, 39.28931], [45.79225, 39.3695], [45.83, 39.46487], [45.80804, 39.56716], [45.70547, 39.60174], [45.46992, 39.49888]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "BA", + iso1A3: "BIH", + iso1N3: "070", + wikidata: "Q225", + nameEn: "Bosnia and Herzegovina", + groups: ["039", "150", "UN"], + callingCodes: ["387"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[17.84826, 45.04489], [17.66571, 45.13408], [17.59104, 45.10816], [17.51469, 45.10791], [17.47589, 45.12656], [17.45615, 45.12523], [17.4498, 45.16119], [17.41229, 45.13335], [17.33573, 45.14521], [17.32092, 45.16246], [17.26815, 45.18444], [17.25131, 45.14957], [17.24325, 45.146], [17.18438, 45.14764], [17.0415, 45.20759], [16.9385, 45.22742], [16.92405, 45.27607], [16.83804, 45.18951], [16.81137, 45.18434], [16.78219, 45.19002], [16.74845, 45.20393], [16.64962, 45.20714], [16.60194, 45.23042], [16.56559, 45.22307], [16.5501, 45.2212], [16.52982, 45.22713], [16.49155, 45.21153], [16.4634, 45.14522], [16.40023, 45.1147], [16.38309, 45.05955], [16.38219, 45.05139], [16.3749, 45.05206], [16.35863, 45.03529], [16.35404, 45.00241], [16.29036, 44.99732], [16.12153, 45.09616], [15.98412, 45.23088], [15.83512, 45.22459], [15.76371, 45.16508], [15.78842, 45.11519], [15.74585, 45.0638], [15.78568, 44.97401], [15.74723, 44.96818], [15.76096, 44.87045], [15.79472, 44.8455], [15.72584, 44.82334], [15.8255, 44.71501], [15.89348, 44.74964], [16.05828, 44.61538], [16.00884, 44.58605], [16.03012, 44.55572], [16.10566, 44.52586], [16.16814, 44.40679], [16.12969, 44.38275], [16.21346, 44.35231], [16.18688, 44.27012], [16.36864, 44.08263], [16.43662, 44.07523], [16.43629, 44.02826], [16.50528, 44.0244], [16.55472, 43.95326], [16.70922, 43.84887], [16.75316, 43.77157], [16.80736, 43.76011], [17.00585, 43.58037], [17.15828, 43.49376], [17.24411, 43.49376], [17.29699, 43.44542], [17.25579, 43.40353], [17.286, 43.33065], [17.46986, 43.16559], [17.64268, 43.08595], [17.70879, 42.97223], [17.5392, 42.92787], [17.6444, 42.88641], [17.68151, 42.92725], [17.7948, 42.89556], [17.80854, 42.9182], [17.88201, 42.83668], [18.24318, 42.6112], [18.36197, 42.61423], [18.43735, 42.55921], [18.49778, 42.58409], [18.53751, 42.57376], [18.55504, 42.58409], [18.52232, 42.62279], [18.57373, 42.64429], [18.54841, 42.68328], [18.54603, 42.69171], [18.55221, 42.69045], [18.56789, 42.72074], [18.47324, 42.74992], [18.45921, 42.81682], [18.47633, 42.85829], [18.4935, 42.86433], [18.49661, 42.89306], [18.49076, 42.95553], [18.52232, 43.01451], [18.66254, 43.03928], [18.64735, 43.14766], [18.66605, 43.2056], [18.71747, 43.2286], [18.6976, 43.25243], [18.76538, 43.29838], [18.85342, 43.32426], [18.84794, 43.33735], [18.83912, 43.34795], [18.90911, 43.36383], [18.95819, 43.32899], [18.95001, 43.29327], [19.00844, 43.24988], [19.04233, 43.30008], [19.08206, 43.29668], [19.08673, 43.31453], [19.04071, 43.397], [19.01078, 43.43854], [18.96053, 43.45042], [18.95469, 43.49367], [18.91379, 43.50299], [19.01078, 43.55806], [19.04934, 43.50384], [19.13933, 43.5282], [19.15685, 43.53943], [19.22807, 43.5264], [19.24774, 43.53061], [19.2553, 43.5938], [19.33426, 43.58833], [19.36653, 43.60921], [19.41941, 43.54056], [19.42696, 43.57987], [19.50455, 43.58385], [19.5176, 43.71403], [19.3986, 43.79668], [19.23465, 43.98764], [19.24363, 44.01502], [19.38439, 43.96611], [19.52515, 43.95573], [19.56498, 43.99922], [19.61836, 44.01464], [19.61991, 44.05254], [19.57467, 44.04716], [19.55999, 44.06894], [19.51167, 44.08158], [19.47321, 44.1193], [19.48386, 44.14332], [19.47338, 44.15034], [19.43905, 44.13088], [19.40927, 44.16722], [19.3588, 44.18353], [19.34773, 44.23244], [19.32464, 44.27185], [19.26945, 44.26957], [19.23306, 44.26097], [19.20508, 44.2917], [19.18328, 44.28383], [19.16741, 44.28648], [19.13332, 44.31492], [19.13556, 44.338], [19.11547, 44.34218], [19.1083, 44.3558], [19.11865, 44.36712], [19.10298, 44.36924], [19.10365, 44.37795], [19.10704, 44.38249], [19.10749, 44.39421], [19.11785, 44.40313], [19.14681, 44.41463], [19.14837, 44.45253], [19.12278, 44.50132], [19.13369, 44.52521], [19.16699, 44.52197], [19.26388, 44.65412], [19.32543, 44.74058], [19.36722, 44.88164], [19.18183, 44.92055], [19.01994, 44.85493], [18.8704, 44.85097], [18.76347, 44.90669], [18.76369, 44.93707], [18.80661, 44.93561], [18.78357, 44.97741], [18.65723, 45.07544], [18.47939, 45.05871], [18.41896, 45.11083], [18.32077, 45.1021], [18.24387, 45.13699], [18.1624, 45.07654], [18.03121, 45.12632], [18.01594, 45.15163], [17.99479, 45.14958], [17.97834, 45.13831], [17.97336, 45.12245], [17.93706, 45.08016], [17.87148, 45.04645], [17.84826, 45.04489]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "BB", + iso1A3: "BRB", + iso1N3: "052", + wikidata: "Q244", + nameEn: "Barbados", + groups: ["029", "003", "419", "019", "UN"], + driveSide: "left", + callingCodes: ["1 246"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-58.56442, 13.24471], [-59.80731, 13.87556], [-59.82929, 12.70644], [-58.56442, 13.24471]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "BD", + iso1A3: "BGD", + iso1N3: "050", + wikidata: "Q902", + nameEn: "Bangladesh", + groups: ["034", "142", "UN"], + driveSide: "left", + callingCodes: ["880"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[89.15869, 26.13708], [89.08899, 26.38845], [88.95612, 26.4564], [88.92357, 26.40711], [88.91321, 26.37984], [89.05328, 26.2469], [88.85004, 26.23211], [88.78961, 26.31093], [88.67837, 26.26291], [88.69485, 26.38353], [88.62144, 26.46783], [88.4298, 26.54489], [88.41196, 26.63837], [88.33093, 26.48929], [88.35153, 26.45241], [88.36938, 26.48683], [88.48749, 26.45855], [88.51649, 26.35923], [88.35153, 26.29123], [88.34757, 26.22216], [88.1844, 26.14417], [88.16581, 26.0238], [88.08804, 25.91334], [88.13138, 25.78773], [88.242, 25.80811], [88.45103, 25.66245], [88.4559, 25.59227], [88.677, 25.46959], [88.81296, 25.51546], [88.85278, 25.34679], [89.01105, 25.30303], [89.00463, 25.26583], [88.94067, 25.18534], [88.44766, 25.20149], [88.46277, 25.07468], [88.33917, 24.86803], [88.27325, 24.88796], [88.21832, 24.96642], [88.14004, 24.93529], [88.15515, 24.85806], [88.00683, 24.66477], [88.08786, 24.63232], [88.12296, 24.51301], [88.50934, 24.32474], [88.68801, 24.31464], [88.74841, 24.1959], [88.6976, 24.14703], [88.73743, 23.91751], [88.66189, 23.87607], [88.58087, 23.87105], [88.56507, 23.64044], [88.74841, 23.47361], [88.79351, 23.50535], [88.79254, 23.46028], [88.71133, 23.2492], [88.99148, 23.21134], [88.86377, 23.08759], [88.88327, 23.03885], [88.87063, 22.95235], [88.96713, 22.83346], [88.9151, 22.75228], [88.94614, 22.66941], [88.9367, 22.58527], [89.07114, 22.15335], [89.08044, 21.41871], [92.47409, 20.38654], [92.26071, 21.05697], [92.17752, 21.17445], [92.20087, 21.337], [92.37939, 21.47764], [92.43158, 21.37025], [92.55105, 21.3856], [92.60187, 21.24615], [92.68152, 21.28454], [92.59775, 21.6092], [92.62187, 21.87037], [92.60949, 21.97638], [92.56616, 22.13554], [92.60029, 22.1522], [92.5181, 22.71441], [92.37665, 22.9435], [92.38214, 23.28705], [92.26541, 23.70392], [92.15417, 23.73409], [92.04706, 23.64229], [91.95093, 23.73284], [91.95642, 23.47361], [91.84789, 23.42235], [91.76417, 23.26619], [91.81634, 23.08001], [91.7324, 23.00043], [91.61571, 22.93929], [91.54993, 23.01051], [91.46615, 23.2328], [91.4035, 23.27522], [91.40848, 23.07117], [91.36453, 23.06612], [91.28293, 23.37538], [91.15579, 23.6599], [91.25192, 23.83463], [91.22308, 23.89616], [91.29587, 24.0041], [91.35741, 23.99072], [91.37414, 24.10693], [91.55542, 24.08687], [91.63782, 24.1132], [91.65292, 24.22095], [91.73257, 24.14703], [91.76004, 24.23848], [91.82596, 24.22345], [91.89258, 24.14674], [91.96603, 24.3799], [92.11662, 24.38997], [92.15796, 24.54435], [92.25854, 24.9191], [92.38626, 24.86055], [92.49887, 24.88796], [92.39147, 25.01471], [92.33957, 25.07593], [92.0316, 25.1834], [91.63648, 25.12846], [91.25517, 25.20677], [90.87427, 25.15799], [90.65042, 25.17788], [90.40034, 25.1534], [90.1155, 25.22686], [89.90478, 25.31038], [89.87629, 25.28337], [89.83371, 25.29548], [89.84086, 25.31854], [89.81208, 25.37244], [89.86129, 25.61714], [89.84388, 25.70042], [89.80585, 25.82489], [89.86592, 25.93115], [89.77728, 26.04254], [89.77865, 26.08387], [89.73581, 26.15818], [89.70201, 26.15138], [89.63968, 26.22595], [89.57101, 25.9682], [89.53515, 26.00382], [89.35953, 26.0077], [89.15869, 26.13708]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "BE", + iso1A3: "BEL", + iso1N3: "056", + wikidata: "Q31", + nameEn: "Belgium", + groups: ["EU", "155", "150", "UN"], + callingCodes: ["32"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[4.93295, 51.44945], [4.93909, 51.44632], [4.9524, 51.45014], [4.95244, 51.45207], [4.93295, 51.44945]]], [[[4.91493, 51.4353], [4.92652, 51.43329], [4.92952, 51.42984], [4.93986, 51.43064], [4.94265, 51.44003], [4.93471, 51.43861], [4.93416, 51.44185], [4.94025, 51.44193], [4.93544, 51.44634], [4.92879, 51.44161], [4.92815, 51.43856], [4.92566, 51.44273], [4.92811, 51.4437], [4.92287, 51.44741], [4.91811, 51.44621], [4.92227, 51.44252], [4.91935, 51.43634], [4.91493, 51.4353]]], [[[4.82946, 51.4213], [4.82409, 51.44736], [4.84139, 51.4799], [4.78803, 51.50284], [4.77321, 51.50529], [4.74578, 51.48937], [4.72935, 51.48424], [4.65442, 51.42352], [4.57489, 51.4324], [4.53521, 51.4243], [4.52846, 51.45002], [4.54675, 51.47265], [4.5388, 51.48184], [4.47736, 51.4778], [4.38122, 51.44905], [4.39747, 51.43316], [4.38064, 51.41965], [4.43777, 51.36989], [4.39292, 51.35547], [4.34086, 51.35738], [4.33265, 51.37687], [4.21923, 51.37443], [4.24024, 51.35371], [4.16721, 51.29348], [4.05165, 51.24171], [4.01957, 51.24504], [3.97889, 51.22537], [3.90125, 51.20371], [3.78783, 51.2151], [3.78999, 51.25766], [3.58939, 51.30064], [3.51502, 51.28697], [3.52698, 51.2458], [3.43488, 51.24135], [3.41704, 51.25933], [3.38289, 51.27331], [3.35847, 51.31572], [3.38696, 51.33436], [3.36263, 51.37112], [2.56575, 51.85301], [2.18458, 51.52087], [2.55904, 51.07014], [2.57551, 51.00326], [2.63074, 50.94746], [2.59093, 50.91751], [2.63331, 50.81457], [2.71165, 50.81295], [2.81056, 50.71773], [2.8483, 50.72276], [2.86985, 50.7033], [2.87937, 50.70298], [2.88504, 50.70656], [2.90069, 50.69263], [2.91036, 50.6939], [2.90873, 50.702], [2.95019, 50.75138], [2.96778, 50.75242], [3.00537, 50.76588], [3.04314, 50.77674], [3.09163, 50.77717], [3.10614, 50.78303], [3.11206, 50.79416], [3.11987, 50.79188], [3.1257, 50.78603], [3.15017, 50.79031], [3.16476, 50.76843], [3.18339, 50.74981], [3.18811, 50.74025], [3.20064, 50.73547], [3.19017, 50.72569], [3.20845, 50.71662], [3.22042, 50.71019], [3.24593, 50.71389], [3.26063, 50.70086], [3.26141, 50.69151], [3.2536, 50.68977], [3.264, 50.67668], [3.23951, 50.6585], [3.2729, 50.60718], [3.28575, 50.52724], [3.37693, 50.49538], [3.44629, 50.51009], [3.47385, 50.53397], [3.51564, 50.5256], [3.49509, 50.48885], [3.5683, 50.50192], [3.58361, 50.49049], [3.61014, 50.49568], [3.64426, 50.46275], [3.66153, 50.45165], [3.67494, 50.40239], [3.67262, 50.38663], [3.65709, 50.36873], [3.66976, 50.34563], [3.71009, 50.30305], [3.70987, 50.3191], [3.73911, 50.34809], [3.84314, 50.35219], [3.90781, 50.32814], [3.96771, 50.34989], [4.0268, 50.35793], [4.0689, 50.3254], [4.10237, 50.31247], [4.10957, 50.30234], [4.11954, 50.30425], [4.13665, 50.25609], [4.16808, 50.25786], [4.15524, 50.2833], [4.17347, 50.28838], [4.17861, 50.27443], [4.20651, 50.27333], [4.21945, 50.25539], [4.15524, 50.21103], [4.16014, 50.19239], [4.13561, 50.13078], [4.20147, 50.13535], [4.23101, 50.06945], [4.16294, 50.04719], [4.13508, 50.01976], [4.14239, 49.98034], [4.20532, 49.95803], [4.31963, 49.97043], [4.35051, 49.95315], [4.43488, 49.94122], [4.51098, 49.94659], [4.5414, 49.96911], [4.68695, 49.99685], [4.70064, 50.09384], [4.75237, 50.11314], [4.82438, 50.16878], [4.83279, 50.15331], [4.88602, 50.15182], [4.8382, 50.06738], [4.78827, 49.95609], [4.88529, 49.9236], [4.85134, 49.86457], [4.86965, 49.82271], [4.85464, 49.78995], [4.96714, 49.79872], [5.09249, 49.76193], [5.14545, 49.70287], [5.26232, 49.69456], [5.31465, 49.66846], [5.33039, 49.6555], [5.30214, 49.63055], [5.3137, 49.61225], [5.33851, 49.61599], [5.34837, 49.62889], [5.3974, 49.61596], [5.43713, 49.5707], [5.46734, 49.52648], [5.46541, 49.49825], [5.55001, 49.52729], [5.60909, 49.51228], [5.64505, 49.55146], [5.75649, 49.54321], [5.7577, 49.55915], [5.77435, 49.56298], [5.79195, 49.55228], [5.81838, 49.54777], [5.84143, 49.5533], [5.84692, 49.55663], [5.8424, 49.56082], [5.87256, 49.57539], [5.86986, 49.58756], [5.84971, 49.58674], [5.84826, 49.5969], [5.8762, 49.60898], [5.87609, 49.62047], [5.88393, 49.62802], [5.88552, 49.63507], [5.90599, 49.63853], [5.90164, 49.6511], [5.9069, 49.66377], [5.86175, 49.67862], [5.86527, 49.69291], [5.88677, 49.70951], [5.86503, 49.72739], [5.84193, 49.72161], [5.82562, 49.72395], [5.83149, 49.74729], [5.82245, 49.75048], [5.78871, 49.7962], [5.75409, 49.79239], [5.74953, 49.81428], [5.74364, 49.82058], [5.74844, 49.82435], [5.7404, 49.83452], [5.74076, 49.83823], [5.74975, 49.83933], [5.74953, 49.84709], [5.75884, 49.84811], [5.74567, 49.85368], [5.75861, 49.85631], [5.75269, 49.8711], [5.78415, 49.87922], [5.73621, 49.89796], [5.77314, 49.93646], [5.77291, 49.96056], [5.80833, 49.96451], [5.81163, 49.97142], [5.83467, 49.97823], [5.83968, 49.9892], [5.82331, 49.99662], [5.81866, 50.01286], [5.8551, 50.02683], [5.86904, 50.04614], [5.85474, 50.06342], [5.8857, 50.07824], [5.89488, 50.11476], [5.95929, 50.13295], [5.96453, 50.17259], [6.02488, 50.18283], [6.03093, 50.16362], [6.06406, 50.15344], [6.08577, 50.17246], [6.12028, 50.16374], [6.1137, 50.13668], [6.1379, 50.12964], [6.15298, 50.14126], [6.14132, 50.14971], [6.14588, 50.17106], [6.18739, 50.1822], [6.18364, 50.20815], [6.16853, 50.2234], [6.208, 50.25179], [6.28797, 50.27458], [6.29949, 50.30887], [6.32488, 50.32333], [6.35701, 50.31139], [6.40641, 50.32425], [6.40785, 50.33557], [6.3688, 50.35898], [6.34406, 50.37994], [6.36852, 50.40776], [6.37219, 50.45397], [6.34005, 50.46083], [6.3465, 50.48833], [6.30809, 50.50058], [6.26637, 50.50272], [6.22335, 50.49578], [6.20599, 50.52089], [6.19193, 50.5212], [6.18716, 50.52653], [6.19579, 50.5313], [6.19735, 50.53576], [6.17802, 50.54179], [6.17739, 50.55875], [6.20281, 50.56952], [6.22581, 50.5907], [6.24005, 50.58732], [6.24888, 50.59869], [6.2476, 50.60392], [6.26957, 50.62444], [6.17852, 50.6245], [6.11707, 50.72231], [6.04428, 50.72861], [6.0406, 50.71848], [6.0326, 50.72647], [6.03889, 50.74618], [6.01976, 50.75398], [5.97545, 50.75441], [5.95942, 50.7622], [5.89132, 50.75124], [5.89129, 50.75125], [5.88734, 50.77092], [5.84888, 50.75448], [5.84548, 50.76542], [5.80673, 50.7558], [5.77513, 50.78308], [5.76533, 50.78159], [5.74356, 50.7691], [5.73904, 50.75674], [5.72216, 50.76398], [5.69469, 50.75529], [5.68091, 50.75804], [5.70107, 50.7827], [5.68995, 50.79641], [5.70118, 50.80764], [5.65259, 50.82309], [5.64009, 50.84742], [5.64504, 50.87107], [5.67886, 50.88142], [5.69858, 50.91046], [5.71626, 50.90796], [5.72644, 50.91167], [5.72545, 50.92312], [5.74644, 50.94723], [5.75927, 50.95601], [5.74752, 50.96202], [5.72875, 50.95428], [5.71864, 50.96092], [5.76242, 50.99703], [5.77688, 51.02483], [5.75961, 51.03113], [5.77258, 51.06196], [5.79835, 51.05834], [5.79903, 51.09371], [5.82921, 51.09328], [5.83226, 51.10585], [5.8109, 51.10861], [5.80798, 51.11661], [5.85508, 51.14445], [5.82564, 51.16753], [5.77697, 51.1522], [5.77735, 51.17845], [5.74617, 51.18928], [5.70344, 51.1829], [5.65528, 51.18736], [5.65145, 51.19788], [5.5603, 51.22249], [5.5569, 51.26544], [5.515, 51.29462], [5.48476, 51.30053], [5.46519, 51.2849], [5.4407, 51.28169], [5.41672, 51.26248], [5.347, 51.27502], [5.33886, 51.26314], [5.29716, 51.26104], [5.26461, 51.26693], [5.23814, 51.26064], [5.22542, 51.26888], [5.24244, 51.30495], [5.2002, 51.32243], [5.16222, 51.31035], [5.13377, 51.31592], [5.13105, 51.34791], [5.07102, 51.39469], [5.10456, 51.43163], [5.07891, 51.4715], [5.04774, 51.47022], [5.03281, 51.48679], [5.0106, 51.47167], [5.00393, 51.44406], [4.92152, 51.39487], [4.90016, 51.41404], [4.84988, 51.41502], [4.78941, 51.41102], [4.77229, 51.41337], [4.76577, 51.43046], [4.78314, 51.43319], [4.82946, 51.4213]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "BF", + iso1A3: "BFA", + iso1N3: "854", + wikidata: "Q965", + nameEn: "Burkina Faso", + groups: ["011", "202", "002", "UN"], + callingCodes: ["226"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[0.23859, 15.00135], [0.06588, 14.96961], [-0.24673, 15.07805], [-0.72004, 15.08655], [-1.05875, 14.7921], [-1.32166, 14.72774], [-1.68083, 14.50023], [-1.97945, 14.47709], [-1.9992, 14.19011], [-2.10223, 14.14878], [-2.47587, 14.29671], [-2.66175, 14.14713], [-2.84667, 14.05532], [-2.90831, 13.81174], [-2.88189, 13.64921], [-3.26407, 13.70699], [-3.28396, 13.5422], [-3.23599, 13.29035], [-3.43507, 13.27272], [-3.4313, 13.1588], [-3.54454, 13.1781], [-3.7911, 13.36665], [-3.96282, 13.38164], [-3.90558, 13.44375], [-3.96501, 13.49778], [-4.34477, 13.12927], [-4.21819, 12.95722], [-4.238, 12.71467], [-4.47356, 12.71252], [-4.41412, 12.31922], [-4.57703, 12.19875], [-4.54841, 12.1385], [-4.62546, 12.13204], [-4.62987, 12.06531], [-4.70692, 12.06746], [-4.72893, 12.01579], [-5.07897, 11.97918], [-5.26389, 11.84778], [-5.40258, 11.8327], [-5.26389, 11.75728], [-5.29251, 11.61715], [-5.22867, 11.60421], [-5.20665, 11.43811], [-5.25509, 11.36905], [-5.25949, 11.24816], [-5.32553, 11.21578], [-5.32994, 11.13371], [-5.49284, 11.07538], [-5.41579, 10.84628], [-5.47083, 10.75329], [-5.46643, 10.56074], [-5.51058, 10.43177], [-5.39602, 10.2929], [-5.12465, 10.29788], [-4.96453, 9.99923], [-4.96621, 9.89132], [-4.6426, 9.70696], [-4.31392, 9.60062], [-4.25999, 9.76012], [-3.69703, 9.94279], [-3.31779, 9.91125], [-3.27228, 9.84981], [-3.19306, 9.93781], [-3.16609, 9.85147], [-3.00765, 9.74019], [-2.93012, 9.57403], [-2.76494, 9.40778], [-2.68802, 9.49343], [-2.76534, 9.56589], [-2.74174, 9.83172], [-2.83108, 10.40252], [-2.94232, 10.64281], [-2.83373, 11.0067], [-0.67143, 10.99811], [-0.61937, 10.91305], [-0.44298, 11.04292], [-0.42391, 11.11661], [-0.38219, 11.12596], [-0.35955, 11.07801], [-0.28566, 11.12713], [-0.27374, 11.17157], [-0.13493, 11.14075], [0.50388, 11.01011], [0.48852, 10.98561], [0.50521, 10.98035], [0.4958, 10.93269], [0.66104, 10.99964], [0.91245, 10.99597], [0.9813, 11.08876], [1.03409, 11.04719], [1.42823, 11.46822], [2.00988, 11.42227], [2.29983, 11.68254], [2.39723, 11.89473], [2.05785, 12.35539], [2.26349, 12.41915], [0.99167, 13.10727], [0.99253, 13.37515], [1.18873, 13.31771], [1.21217, 13.37853], [1.24516, 13.33968], [1.28509, 13.35488], [1.24429, 13.39373], [1.20088, 13.38951], [1.02813, 13.46635], [0.99514, 13.5668], [0.77637, 13.64442], [0.77377, 13.6866], [0.61924, 13.68491], [0.38051, 14.05575], [0.16936, 14.51654], [0.23859, 15.00135]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "BG", + iso1A3: "BGR", + iso1N3: "100", + wikidata: "Q219", + nameEn: "Bulgaria", + groups: ["EU", "151", "150", "UN"], + callingCodes: ["359"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[23.05288, 43.79494], [22.85314, 43.84452], [22.83753, 43.88055], [22.87873, 43.9844], [23.01674, 44.01946], [23.04988, 44.07694], [22.67173, 44.21564], [22.61711, 44.16938], [22.61688, 44.06534], [22.41449, 44.00514], [22.35558, 43.81281], [22.41043, 43.69566], [22.47582, 43.6558], [22.53397, 43.47225], [22.82036, 43.33665], [22.89727, 43.22417], [23.00806, 43.19279], [22.98104, 43.11199], [22.89521, 43.03625], [22.78397, 42.98253], [22.74826, 42.88701], [22.54302, 42.87774], [22.43309, 42.82057], [22.4997, 42.74144], [22.43983, 42.56851], [22.55669, 42.50144], [22.51961, 42.3991], [22.47498, 42.3915], [22.45919, 42.33822], [22.34773, 42.31725], [22.38136, 42.30339], [22.47251, 42.20393], [22.50289, 42.19527], [22.51224, 42.15457], [22.67701, 42.06614], [22.86749, 42.02275], [22.90254, 41.87587], [22.96682, 41.77137], [23.01239, 41.76527], [23.03342, 41.71034], [22.95513, 41.63265], [22.96331, 41.35782], [22.93334, 41.34104], [23.1833, 41.31755], [23.21953, 41.33773], [23.22771, 41.37106], [23.31301, 41.40525], [23.33639, 41.36317], [23.40416, 41.39999], [23.52453, 41.40262], [23.63203, 41.37632], [23.67644, 41.41139], [23.76525, 41.40175], [23.80148, 41.43943], [23.89613, 41.45257], [23.91483, 41.47971], [23.96975, 41.44118], [24.06908, 41.46132], [24.06323, 41.53222], [24.10063, 41.54796], [24.18126, 41.51735], [24.27124, 41.57682], [24.30513, 41.51297], [24.52599, 41.56808], [24.61129, 41.42278], [24.71529, 41.41928], [24.8041, 41.34913], [24.82514, 41.4035], [24.86136, 41.39298], [24.90928, 41.40876], [24.942, 41.38685], [25.11611, 41.34212], [25.28322, 41.23411], [25.48187, 41.28506], [25.52394, 41.2798], [25.55082, 41.31667], [25.61042, 41.30614], [25.66183, 41.31316], [25.70507, 41.29209], [25.8266, 41.34563], [25.87919, 41.30526], [26.12926, 41.35878], [26.16548, 41.42278], [26.20288, 41.43943], [26.14796, 41.47533], [26.176, 41.50072], [26.17951, 41.55409], [26.14328, 41.55496], [26.15146, 41.60828], [26.07083, 41.64584], [26.06148, 41.70345], [26.16841, 41.74858], [26.21325, 41.73223], [26.22888, 41.74139], [26.2654, 41.71544], [26.30255, 41.70925], [26.35957, 41.71149], [26.32952, 41.73637], [26.33589, 41.76802], [26.36952, 41.82265], [26.53968, 41.82653], [26.57961, 41.90024], [26.56051, 41.92995], [26.62996, 41.97644], [26.79143, 41.97386], [26.95638, 42.00741], [27.03277, 42.0809], [27.08486, 42.08735], [27.19251, 42.06028], [27.22376, 42.10152], [27.27411, 42.10409], [27.45478, 41.96591], [27.52379, 41.93756], [27.55191, 41.90928], [27.69949, 41.97515], [27.81235, 41.94803], [27.83492, 41.99709], [27.91479, 41.97902], [28.02971, 41.98066], [28.32297, 41.98371], [29.24336, 43.70874], [28.23293, 43.76], [27.99558, 43.84193], [27.92008, 44.00761], [27.73468, 43.95326], [27.64542, 44.04958], [27.60834, 44.01206], [27.39757, 44.0141], [27.26845, 44.12602], [26.95141, 44.13555], [26.62712, 44.05698], [26.38764, 44.04356], [26.10115, 43.96908], [26.05584, 43.90925], [25.94911, 43.85745], [25.72792, 43.69263], [25.39528, 43.61866], [25.17144, 43.70261], [25.10718, 43.6831], [24.96682, 43.72693], [24.73542, 43.68523], [24.62281, 43.74082], [24.50264, 43.76314], [24.35364, 43.70211], [24.18149, 43.68218], [23.73978, 43.80627], [23.61687, 43.79289], [23.4507, 43.84936], [23.26772, 43.84843], [23.05288, 43.79494]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "BH", + iso1A3: "BHR", + iso1N3: "048", + wikidata: "Q398", + nameEn: "Bahrain", + groups: ["145", "142", "UN"], + callingCodes: ["973"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[50.93865, 26.30758], [50.71771, 26.73086], [50.38162, 26.53976], [50.26923, 26.08243], [50.302, 25.87592], [50.57069, 25.57887], [50.80824, 25.54641], [50.7801, 25.595], [50.86149, 25.6965], [50.81266, 25.88946], [50.93865, 26.30758]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "BI", + iso1A3: "BDI", + iso1N3: "108", + wikidata: "Q967", + nameEn: "Burundi", + groups: ["014", "202", "002", "UN"], + callingCodes: ["257"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[30.54501, -2.41404], [30.42933, -2.31064], [30.14034, -2.43626], [29.95911, -2.33348], [29.88237, -2.75105], [29.36805, -2.82933], [29.32234, -2.6483], [29.0562, -2.58632], [29.04081, -2.7416], [29.00167, -2.78523], [29.00404, -2.81978], [29.0505, -2.81774], [29.09119, -2.87871], [29.09797, -2.91935], [29.16037, -2.95457], [29.17258, -2.99385], [29.25633, -3.05471], [29.21463, -3.3514], [29.23708, -3.75856], [29.43673, -4.44845], [29.63827, -4.44681], [29.75109, -4.45836], [29.77289, -4.41733], [29.82885, -4.36153], [29.88172, -4.35743], [30.03323, -4.26631], [30.22042, -4.01738], [30.45915, -3.56532], [30.84165, -3.25152], [30.83823, -2.97837], [30.6675, -2.98987], [30.57926, -2.89791], [30.4987, -2.9573], [30.40662, -2.86151], [30.52747, -2.65841], [30.41789, -2.66266], [30.54501, -2.41404]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "BJ", + iso1A3: "BEN", + iso1N3: "204", + wikidata: "Q962", + nameEn: "Benin", + aliases: ["DY"], + groups: ["011", "202", "002", "UN"], + callingCodes: ["229"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[3.59375, 11.70269], [3.48187, 11.86092], [3.31613, 11.88495], [3.25352, 12.01467], [2.83978, 12.40585], [2.6593, 12.30631], [2.37783, 12.24804], [2.39657, 12.10952], [2.45824, 11.98672], [2.39723, 11.89473], [2.29983, 11.68254], [2.00988, 11.42227], [1.42823, 11.46822], [1.03409, 11.04719], [0.9813, 11.08876], [0.91245, 10.99597], [0.8804, 10.803], [0.80358, 10.71459], [0.77666, 10.37665], [1.35507, 9.99525], [1.36624, 9.5951], [1.33675, 9.54765], [1.41746, 9.3226], [1.5649, 9.16941], [1.61838, 9.0527], [1.64249, 6.99562], [1.55877, 6.99737], [1.61812, 6.74843], [1.58105, 6.68619], [1.76906, 6.43189], [1.79826, 6.28221], [1.62913, 6.24075], [1.67336, 6.02702], [2.74181, 6.13349], [2.70566, 6.38038], [2.70464, 6.50831], [2.74334, 6.57291], [2.7325, 6.64057], [2.78204, 6.70514], [2.78823, 6.76356], [2.73405, 6.78508], [2.74024, 6.92802], [2.71702, 6.95722], [2.76965, 7.13543], [2.74489, 7.42565], [2.79442, 7.43486], [2.78668, 7.5116], [2.73405, 7.5423], [2.73095, 7.7755], [2.67523, 7.87825], [2.77907, 9.06924], [3.08017, 9.10006], [3.14147, 9.28375], [3.13928, 9.47167], [3.25093, 9.61632], [3.34726, 9.70696], [3.32099, 9.78032], [3.35383, 9.83641], [3.54429, 9.87739], [3.66908, 10.18136], [3.57275, 10.27185], [3.6844, 10.46351], [3.78292, 10.40538], [3.84243, 10.59316], [3.71505, 11.13015], [3.49175, 11.29765], [3.59375, 11.70269]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "BL", + iso1A3: "BLM", + iso1N3: "652", + wikidata: "Q25362", + nameEn: "Saint-Barth\xE9lemy", + country: "FR", + groups: ["Q1451600", "029", "003", "419", "019", "UN"], + callingCodes: ["590"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-62.62718, 18.26185], [-63.1055, 17.86651], [-62.34423, 17.49165], [-62.62718, 18.26185]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "BM", + iso1A3: "BMU", + iso1N3: "060", + wikidata: "Q23635", + nameEn: "Bermuda", + country: "GB", + groups: ["BOTS", "021", "003", "019", "UN"], + driveSide: "left", + callingCodes: ["1 441"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-63.20987, 32.6953], [-65.31453, 32.68437], [-65.63955, 31.43417], [-63.20987, 32.6953]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "BN", + iso1A3: "BRN", + iso1N3: "096", + wikidata: "Q921", + nameEn: "Brunei", + groups: ["Q36117", "035", "142", "UN"], + driveSide: "left", + callingCodes: ["673"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[115.16236, 5.01011], [115.02521, 5.35005], [114.10166, 4.76112], [114.07448, 4.58441], [114.15813, 4.57], [114.26876, 4.49878], [114.32176, 4.34942], [114.32176, 4.2552], [114.4416, 4.27588], [114.49922, 4.13108], [114.64211, 4.00694], [114.78539, 4.12205], [114.88039, 4.4257], [114.83189, 4.42387], [114.77303, 4.72871], [114.8266, 4.75062], [114.88841, 4.81905], [114.96982, 4.81146], [114.99417, 4.88201], [115.05038, 4.90275], [115.02955, 4.82087], [115.02278, 4.74137], [115.04064, 4.63706], [115.07737, 4.53418], [115.09978, 4.39123], [115.31275, 4.30806], [115.36346, 4.33563], [115.2851, 4.42295], [115.27819, 4.63661], [115.20737, 4.8256], [115.15092, 4.87604], [115.16236, 5.01011]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "BO", + iso1A3: "BOL", + iso1N3: "068", + wikidata: "Q750", + nameEn: "Bolivia", + groups: ["005", "419", "019", "UN"], + callingCodes: ["591"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-63.90248, -12.52544], [-64.22539, -12.45267], [-64.30708, -12.46398], [-64.99778, -11.98604], [-65.30027, -11.48749], [-65.28141, -10.86289], [-65.35402, -10.78685], [-65.37923, -10.35141], [-65.29019, -9.86253], [-65.40615, -9.63894], [-65.56244, -9.84266], [-65.68343, -9.75323], [-67.17784, -10.34016], [-68.71533, -11.14749], [-68.7651, -11.0496], [-68.75179, -11.03688], [-68.75265, -11.02383], [-68.74802, -11.00891], [-69.42792, -10.93451], [-69.47839, -10.95254], [-69.57156, -10.94555], [-68.98115, -11.8979], [-68.65044, -12.50689], [-68.85615, -12.87769], [-68.8864, -13.40792], [-69.05265, -13.68546], [-68.88135, -14.18639], [-69.36254, -14.94634], [-69.14856, -15.23478], [-69.40336, -15.61358], [-69.20291, -16.16668], [-69.09986, -16.22693], [-68.96238, -16.194], [-68.79464, -16.33272], [-68.98358, -16.42165], [-69.04027, -16.57214], [-69.00853, -16.66769], [-69.16896, -16.72233], [-69.62883, -17.28142], [-69.46863, -17.37466], [-69.46897, -17.4988], [-69.46623, -17.60518], [-69.34126, -17.72753], [-69.28671, -17.94844], [-69.07496, -18.03715], [-69.14807, -18.16893], [-69.07432, -18.28259], [-68.94987, -18.93302], [-68.87082, -19.06003], [-68.80602, -19.08355], [-68.61989, -19.27584], [-68.41218, -19.40499], [-68.66761, -19.72118], [-68.54611, -19.84651], [-68.57132, -20.03134], [-68.74273, -20.08817], [-68.7276, -20.46178], [-68.44023, -20.62701], [-68.55383, -20.7355], [-68.53957, -20.91542], [-68.40403, -20.94562], [-68.18816, -21.28614], [-67.85114, -22.87076], [-67.54284, -22.89771], [-67.18382, -22.81525], [-66.7298, -22.23644], [-66.29714, -22.08741], [-66.24077, -21.77837], [-66.03836, -21.84829], [-66.04832, -21.9187], [-65.9261, -21.93335], [-65.7467, -22.10105], [-65.61166, -22.09504], [-65.58694, -22.09794], [-65.57743, -22.07675], [-65.47435, -22.08908], [-64.99524, -22.08255], [-64.90014, -22.12136], [-64.67174, -22.18957], [-64.58888, -22.25035], [-64.4176, -22.67692], [-64.35108, -22.73282], [-64.31489, -22.88824], [-64.22918, -22.55807], [-63.93287, -21.99934], [-63.70963, -21.99934], [-63.68113, -22.0544], [-63.66482, -21.99918], [-62.81124, -21.9987], [-62.8078, -22.12534], [-62.64455, -22.25091], [-62.2757, -21.06657], [-62.26883, -20.55311], [-61.93912, -20.10053], [-61.73723, -19.63958], [-60.00638, -19.2981], [-59.06965, -19.29148], [-58.23216, -19.80058], [-58.16225, -20.16193], [-57.8496, -19.98346], [-58.14215, -19.76276], [-57.78463, -19.03259], [-57.71113, -19.03161], [-57.69134, -19.00544], [-57.71995, -18.97546], [-57.71995, -18.89573], [-57.76764, -18.90087], [-57.56807, -18.25655], [-57.48237, -18.24219], [-57.69877, -17.8431], [-57.73949, -17.56095], [-57.90082, -17.44555], [-57.99661, -17.5273], [-58.32935, -17.28195], [-58.5058, -16.80958], [-58.30918, -16.3699], [-58.32431, -16.25861], [-58.41506, -16.32636], [-60.16069, -16.26479], [-60.23797, -15.50267], [-60.58224, -15.09887], [-60.23968, -15.09515], [-60.27887, -14.63021], [-60.46037, -14.22496], [-60.48053, -13.77981], [-61.05527, -13.50054], [-61.81151, -13.49564], [-63.76259, -12.42952], [-63.90248, -12.52544]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "BQ", + iso1A3: "BES", + iso1N3: "535", + wikidata: "Q27561", + nameEn: "Caribbean Netherlands", + country: "NL" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "BR", + iso1A3: "BRA", + iso1N3: "076", + wikidata: "Q155", + nameEn: "Brazil", + groups: ["005", "419", "019", "UN"], + callingCodes: ["55"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-59.69361, 4.34069], [-59.78878, 4.45637], [-60.15953, 4.53456], [-60.04189, 4.69801], [-59.98129, 5.07097], [-60.20944, 5.28754], [-60.32352, 5.21299], [-60.73204, 5.20931], [-60.5802, 4.94312], [-60.86539, 4.70512], [-60.98303, 4.54167], [-61.15703, 4.49839], [-61.31457, 4.54167], [-61.29675, 4.44216], [-61.48569, 4.43149], [-61.54629, 4.2822], [-62.13094, 4.08309], [-62.44822, 4.18621], [-62.57656, 4.04754], [-62.74411, 4.03331], [-62.7655, 3.73099], [-62.98296, 3.59935], [-63.21111, 3.96219], [-63.4464, 3.9693], [-63.42233, 3.89995], [-63.50611, 3.83592], [-63.67099, 4.01731], [-63.70218, 3.91417], [-63.86082, 3.94796], [-63.99183, 3.90172], [-64.14512, 4.12932], [-64.57648, 4.12576], [-64.72977, 4.28931], [-64.84028, 4.24665], [-64.48379, 3.7879], [-64.02908, 2.79797], [-64.0257, 2.48156], [-63.39114, 2.4317], [-63.39827, 2.16098], [-64.06135, 1.94722], [-64.08274, 1.64792], [-64.34654, 1.35569], [-64.38932, 1.5125], [-65.11657, 1.12046], [-65.57288, 0.62856], [-65.50158, 0.92086], [-65.6727, 1.01353], [-66.28507, 0.74585], [-66.85795, 1.22998], [-67.08222, 1.17441], [-67.15784, 1.80439], [-67.299, 1.87494], [-67.40488, 2.22258], [-67.9292, 1.82455], [-68.18632, 2.00091], [-68.26699, 1.83463], [-68.18128, 1.72881], [-69.38621, 1.70865], [-69.53746, 1.76408], [-69.83491, 1.69353], [-69.82987, 1.07864], [-69.26017, 1.06856], [-69.14422, 0.84172], [-69.20976, 0.57958], [-69.47696, 0.71065], [-70.04162, 0.55437], [-70.03658, -0.19681], [-69.603, -0.51947], [-69.59796, -0.75136], [-69.4215, -1.01853], [-69.43395, -1.42219], [-69.94708, -4.2431], [-70.00888, -4.37833], [-70.11305, -4.27281], [-70.19582, -4.3607], [-70.33236, -4.15214], [-70.77601, -4.15717], [-70.96814, -4.36915], [-71.87003, -4.51661], [-72.64391, -5.0391], [-72.83973, -5.14765], [-73.24579, -6.05764], [-73.12983, -6.43852], [-73.73986, -6.87919], [-73.77011, -7.28944], [-73.96938, -7.58465], [-73.65485, -7.77897], [-73.76576, -7.89884], [-72.92886, -9.04074], [-73.21498, -9.40904], [-72.72216, -9.41397], [-72.31883, -9.5184], [-72.14742, -9.98049], [-71.23394, -9.9668], [-70.53373, -9.42628], [-70.58453, -9.58303], [-70.55429, -9.76692], [-70.62487, -9.80666], [-70.64134, -11.0108], [-70.51395, -10.92249], [-70.38791, -11.07096], [-69.90896, -10.92744], [-69.57835, -10.94051], [-69.57156, -10.94555], [-69.47839, -10.95254], [-69.42792, -10.93451], [-68.74802, -11.00891], [-68.75265, -11.02383], [-68.75179, -11.03688], [-68.7651, -11.0496], [-68.71533, -11.14749], [-67.17784, -10.34016], [-65.68343, -9.75323], [-65.56244, -9.84266], [-65.40615, -9.63894], [-65.29019, -9.86253], [-65.37923, -10.35141], [-65.35402, -10.78685], [-65.28141, -10.86289], [-65.30027, -11.48749], [-64.99778, -11.98604], [-64.30708, -12.46398], [-64.22539, -12.45267], [-63.90248, -12.52544], [-63.76259, -12.42952], [-61.81151, -13.49564], [-61.05527, -13.50054], [-60.48053, -13.77981], [-60.46037, -14.22496], [-60.27887, -14.63021], [-60.23968, -15.09515], [-60.58224, -15.09887], [-60.23797, -15.50267], [-60.16069, -16.26479], [-58.41506, -16.32636], [-58.32431, -16.25861], [-58.30918, -16.3699], [-58.5058, -16.80958], [-58.32935, -17.28195], [-57.99661, -17.5273], [-57.90082, -17.44555], [-57.73949, -17.56095], [-57.69877, -17.8431], [-57.48237, -18.24219], [-57.56807, -18.25655], [-57.76764, -18.90087], [-57.71995, -18.89573], [-57.71995, -18.97546], [-57.69134, -19.00544], [-57.71113, -19.03161], [-57.78463, -19.03259], [-58.14215, -19.76276], [-57.8496, -19.98346], [-58.16225, -20.16193], [-57.84536, -20.93155], [-57.93492, -21.65505], [-57.88239, -21.6868], [-57.94642, -21.73799], [-57.98625, -22.09157], [-56.6508, -22.28387], [-56.5212, -22.11556], [-56.45893, -22.08072], [-56.23206, -22.25347], [-55.8331, -22.29008], [-55.74941, -22.46436], [-55.741, -22.52018], [-55.72366, -22.5519], [-55.6986, -22.56268], [-55.68742, -22.58407], [-55.62493, -22.62765], [-55.63849, -22.95122], [-55.5446, -23.22811], [-55.52288, -23.2595], [-55.5555, -23.28237], [-55.43585, -23.87157], [-55.44117, -23.9185], [-55.41784, -23.9657], [-55.12292, -23.99669], [-55.0518, -23.98666], [-55.02691, -23.97317], [-54.6238, -23.83078], [-54.32807, -24.01865], [-54.28207, -24.07305], [-54.4423, -25.13381], [-54.62033, -25.46026], [-54.60196, -25.48397], [-54.59509, -25.53696], [-54.59398, -25.59224], [-54.5502, -25.58915], [-54.52926, -25.62846], [-53.90831, -25.55513], [-53.83691, -25.94849], [-53.73511, -26.04211], [-53.73086, -26.05842], [-53.7264, -26.0664], [-53.73391, -26.07006], [-53.73968, -26.10012], [-53.65018, -26.19501], [-53.65237, -26.23289], [-53.63739, -26.2496], [-53.63881, -26.25075], [-53.64632, -26.24798], [-53.64186, -26.25976], [-53.64505, -26.28089], [-53.68269, -26.33359], [-53.73372, -26.6131], [-53.80144, -27.09844], [-54.15978, -27.2889], [-54.19062, -27.27639], [-54.19268, -27.30751], [-54.41888, -27.40882], [-54.50416, -27.48232], [-54.67657, -27.57214], [-54.90159, -27.63132], [-54.90805, -27.73149], [-55.1349, -27.89759], [-55.16872, -27.86224], [-55.33303, -27.94661], [-55.6262, -28.17124], [-55.65418, -28.18304], [-56.01729, -28.51223], [-56.00458, -28.60421], [-56.05265, -28.62651], [-56.54171, -29.11447], [-56.57295, -29.11357], [-56.62789, -29.18073], [-56.81251, -29.48154], [-57.09386, -29.74211], [-57.65132, -30.19229], [-57.22502, -30.26121], [-56.90236, -30.02578], [-56.49267, -30.39471], [-56.4795, -30.3899], [-56.4619, -30.38457], [-55.87388, -31.05053], [-55.58866, -30.84117], [-55.5634, -30.8686], [-55.55373, -30.8732], [-55.55218, -30.88193], [-55.54572, -30.89051], [-55.53431, -30.89714], [-55.53276, -30.90218], [-55.52712, -30.89997], [-55.51862, -30.89828], [-55.50841, -30.9027], [-55.50821, -30.91349], [-54.17384, -31.86168], [-53.76024, -32.0751], [-53.39572, -32.58596], [-53.37671, -32.57005], [-53.1111, -32.71147], [-53.53459, -33.16843], [-53.52794, -33.68908], [-53.44031, -33.69344], [-53.39593, -33.75169], [-53.37138, -33.74313], [-52.83257, -34.01481], [-28.34015, -20.99094], [-28.99601, 1.86593], [-51.35485, 4.8383], [-51.63798, 4.51394], [-51.61983, 4.14596], [-51.79599, 3.89336], [-51.82312, 3.85825], [-51.85573, 3.83427], [-52.31787, 3.17896], [-52.6906, 2.37298], [-52.96539, 2.1881], [-53.78743, 2.34412], [-54.16286, 2.10779], [-54.6084, 2.32856], [-55.01919, 2.564], [-55.71493, 2.40342], [-55.96292, 2.53188], [-56.13054, 2.27723], [-55.92159, 2.05236], [-55.89863, 1.89861], [-55.99278, 1.83137], [-56.47045, 1.95135], [-56.7659, 1.89509], [-57.07092, 1.95304], [-57.09109, 2.01854], [-57.23981, 1.95808], [-57.35073, 1.98327], [-57.55743, 1.69605], [-57.77281, 1.73344], [-57.97336, 1.64566], [-58.01873, 1.51966], [-58.33887, 1.58014], [-58.4858, 1.48399], [-58.53571, 1.29154], [-58.84229, 1.17749], [-58.92072, 1.31293], [-59.25583, 1.40559], [-59.74066, 1.87596], [-59.7264, 2.27497], [-59.91177, 2.36759], [-59.99733, 2.92312], [-59.79769, 3.37162], [-59.86899, 3.57089], [-59.51963, 3.91951], [-59.73353, 4.20399], [-59.69361, 4.34069]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "BS", + iso1A3: "BHS", + iso1N3: "044", + wikidata: "Q778", + nameEn: "The Bahamas", + groups: ["029", "003", "419", "019", "UN"], + driveSide: "left", + roadSpeedUnit: "mph", + callingCodes: ["1 242"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-72.98446, 20.4801], [-71.70065, 25.7637], [-78.91214, 27.76553], [-80.65727, 23.71953], [-72.98446, 20.4801]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "BT", + iso1A3: "BTN", + iso1N3: "064", + wikidata: "Q917", + nameEn: "Bhutan", + groups: ["034", "142", "UN"], + driveSide: "left", + callingCodes: ["975"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[91.6469, 27.76358], [91.5629, 27.84823], [91.48973, 27.93903], [91.46327, 28.0064], [91.25779, 28.07509], [91.20019, 27.98715], [90.69894, 28.07784], [90.58842, 28.02838], [90.13387, 28.19178], [89.79762, 28.23979], [89.59525, 28.16433], [89.12825, 27.62502], [89.0582, 27.60985], [88.97213, 27.51671], [88.95355, 27.4106], [89.00216, 27.32532], [88.96947, 27.30319], [88.93678, 27.33777], [88.91901, 27.32483], [88.74219, 27.144], [88.86984, 27.10937], [88.8714, 26.97488], [88.92301, 26.99286], [88.95807, 26.92668], [89.09554, 26.89089], [89.12825, 26.81661], [89.1926, 26.81329], [89.37913, 26.86224], [89.38319, 26.85963], [89.3901, 26.84225], [89.42349, 26.83727], [89.63369, 26.74402], [89.86124, 26.73307], [90.04535, 26.72422], [90.30402, 26.85098], [90.39271, 26.90704], [90.48504, 26.8594], [90.67715, 26.77215], [91.50067, 26.79223], [91.83181, 26.87318], [92.05523, 26.8692], [92.11863, 26.893], [92.03457, 27.07334], [92.04702, 27.26861], [92.12019, 27.27829], [92.01132, 27.47352], [91.65007, 27.48287], [91.55819, 27.6144], [91.6469, 27.76358]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "BV", + iso1A3: "BVT", + iso1N3: "074", + wikidata: "Q23408", + nameEn: "Bouvet Island", + country: "NO", + groups: ["005", "419", "019", "UN"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[4.54042, -54.0949], [2.28941, -54.13089], [3.35353, -55.17558], [4.54042, -54.0949]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "BW", + iso1A3: "BWA", + iso1N3: "072", + wikidata: "Q963", + nameEn: "Botswana", + groups: ["018", "202", "002", "UN"], + driveSide: "left", + callingCodes: ["267"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[25.26433, -17.79571], [25.16882, -17.78253], [25.05895, -17.84452], [24.95586, -17.79674], [24.73364, -17.89338], [24.71887, -17.9218], [24.6303, -17.9863], [24.57485, -18.07151], [24.40577, -17.95726], [24.19416, -18.01919], [23.61088, -18.4881], [23.29618, -17.99855], [23.0996, -18.00075], [21.45556, -18.31795], [20.99904, -18.31743], [20.99751, -22.00026], [19.99912, -21.99991], [19.99817, -24.76768], [20.02809, -24.78725], [20.03678, -24.81004], [20.29826, -24.94869], [20.64795, -25.47827], [20.86081, -26.14892], [20.61754, -26.4692], [20.63275, -26.78181], [20.68596, -26.9039], [20.87031, -26.80047], [21.13353, -26.86661], [21.37869, -26.82083], [21.69322, -26.86152], [21.7854, -26.79199], [21.77114, -26.69015], [21.83291, -26.65959], [21.90703, -26.66808], [22.06192, -26.61882], [22.21206, -26.3773], [22.41921, -26.23078], [22.56365, -26.19668], [22.70808, -25.99186], [22.86012, -25.50572], [23.03497, -25.29971], [23.47588, -25.29971], [23.9244, -25.64286], [24.18287, -25.62916], [24.36531, -25.773], [24.44703, -25.73021], [24.67319, -25.81749], [24.8946, -25.80723], [25.01718, -25.72507], [25.12266, -25.75931], [25.33076, -25.76616], [25.58543, -25.6343], [25.6643, -25.4491], [25.69661, -25.29284], [25.72702, -25.25503], [25.88571, -24.87802], [25.84295, -24.78661], [25.8515, -24.75727], [26.39409, -24.63468], [26.46346, -24.60358], [26.51667, -24.47219], [26.84165, -24.24885], [26.99749, -23.65486], [27.33768, -23.40917], [27.52393, -23.37952], [27.6066, -23.21894], [27.74154, -23.2137], [27.93539, -23.04941], [27.93729, -22.96194], [28.04752, -22.90243], [28.04562, -22.8394], [28.34874, -22.5694], [28.63287, -22.55887], [28.91889, -22.44299], [29.0151, -22.22907], [29.10881, -22.21202], [29.15268, -22.21399], [29.18974, -22.18599], [29.21955, -22.17771], [29.37703, -22.19581], [29.3533, -22.18363], [29.24648, -22.05967], [29.1974, -22.07472], [29.14501, -22.07275], [29.08495, -22.04867], [29.04108, -22.00563], [29.02191, -21.95665], [29.02191, -21.90647], [29.04023, -21.85864], [29.07763, -21.81877], [28.58114, -21.63455], [28.49942, -21.66634], [28.29416, -21.59037], [28.01669, -21.57624], [27.91407, -21.31621], [27.69171, -21.08409], [27.72972, -20.51735], [27.69361, -20.48531], [27.28865, -20.49873], [27.29831, -20.28935], [27.21278, -20.08244], [26.72246, -19.92707], [26.17227, -19.53709], [25.96226, -19.08152], [25.99837, -19.02943], [25.94326, -18.90362], [25.82353, -18.82808], [25.79217, -18.6355], [25.68859, -18.56165], [25.53465, -18.39041], [25.39972, -18.12691], [25.31799, -18.07091], [25.23909, -17.90832], [25.26433, -17.79571]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "BY", + iso1A3: "BLR", + iso1N3: "112", + wikidata: "Q184", + nameEn: "Belarus", + groups: ["151", "150", "UN"], + callingCodes: ["375"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[28.15217, 56.16964], [27.97865, 56.11849], [27.63065, 55.89687], [27.61683, 55.78558], [27.3541, 55.8089], [27.27804, 55.78299], [27.1559, 55.85032], [26.97153, 55.8102], [26.87448, 55.7172], [26.76872, 55.67658], [26.71802, 55.70645], [26.64888, 55.70515], [26.63231, 55.67968], [26.63167, 55.57887], [26.55094, 55.5093], [26.5522, 55.40277], [26.44937, 55.34832], [26.5709, 55.32572], [26.6714, 55.33902], [26.80929, 55.31642], [26.83266, 55.30444], [26.835, 55.28182], [26.73017, 55.24226], [26.72983, 55.21788], [26.68075, 55.19787], [26.69243, 55.16718], [26.54753, 55.14181], [26.51481, 55.16051], [26.46249, 55.12814], [26.35121, 55.1525], [26.30628, 55.12536], [26.23202, 55.10439], [26.26941, 55.08032], [26.20397, 54.99729], [26.13386, 54.98924], [26.05907, 54.94631], [25.99129, 54.95705], [25.89462, 54.93438], [25.74122, 54.80108], [25.75977, 54.57252], [25.68045, 54.5321], [25.64813, 54.48704], [25.62203, 54.4656], [25.63371, 54.42075], [25.5376, 54.33158], [25.55425, 54.31591], [25.68513, 54.31727], [25.78553, 54.23327], [25.78563, 54.15747], [25.71084, 54.16704], [25.64875, 54.1259], [25.54724, 54.14925], [25.51452, 54.17799], [25.56823, 54.25212], [25.509, 54.30267], [25.35559, 54.26544], [25.22705, 54.26271], [25.19199, 54.219], [25.0728, 54.13419], [24.991, 54.14241], [24.96894, 54.17589], [24.77131, 54.11091], [24.85311, 54.02862], [24.74279, 53.96663], [24.69185, 53.96543], [24.69652, 54.01901], [24.62275, 54.00217], [24.44411, 53.90076], [24.34128, 53.90076], [24.19638, 53.96405], [23.98837, 53.92554], [23.95098, 53.9613], [23.81309, 53.94205], [23.80543, 53.89558], [23.71726, 53.93379], [23.61677, 53.92691], [23.51284, 53.95052], [23.62004, 53.60942], [23.81995, 53.24131], [23.85657, 53.22923], [23.91393, 53.16469], [23.87548, 53.0831], [23.92184, 53.02079], [23.94689, 52.95919], [23.91805, 52.94016], [23.93763, 52.71332], [23.73615, 52.6149], [23.58296, 52.59868], [23.45112, 52.53774], [23.34141, 52.44845], [23.18196, 52.28812], [23.20071, 52.22848], [23.47859, 52.18215], [23.54314, 52.12148], [23.61, 52.11264], [23.64066, 52.07626], [23.68733, 51.9906], [23.61523, 51.92066], [23.62691, 51.78208], [23.53198, 51.74298], [23.57053, 51.55938], [23.56236, 51.53673], [23.62751, 51.50512], [23.6736, 51.50255], [23.60906, 51.62122], [23.7766, 51.66809], [23.91118, 51.63316], [23.8741, 51.59734], [23.99907, 51.58369], [24.13075, 51.66979], [24.3163, 51.75063], [24.29021, 51.80841], [24.37123, 51.88222], [24.98784, 51.91273], [25.20228, 51.97143], [25.46163, 51.92205], [25.73673, 51.91973], [25.80574, 51.94556], [25.83217, 51.92587], [26.00408, 51.92967], [26.19084, 51.86781], [26.39367, 51.87315], [26.46962, 51.80501], [26.69759, 51.82284], [26.80043, 51.75777], [26.9489, 51.73788], [26.99422, 51.76933], [27.20602, 51.77291], [27.20948, 51.66713], [27.26613, 51.65957], [27.24828, 51.60161], [27.47212, 51.61184], [27.51058, 51.5854], [27.55727, 51.63486], [27.71932, 51.60672], [27.67125, 51.50854], [27.76052, 51.47604], [27.85253, 51.62293], [27.91844, 51.61952], [27.95827, 51.56065], [28.10658, 51.57857], [28.23452, 51.66988], [28.37592, 51.54505], [28.47051, 51.59734], [28.64429, 51.5664], [28.69161, 51.44695], [28.73143, 51.46236], [28.75615, 51.41442], [28.78224, 51.45294], [28.76027, 51.48802], [28.81795, 51.55552], [28.95528, 51.59222], [28.99098, 51.56833], [29.1187, 51.65872], [29.16402, 51.64679], [29.20659, 51.56918], [29.25603, 51.57089], [29.25191, 51.49828], [29.32881, 51.37843], [29.42357, 51.4187], [29.49773, 51.39814], [29.54372, 51.48372], [29.7408, 51.53417], [29.77376, 51.4461], [30.17888, 51.51025], [30.34642, 51.42555], [30.36153, 51.33984], [30.56203, 51.25655], [30.64992, 51.35014], [30.51946, 51.59649], [30.68804, 51.82806], [30.76443, 51.89739], [30.90897, 52.00699], [30.95589, 52.07775], [31.13332, 52.1004], [31.25142, 52.04131], [31.38326, 52.12991], [31.7822, 52.11406], [31.77877, 52.18636], [31.6895, 52.1973], [31.70735, 52.26711], [31.57971, 52.32146], [31.62084, 52.33849], [31.61397, 52.48843], [31.56316, 52.51518], [31.63869, 52.55361], [31.50406, 52.69707], [31.57277, 52.71613], [31.592, 52.79011], [31.35667, 52.97854], [31.24147, 53.031], [31.32283, 53.04101], [31.33519, 53.08805], [31.3915, 53.09712], [31.36403, 53.13504], [31.40523, 53.21406], [31.56316, 53.19432], [31.62496, 53.22886], [31.787, 53.18033], [31.82373, 53.10042], [32.15368, 53.07594], [32.40773, 53.18856], [32.51725, 53.28431], [32.73257, 53.33494], [32.74968, 53.45597], [32.47777, 53.5548], [32.40499, 53.6656], [32.50112, 53.68594], [32.45717, 53.74039], [32.36663, 53.7166], [32.12621, 53.81586], [31.89137, 53.78099], [31.77028, 53.80015], [31.85019, 53.91801], [31.88744, 54.03653], [31.89599, 54.0837], [31.57002, 54.14535], [31.30791, 54.25315], [31.3177, 54.34067], [31.22945, 54.46585], [31.08543, 54.50361], [31.21399, 54.63113], [31.19339, 54.66947], [30.99187, 54.67046], [30.98226, 54.68872], [31.0262, 54.70698], [30.97127, 54.71967], [30.95479, 54.74346], [30.75165, 54.80699], [30.8264, 54.90062], [30.81759, 54.94064], [30.93144, 54.9585], [30.95754, 54.98609], [30.9081, 55.02232], [30.94243, 55.03964], [31.00972, 55.02783], [31.02071, 55.06167], [30.97369, 55.17134], [30.87944, 55.28223], [30.81946, 55.27931], [30.8257, 55.3313], [30.93144, 55.3914], [30.90123, 55.46621], [30.95204, 55.50667], [30.93419, 55.6185], [30.86003, 55.63169], [30.7845, 55.58514], [30.72957, 55.66268], [30.67464, 55.64176], [30.63344, 55.73079], [30.51037, 55.76568], [30.51346, 55.78982], [30.48257, 55.81066], [30.30987, 55.83592], [30.27776, 55.86819], [30.12136, 55.8358], [29.97975, 55.87281], [29.80672, 55.79569], [29.61446, 55.77716], [29.51283, 55.70294], [29.3604, 55.75862], [29.44692, 55.95978], [29.21717, 55.98971], [29.08299, 56.03427], [28.73418, 55.97131], [28.63668, 56.07262], [28.68337, 56.10173], [28.5529, 56.11705], [28.43068, 56.09407], [28.37987, 56.11399], [28.36888, 56.05805], [28.30571, 56.06035], [28.15217, 56.16964]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "BZ", + iso1A3: "BLZ", + iso1N3: "084", + wikidata: "Q242", + nameEn: "Belize", + groups: ["013", "003", "419", "019", "UN"], + roadSpeedUnit: "mph", + callingCodes: ["501"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-88.3268, 18.49048], [-88.48242, 18.49164], [-88.71505, 18.0707], [-88.8716, 17.89535], [-89.03839, 18.0067], [-89.15105, 17.95104], [-89.14985, 17.81563], [-89.15025, 17.04813], [-89.22683, 15.88619], [-89.17418, 15.90898], [-89.02415, 15.9063], [-88.95358, 15.88698], [-88.40779, 16.09624], [-86.92368, 17.61462], [-87.84815, 18.18511], [-87.85693, 18.18266], [-87.86657, 18.19971], [-87.87604, 18.18313], [-87.90671, 18.15213], [-88.03165, 18.16657], [-88.03238, 18.41778], [-88.26593, 18.47617], [-88.29909, 18.47591], [-88.3268, 18.49048]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "CA", + iso1A3: "CAN", + iso1N3: "124", + wikidata: "Q16", + nameEn: "Canada", + groups: ["021", "003", "019", "UN"], + callingCodes: ["1"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-67.20349, 45.1722], [-67.19603, 45.16771], [-67.15965, 45.16179], [-67.11316, 45.11176], [-67.0216, 44.95333], [-66.96824, 44.90965], [-66.98249, 44.87071], [-66.96824, 44.83078], [-66.93432, 44.82597], [-67.16117, 44.20069], [-61.98255, 37.34815], [-56.27503, 47.39728], [-53.12387, 41.40385], [-46.37635, 57.3249], [-77.52957, 77.23408], [-68.21821, 80.48551], [-49.33696, 84.57952], [-140.97446, 84.39275], [-141.00116, 60.30648], [-140.5227, 60.22077], [-140.45648, 60.30919], [-139.98024, 60.18027], [-139.68991, 60.33693], [-139.05831, 60.35205], [-139.20603, 60.08896], [-139.05365, 59.99655], [-138.71149, 59.90728], [-138.62145, 59.76431], [-137.60623, 59.24465], [-137.4925, 58.89415], [-136.82619, 59.16198], [-136.52365, 59.16752], [-136.47323, 59.46617], [-136.33727, 59.44466], [-136.22381, 59.55526], [-136.31566, 59.59083], [-135.48007, 59.79937], [-135.03069, 59.56208], [-135.00267, 59.28745], [-134.7047, 59.2458], [-134.55699, 59.1297], [-134.48059, 59.13231], [-134.27175, 58.8634], [-133.84645, 58.73543], [-133.38523, 58.42773], [-131.8271, 56.62247], [-130.77769, 56.36185], [-130.33965, 56.10849], [-130.10173, 56.12178], [-130.00093, 56.00325], [-130.00857, 55.91344], [-130.15373, 55.74895], [-129.97513, 55.28029], [-130.08035, 55.21556], [-130.18765, 55.07744], [-130.27203, 54.97174], [-130.44184, 54.85377], [-130.64499, 54.76912], [-130.61931, 54.70835], [-133.92876, 54.62289], [-133.36909, 48.51151], [-125.03842, 48.53282], [-123.50039, 48.21223], [-123.15614, 48.35395], [-123.26565, 48.6959], [-123.0093, 48.76586], [-123.0093, 48.83186], [-123.32163, 49.00419], [-95.15355, 48.9996], [-95.15357, 49.384], [-95.12903, 49.37056], [-95.05825, 49.35311], [-95.01419, 49.35647], [-94.99532, 49.36579], [-94.95681, 49.37035], [-94.85381, 49.32492], [-94.8159, 49.32299], [-94.82487, 49.29483], [-94.77355, 49.11998], [-94.75017, 49.09931], [-94.687, 48.84077], [-94.70087, 48.8339], [-94.70486, 48.82365], [-94.69669, 48.80918], [-94.69335, 48.77883], [-94.58903, 48.71803], [-94.54885, 48.71543], [-94.53826, 48.70216], [-94.44258, 48.69223], [-94.4174, 48.71049], [-94.27153, 48.70232], [-94.25172, 48.68404], [-94.25104, 48.65729], [-94.23215, 48.65202], [-93.85769, 48.63284], [-93.83288, 48.62745], [-93.80676, 48.58232], [-93.80939, 48.52439], [-93.79267, 48.51631], [-93.66382, 48.51845], [-93.47022, 48.54357], [-93.44472, 48.59147], [-93.40693, 48.60948], [-93.39758, 48.60364], [-93.3712, 48.60599], [-93.33946, 48.62787], [-93.25391, 48.64266], [-92.94973, 48.60866], [-92.7287, 48.54005], [-92.6342, 48.54133], [-92.62747, 48.50278], [-92.69927, 48.49573], [-92.71323, 48.46081], [-92.65606, 48.43471], [-92.50712, 48.44921], [-92.45588, 48.40624], [-92.48147, 48.36609], [-92.37185, 48.22259], [-92.27167, 48.25046], [-92.30939, 48.31251], [-92.26662, 48.35651], [-92.202, 48.35252], [-92.14732, 48.36578], [-92.05339, 48.35958], [-91.98929, 48.25409], [-91.86125, 48.21278], [-91.71231, 48.19875], [-91.70451, 48.11805], [-91.55649, 48.10611], [-91.58025, 48.04339], [-91.45829, 48.07454], [-91.43248, 48.04912], [-91.25025, 48.08522], [-91.08016, 48.18096], [-90.87588, 48.2484], [-90.75045, 48.09143], [-90.56444, 48.12184], [-90.56312, 48.09488], [-90.07418, 48.11043], [-89.89974, 47.98109], [-89.77248, 48.02607], [-89.57972, 48.00023], [-89.48837, 48.01412], [-88.37033, 48.30586], [-84.85871, 46.88881], [-84.55635, 46.45974], [-84.47607, 46.45225], [-84.4481, 46.48972], [-84.42101, 46.49853], [-84.34174, 46.50683], [-84.29893, 46.49127], [-84.26351, 46.49508], [-84.2264, 46.53337], [-84.1945, 46.54061], [-84.17723, 46.52753], [-84.12885, 46.53068], [-84.11196, 46.50248], [-84.13451, 46.39218], [-84.11254, 46.32329], [-84.11615, 46.2681], [-84.09756, 46.25512], [-84.1096, 46.23987], [-83.95399, 46.05634], [-83.90453, 46.05922], [-83.83329, 46.12169], [-83.57017, 46.105], [-83.43746, 45.99749], [-83.59589, 45.82131], [-82.48419, 45.30225], [-82.42469, 42.992], [-82.4146, 42.97626], [-82.4253, 42.95423], [-82.45331, 42.93139], [-82.4826, 42.8068], [-82.46613, 42.76615], [-82.51063, 42.66025], [-82.51858, 42.611], [-82.57583, 42.5718], [-82.58873, 42.54984], [-82.64242, 42.55594], [-82.82964, 42.37355], [-83.02253, 42.33045], [-83.07837, 42.30978], [-83.09837, 42.28877], [-83.12724, 42.2376], [-83.14962, 42.04089], [-83.11184, 41.95671], [-82.67862, 41.67615], [-78.93684, 42.82887], [-78.90712, 42.89733], [-78.90905, 42.93022], [-78.93224, 42.95229], [-78.96312, 42.95509], [-78.98126, 42.97], [-79.02074, 42.98444], [-79.02424, 43.01983], [-78.99941, 43.05612], [-79.01055, 43.06659], [-79.07486, 43.07845], [-79.05671, 43.10937], [-79.06881, 43.12029], [-79.0427, 43.13934], [-79.04652, 43.16396], [-79.05384, 43.17418], [-79.05002, 43.20133], [-79.05544, 43.21224], [-79.05512, 43.25375], [-79.06921, 43.26183], [-79.25796, 43.54052], [-76.79706, 43.63099], [-76.43859, 44.09393], [-76.35324, 44.13493], [-76.31222, 44.19894], [-76.244, 44.19643], [-76.1664, 44.23051], [-76.16285, 44.28262], [-76.00018, 44.34896], [-75.95947, 44.34463], [-75.8217, 44.43176], [-75.76813, 44.51537], [-75.41441, 44.76614], [-75.2193, 44.87821], [-75.01363, 44.95608], [-74.99101, 44.98051], [-74.8447, 45.00606], [-74.66689, 45.00646], [-74.32699, 44.99029], [-73.35025, 45.00942], [-71.50067, 45.01357], [-71.48735, 45.07784], [-71.42778, 45.12624], [-71.40364, 45.21382], [-71.44252, 45.2361], [-71.37133, 45.24624], [-71.29371, 45.29996], [-71.22338, 45.25184], [-71.19723, 45.25438], [-71.14568, 45.24128], [-71.08364, 45.30623], [-71.01866, 45.31573], [-71.0107, 45.34819], [-70.95193, 45.33895], [-70.91169, 45.29849], [-70.89864, 45.2398], [-70.84816, 45.22698], [-70.80236, 45.37444], [-70.82638, 45.39828], [-70.78372, 45.43269], [-70.65383, 45.37592], [-70.62518, 45.42286], [-70.72651, 45.49771], [-70.68516, 45.56964], [-70.54019, 45.67291], [-70.38934, 45.73215], [-70.41523, 45.79497], [-70.25976, 45.89675], [-70.24694, 45.95138], [-70.31025, 45.96424], [-70.23855, 46.1453], [-70.29078, 46.18832], [-70.18547, 46.35357], [-70.05812, 46.41768], [-69.99966, 46.69543], [-69.22119, 47.46461], [-69.05148, 47.42012], [-69.05073, 47.30076], [-69.05039, 47.2456], [-68.89222, 47.1807], [-68.70125, 47.24399], [-68.60575, 47.24659], [-68.57914, 47.28431], [-68.38332, 47.28723], [-68.37458, 47.35851], [-68.23244, 47.35712], [-67.94843, 47.1925], [-67.87993, 47.10377], [-67.78578, 47.06473], [-67.78111, 45.9392], [-67.75196, 45.91814], [-67.80961, 45.87531], [-67.75654, 45.82324], [-67.80653, 45.80022], [-67.80705, 45.69528], [-67.6049, 45.60725], [-67.43815, 45.59162], [-67.42144, 45.50584], [-67.50578, 45.48971], [-67.42394, 45.37969], [-67.48201, 45.27351], [-67.34927, 45.122], [-67.29754, 45.14865], [-67.29748, 45.18173], [-67.27039, 45.1934], [-67.22751, 45.16344], [-67.20349, 45.1722]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "CC", + iso1A3: "CCK", + iso1N3: "166", + wikidata: "Q36004", + nameEn: "Cocos (Keeling) Islands", + country: "AU", + groups: ["053", "009", "UN"], + driveSide: "left", + callingCodes: ["61"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[96.61846, -10.82438], [96.02343, -12.68334], [97.93979, -12.33309], [96.61846, -10.82438]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "CD", + iso1A3: "COD", + iso1N3: "180", + wikidata: "Q974", + nameEn: "Democratic Republic of the Congo", + aliases: ["ZR"], + groups: ["017", "202", "002", "UN"], + callingCodes: ["243"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[27.44012, 5.07349], [27.09575, 5.22305], [26.93064, 5.13535], [26.85579, 5.03887], [26.74572, 5.10685], [26.48595, 5.04984], [26.13371, 5.25594], [25.86073, 5.19455], [25.53271, 5.37431], [25.34558, 5.29101], [25.31256, 5.03668], [24.71816, 4.90509], [24.46719, 5.0915], [23.38847, 4.60013], [22.94817, 4.82392], [22.89094, 4.79321], [22.84691, 4.69887], [22.78526, 4.71423], [22.6928, 4.47285], [22.60915, 4.48821], [22.5431, 4.22041], [22.45504, 4.13039], [22.27682, 4.11347], [22.10721, 4.20723], [21.6405, 4.317], [21.55904, 4.25553], [21.25744, 4.33676], [21.21341, 4.29285], [21.11214, 4.33895], [21.08793, 4.39603], [20.90383, 4.44877], [20.60184, 4.42394], [18.62755, 3.47564], [18.63857, 3.19342], [18.10683, 2.26876], [18.08034, 1.58553], [17.85887, 1.04327], [17.86989, 0.58873], [17.95255, 0.48128], [17.93877, 0.32424], [17.81204, 0.23884], [17.66051, -0.26535], [17.72112, -0.52707], [17.32438, -0.99265], [16.97999, -1.12762], [16.70724, -1.45815], [16.50336, -1.8795], [16.16173, -2.16586], [16.22785, -2.59528], [16.1755, -3.25014], [16.21407, -3.2969], [15.89448, -3.9513], [15.53081, -4.042], [15.48121, -4.22062], [15.41785, -4.28381], [15.32693, -4.27282], [15.25411, -4.31121], [15.1978, -4.32388], [14.83101, -4.80838], [14.67948, -4.92093], [14.5059, -4.84956], [14.41499, -4.8825], [14.37366, -4.56125], [14.47284, -4.42941], [14.3957, -4.36623], [14.40672, -4.28381], [13.9108, -4.50906], [13.81162, -4.41842], [13.71794, -4.44864], [13.70417, -4.72601], [13.50305, -4.77818], [13.41764, -4.89897], [13.11182, -4.5942], [13.09648, -4.63739], [13.11195, -4.67745], [12.8733, -4.74346], [12.70868, -4.95505], [12.63465, -4.94632], [12.60251, -5.01715], [12.46297, -5.09408], [12.49815, -5.14058], [12.51589, -5.1332], [12.53586, -5.14658], [12.53599, -5.1618], [12.52301, -5.17481], [12.52318, -5.74353], [12.26557, -5.74031], [12.20376, -5.76338], [11.95767, -5.94705], [12.42245, -6.07585], [13.04371, -5.87078], [16.55507, -5.85631], [16.96282, -7.21787], [17.5828, -8.13784], [18.33635, -8.00126], [19.33698, -7.99743], [19.5469, -7.00195], [20.30218, -6.98955], [20.31846, -6.91953], [20.61689, -6.90876], [20.56263, -7.28566], [21.79824, -7.29628], [21.84856, -9.59871], [22.19039, -9.94628], [22.32604, -10.76291], [22.17954, -10.85884], [22.25951, -11.24911], [22.54205, -11.05784], [23.16602, -11.10577], [23.45631, -10.946], [23.86868, -11.02856], [24.00027, -10.89356], [24.34528, -11.06816], [24.42612, -11.44975], [25.34069, -11.19707], [25.33058, -11.65767], [26.01777, -11.91488], [26.88687, -12.01868], [27.04351, -11.61312], [27.22541, -11.60323], [27.21025, -11.76157], [27.59932, -12.22123], [28.33199, -12.41375], [29.01918, -13.41353], [29.60531, -13.21685], [29.65078, -13.41844], [29.81551, -13.44683], [29.8139, -12.14898], [29.48404, -12.23604], [29.4992, -12.43843], [29.18592, -12.37921], [28.48357, -11.87532], [28.37241, -11.57848], [28.65032, -10.65133], [28.62795, -9.92942], [28.68532, -9.78], [28.56208, -9.49122], [28.51627, -9.44726], [28.52636, -9.35379], [28.36562, -9.30091], [28.38526, -9.23393], [28.9711, -8.66935], [28.88917, -8.4831], [30.79243, -8.27382], [30.2567, -7.14121], [29.52552, -6.2731], [29.43673, -4.44845], [29.23708, -3.75856], [29.21463, -3.3514], [29.25633, -3.05471], [29.17258, -2.99385], [29.16037, -2.95457], [29.09797, -2.91935], [29.09119, -2.87871], [29.0505, -2.81774], [29.00404, -2.81978], [29.00167, -2.78523], [29.04081, -2.7416], [29.00357, -2.70596], [28.94346, -2.69124], [28.89793, -2.66111], [28.90226, -2.62385], [28.89288, -2.55848], [28.87943, -2.55165], [28.86193, -2.53185], [28.86209, -2.5231], [28.87497, -2.50887], [28.88846, -2.50493], [28.89342, -2.49017], [28.89132, -2.47557], [28.86846, -2.44866], [28.86826, -2.41888], [28.89601, -2.37321], [28.95642, -2.37321], [29.00051, -2.29001], [29.105, -2.27043], [29.17562, -2.12278], [29.11847, -1.90576], [29.24458, -1.69663], [29.24323, -1.66826], [29.36322, -1.50887], [29.45038, -1.5054], [29.53062, -1.40499], [29.59061, -1.39016], [29.58388, -0.89821], [29.63006, -0.8997], [29.62708, -0.71055], [29.67176, -0.55714], [29.67474, -0.47969], [29.65091, -0.46777], [29.72687, -0.08051], [29.7224, 0.07291], [29.77454, 0.16675], [29.81922, 0.16824], [29.87284, 0.39166], [29.97413, 0.52124], [29.95477, 0.64486], [29.98307, 0.84295], [30.1484, 0.89805], [30.22139, 0.99635], [30.24671, 1.14974], [30.48503, 1.21675], [31.30127, 2.11006], [31.28042, 2.17853], [31.20148, 2.2217], [31.1985, 2.29462], [31.12104, 2.27676], [31.07934, 2.30207], [31.06593, 2.35862], [30.96911, 2.41071], [30.91102, 2.33332], [30.83059, 2.42559], [30.74271, 2.43601], [30.75612, 2.5863], [30.8857, 2.83923], [30.8574, 2.9508], [30.77101, 3.04897], [30.84251, 3.26908], [30.93486, 3.40737], [30.94081, 3.50847], [30.85153, 3.48867], [30.85997, 3.5743], [30.80713, 3.60506], [30.78512, 3.67097], [30.56277, 3.62703], [30.57378, 3.74567], [30.55396, 3.84451], [30.47691, 3.83353], [30.27658, 3.95653], [30.22374, 3.93896], [30.1621, 4.10586], [30.06964, 4.13221], [29.79666, 4.37809], [29.82087, 4.56246], [29.49726, 4.7007], [29.43341, 4.50101], [29.22207, 4.34297], [29.03054, 4.48784], [28.8126, 4.48784], [28.6651, 4.42638], [28.20719, 4.35614], [27.79551, 4.59976], [27.76469, 4.79284], [27.65462, 4.89375], [27.56656, 4.89375], [27.44012, 5.07349]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "CF", + iso1A3: "CAF", + iso1N3: "140", + wikidata: "Q929", + nameEn: "Central African Republic", + groups: ["017", "202", "002", "UN"], + callingCodes: ["236"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[22.87758, 10.91915], [22.45889, 11.00246], [21.72139, 10.64136], [21.71479, 10.29932], [21.63553, 10.217], [21.52766, 10.2105], [21.34934, 9.95907], [21.26348, 9.97642], [20.82979, 9.44696], [20.36748, 9.11019], [19.06421, 9.00367], [18.86388, 8.87971], [19.11044, 8.68172], [18.79783, 8.25929], [18.67455, 8.22226], [18.62612, 8.14163], [18.64153, 8.08714], [18.6085, 8.05009], [18.02731, 8.01085], [17.93926, 7.95853], [17.67288, 7.98905], [16.8143, 7.53971], [16.6668, 7.67281], [16.658, 7.75353], [16.59415, 7.76444], [16.58315, 7.88657], [16.41583, 7.77971], [16.40703, 7.68809], [15.79942, 7.44149], [15.73118, 7.52006], [15.49743, 7.52179], [15.23397, 7.25135], [15.04717, 6.77085], [14.96311, 6.75693], [14.79966, 6.39043], [14.80122, 6.34866], [14.74206, 6.26356], [14.56149, 6.18928], [14.43073, 6.08867], [14.42917, 6.00508], [14.49455, 5.91683], [14.60974, 5.91838], [14.62375, 5.70466], [14.58951, 5.59777], [14.62531, 5.51411], [14.52724, 5.28319], [14.57083, 5.23979], [14.65489, 5.21343], [14.73383, 4.6135], [15.00825, 4.41458], [15.08609, 4.30282], [15.10644, 4.1362], [15.17482, 4.05131], [15.07686, 4.01805], [15.73522, 3.24348], [15.77725, 3.26835], [16.05449, 3.02306], [16.08252, 2.45708], [16.19357, 2.21537], [16.50126, 2.84739], [16.46701, 2.92512], [16.57598, 3.47999], [16.68283, 3.54257], [17.01746, 3.55136], [17.35649, 3.63045], [17.46876, 3.70515], [17.60966, 3.63705], [17.83421, 3.61068], [17.85842, 3.53378], [18.05656, 3.56893], [18.14902, 3.54476], [18.17323, 3.47665], [18.24148, 3.50302], [18.2723, 3.57992], [18.39558, 3.58212], [18.49245, 3.63924], [18.58711, 3.49423], [18.62755, 3.47564], [20.60184, 4.42394], [20.90383, 4.44877], [21.08793, 4.39603], [21.11214, 4.33895], [21.21341, 4.29285], [21.25744, 4.33676], [21.55904, 4.25553], [21.6405, 4.317], [22.10721, 4.20723], [22.27682, 4.11347], [22.45504, 4.13039], [22.5431, 4.22041], [22.60915, 4.48821], [22.6928, 4.47285], [22.78526, 4.71423], [22.84691, 4.69887], [22.89094, 4.79321], [22.94817, 4.82392], [23.38847, 4.60013], [24.46719, 5.0915], [24.71816, 4.90509], [25.31256, 5.03668], [25.34558, 5.29101], [25.53271, 5.37431], [25.86073, 5.19455], [26.13371, 5.25594], [26.48595, 5.04984], [26.74572, 5.10685], [26.85579, 5.03887], [26.93064, 5.13535], [27.09575, 5.22305], [27.44012, 5.07349], [27.26886, 5.25876], [27.23017, 5.37167], [27.28621, 5.56382], [27.22705, 5.62889], [27.22705, 5.71254], [26.51721, 6.09655], [26.58259, 6.1987], [26.32729, 6.36272], [26.38022, 6.63493], [25.90076, 7.09549], [25.37461, 7.33024], [25.35281, 7.42595], [25.20337, 7.50312], [25.20649, 7.61115], [25.29214, 7.66675], [25.25319, 7.8487], [24.98855, 7.96588], [24.85156, 8.16933], [24.35965, 8.26177], [24.13238, 8.36959], [24.25691, 8.69288], [23.51905, 8.71749], [23.59065, 8.99743], [23.44744, 8.99128], [23.4848, 9.16959], [23.56263, 9.19418], [23.64358, 9.28637], [23.64981, 9.44303], [23.62179, 9.53823], [23.69155, 9.67566], [23.67164, 9.86923], [23.3128, 10.45214], [23.02221, 10.69235], [22.87758, 10.91915]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "CG", + iso1A3: "COG", + iso1N3: "178", + wikidata: "Q971", + nameEn: "Republic of the Congo", + groups: ["017", "202", "002", "UN"], + callingCodes: ["242"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[18.62755, 3.47564], [18.58711, 3.49423], [18.49245, 3.63924], [18.39558, 3.58212], [18.2723, 3.57992], [18.24148, 3.50302], [18.17323, 3.47665], [18.14902, 3.54476], [18.05656, 3.56893], [17.85842, 3.53378], [17.83421, 3.61068], [17.60966, 3.63705], [17.46876, 3.70515], [17.35649, 3.63045], [17.01746, 3.55136], [16.68283, 3.54257], [16.57598, 3.47999], [16.46701, 2.92512], [16.50126, 2.84739], [16.19357, 2.21537], [16.15568, 2.18955], [16.08563, 2.19733], [16.05294, 1.9811], [16.14634, 1.70259], [16.02647, 1.65591], [16.02959, 1.76483], [15.48942, 1.98265], [15.34776, 1.91264], [15.22634, 2.03243], [15.00996, 1.98887], [14.61145, 2.17866], [13.29457, 2.16106], [13.13461, 1.57238], [13.25447, 1.32339], [13.15519, 1.23368], [13.89582, 1.4261], [14.25186, 1.39842], [14.48179, 0.9152], [14.26066, 0.57255], [14.10909, 0.58563], [13.88648, 0.26652], [13.90632, -0.2287], [14.06862, -0.20826], [14.2165, -0.38261], [14.41887, -0.44799], [14.52569, -0.57818], [14.41838, -1.89412], [14.25932, -1.97624], [14.23518, -2.15671], [14.16202, -2.23916], [14.23829, -2.33715], [14.10442, -2.49268], [13.85846, -2.46935], [13.92073, -2.35581], [13.75884, -2.09293], [13.47977, -2.43224], [13.02759, -2.33098], [12.82172, -1.91091], [12.61312, -1.8129], [12.44656, -1.92025], [12.47925, -2.32626], [12.04895, -2.41704], [11.96866, -2.33559], [11.74605, -2.39936], [11.57637, -2.33379], [11.64487, -2.61865], [11.5359, -2.85654], [11.64798, -2.81146], [11.80365, -3.00424], [11.70558, -3.0773], [11.70227, -3.17465], [11.96554, -3.30267], [11.8318, -3.5812], [11.92719, -3.62768], [11.87083, -3.71571], [11.68608, -3.68942], [11.57949, -3.52798], [11.48764, -3.51089], [11.22301, -3.69888], [11.12647, -3.94169], [10.75913, -4.39519], [11.50888, -5.33417], [12.00924, -5.02627], [12.16068, -4.90089], [12.20901, -4.75642], [12.25587, -4.79437], [12.32324, -4.78415], [12.40964, -4.60609], [12.64835, -4.55937], [12.76844, -4.38709], [12.87096, -4.40315], [12.91489, -4.47907], [13.09648, -4.63739], [13.11182, -4.5942], [13.41764, -4.89897], [13.50305, -4.77818], [13.70417, -4.72601], [13.71794, -4.44864], [13.81162, -4.41842], [13.9108, -4.50906], [14.40672, -4.28381], [14.3957, -4.36623], [14.47284, -4.42941], [14.37366, -4.56125], [14.41499, -4.8825], [14.5059, -4.84956], [14.67948, -4.92093], [14.83101, -4.80838], [15.1978, -4.32388], [15.25411, -4.31121], [15.32693, -4.27282], [15.41785, -4.28381], [15.48121, -4.22062], [15.53081, -4.042], [15.89448, -3.9513], [16.21407, -3.2969], [16.1755, -3.25014], [16.22785, -2.59528], [16.16173, -2.16586], [16.50336, -1.8795], [16.70724, -1.45815], [16.97999, -1.12762], [17.32438, -0.99265], [17.72112, -0.52707], [17.66051, -0.26535], [17.81204, 0.23884], [17.93877, 0.32424], [17.95255, 0.48128], [17.86989, 0.58873], [17.85887, 1.04327], [18.08034, 1.58553], [18.10683, 2.26876], [18.63857, 3.19342], [18.62755, 3.47564]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "CH", + iso1A3: "CHE", + iso1N3: "756", + wikidata: "Q39", + nameEn: "Switzerland", + groups: ["155", "150", "UN"], + callingCodes: ["41"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[8.72809, 47.69282], [8.72617, 47.69651], [8.73671, 47.7169], [8.70543, 47.73121], [8.74251, 47.75168], [8.71778, 47.76571], [8.68985, 47.75686], [8.68022, 47.78599], [8.65292, 47.80066], [8.64425, 47.76398], [8.62408, 47.7626], [8.61657, 47.79998], [8.56415, 47.80633], [8.56814, 47.78001], [8.48868, 47.77215], [8.45771, 47.7493], [8.44807, 47.72426], [8.40569, 47.69855], [8.4211, 47.68407], [8.40473, 47.67499], [8.41346, 47.66676], [8.42264, 47.66667], [8.44711, 47.65379], [8.4667, 47.65747], [8.46605, 47.64103], [8.49656, 47.64709], [8.5322, 47.64687], [8.52801, 47.66059], [8.56141, 47.67088], [8.57683, 47.66158], [8.6052, 47.67258], [8.61113, 47.66332], [8.62884, 47.65098], [8.62049, 47.63757], [8.60412, 47.63735], [8.61471, 47.64514], [8.60701, 47.65271], [8.59545, 47.64298], [8.60348, 47.61204], [8.57586, 47.59537], [8.55756, 47.62394], [8.51686, 47.63476], [8.50747, 47.61897], [8.45578, 47.60121], [8.46637, 47.58389], [8.48949, 47.588], [8.49431, 47.58107], [8.43235, 47.56617], [8.39477, 47.57826], [8.38273, 47.56608], [8.32735, 47.57133], [8.30277, 47.58607], [8.29524, 47.5919], [8.29722, 47.60603], [8.2824, 47.61225], [8.26313, 47.6103], [8.25863, 47.61571], [8.23809, 47.61204], [8.22577, 47.60385], [8.22011, 47.6181], [8.20617, 47.62141], [8.19378, 47.61636], [8.1652, 47.5945], [8.14947, 47.59558], [8.13823, 47.59147], [8.13662, 47.58432], [8.11543, 47.5841], [8.10395, 47.57918], [8.10002, 47.56504], [8.08557, 47.55768], [8.06663, 47.56374], [8.04383, 47.55443], [8.02136, 47.55096], [8.00113, 47.55616], [7.97581, 47.55493], [7.95682, 47.55789], [7.94494, 47.54511], [7.91251, 47.55031], [7.90673, 47.57674], [7.88664, 47.58854], [7.84412, 47.5841], [7.81901, 47.58798], [7.79486, 47.55691], [7.75261, 47.54599], [7.71961, 47.54219], [7.69642, 47.53297], [7.68101, 47.53232], [7.6656, 47.53752], [7.66174, 47.54554], [7.65083, 47.54662], [7.63338, 47.56256], [7.67655, 47.56435], [7.68904, 47.57133], [7.67115, 47.5871], [7.68486, 47.59601], [7.69385, 47.60099], [7.68229, 47.59905], [7.67395, 47.59212], [7.64599, 47.59695], [7.64213, 47.5944], [7.64309, 47.59151], [7.61929, 47.57683], [7.60459, 47.57869], [7.60523, 47.58519], [7.58945, 47.59017], [7.58386, 47.57536], [7.56684, 47.57785], [7.56548, 47.57617], [7.55689, 47.57232], [7.55652, 47.56779], [7.53634, 47.55553], [7.52831, 47.55347], [7.51723, 47.54578], [7.50873, 47.54546], [7.49691, 47.53821], [7.50588, 47.52856], [7.51904, 47.53515], [7.53199, 47.5284], [7.5229, 47.51644], [7.49804, 47.51798], [7.51076, 47.49651], [7.47534, 47.47932], [7.43356, 47.49712], [7.42923, 47.48628], [7.4583, 47.47216], [7.4462, 47.46264], [7.43088, 47.45846], [7.40308, 47.43638], [7.35603, 47.43432], [7.33526, 47.44186], [7.24669, 47.4205], [7.17026, 47.44312], [7.19583, 47.49455], [7.16249, 47.49025], [7.12781, 47.50371], [7.07425, 47.48863], [7.0231, 47.50522], [6.98425, 47.49432], [7.0024, 47.45264], [6.93953, 47.43388], [6.93744, 47.40714], [6.88542, 47.37262], [6.87959, 47.35335], [7.03125, 47.36996], [7.0564, 47.35134], [7.05305, 47.33304], [6.94316, 47.28747], [6.95108, 47.26428], [6.9508, 47.24338], [6.8489, 47.15933], [6.76788, 47.1208], [6.68823, 47.06616], [6.71531, 47.0494], [6.43341, 46.92703], [6.46456, 46.88865], [6.43216, 46.80336], [6.45209, 46.77502], [6.38351, 46.73171], [6.27135, 46.68251], [6.11084, 46.57649], [6.1567, 46.54402], [6.07269, 46.46244], [6.08427, 46.44305], [6.06407, 46.41676], [6.09926, 46.40768], [6.15016, 46.3778], [6.15985, 46.37721], [6.16987, 46.36759], [6.15738, 46.3491], [6.13876, 46.33844], [6.1198, 46.31157], [6.11697, 46.29547], [6.1013, 46.28512], [6.11926, 46.2634], [6.12446, 46.25059], [6.10071, 46.23772], [6.08563, 46.24651], [6.07072, 46.24085], [6.0633, 46.24583], [6.05029, 46.23518], [6.04602, 46.23127], [6.03342, 46.2383], [6.02461, 46.23313], [5.97542, 46.21525], [5.96515, 46.19638], [5.99573, 46.18587], [5.98846, 46.17046], [5.98188, 46.17392], [5.97508, 46.15863], [5.9641, 46.14412], [5.95781, 46.12925], [5.97893, 46.13303], [5.9871, 46.14499], [6.01791, 46.14228], [6.03614, 46.13712], [6.04564, 46.14031], [6.05203, 46.15191], [6.07491, 46.14879], [6.09199, 46.15191], [6.09926, 46.14373], [6.13397, 46.1406], [6.15305, 46.15194], [6.18116, 46.16187], [6.18871, 46.16644], [6.18707, 46.17999], [6.19552, 46.18401], [6.19807, 46.18369], [6.20539, 46.19163], [6.21114, 46.1927], [6.21273, 46.19409], [6.21603, 46.19507], [6.21844, 46.19837], [6.22222, 46.19888], [6.22175, 46.20045], [6.23544, 46.20714], [6.23913, 46.20511], [6.24821, 46.20531], [6.26007, 46.21165], [6.27694, 46.21566], [6.29663, 46.22688], [6.31041, 46.24417], [6.29474, 46.26221], [6.26749, 46.24745], [6.24952, 46.26255], [6.23775, 46.27822], [6.25137, 46.29014], [6.24826, 46.30175], [6.21981, 46.31304], [6.25432, 46.3632], [6.53358, 46.45431], [6.82312, 46.42661], [6.8024, 46.39171], [6.77152, 46.34784], [6.86052, 46.28512], [6.78968, 46.14058], [6.89321, 46.12548], [6.87868, 46.03855], [6.93862, 46.06502], [7.00946, 45.9944], [7.04151, 45.92435], [7.10685, 45.85653], [7.56343, 45.97421], [7.85949, 45.91485], [7.9049, 45.99945], [7.98881, 45.99867], [8.02906, 46.10331], [8.11383, 46.11577], [8.16866, 46.17817], [8.08814, 46.26692], [8.31162, 46.38044], [8.30648, 46.41587], [8.42464, 46.46367], [8.46317, 46.43712], [8.45032, 46.26869], [8.62242, 46.12112], [8.75697, 46.10395], [8.80778, 46.10085], [8.85617, 46.0748], [8.79414, 46.00913], [8.78585, 45.98973], [8.79362, 45.99207], [8.8319, 45.9879], [8.85121, 45.97239], [8.86688, 45.96135], [8.88904, 45.95465], [8.93649, 45.86775], [8.94372, 45.86587], [8.93504, 45.86245], [8.91129, 45.8388], [8.94737, 45.84285], [8.9621, 45.83707], [8.99663, 45.83466], [9.00324, 45.82055], [9.0298, 45.82127], [9.03279, 45.82865], [9.03793, 45.83548], [9.03505, 45.83976], [9.04059, 45.8464], [9.04546, 45.84968], [9.06642, 45.8761], [9.09065, 45.89906], [8.99257, 45.9698], [9.01618, 46.04928], [9.24503, 46.23616], [9.29226, 46.32717], [9.25502, 46.43743], [9.28136, 46.49685], [9.36128, 46.5081], [9.40487, 46.46621], [9.45936, 46.50873], [9.46117, 46.37481], [9.57015, 46.2958], [9.71273, 46.29266], [9.73086, 46.35071], [9.95249, 46.38045], [10.07055, 46.21668], [10.14439, 46.22992], [10.17862, 46.25626], [10.10506, 46.3372], [10.165, 46.41051], [10.03715, 46.44479], [10.10307, 46.61003], [10.23674, 46.63484], [10.25309, 46.57432], [10.46136, 46.53164], [10.49375, 46.62049], [10.44686, 46.64162], [10.40475, 46.63671], [10.38659, 46.67847], [10.47197, 46.85698], [10.48376, 46.93891], [10.36933, 47.00212], [10.30031, 46.92093], [10.24128, 46.93147], [10.22675, 46.86942], [10.10715, 46.84296], [9.98058, 46.91434], [9.88266, 46.93343], [9.87935, 47.01337], [9.60717, 47.06091], [9.55721, 47.04762], [9.54041, 47.06495], [9.47548, 47.05257], [9.47139, 47.06402], [9.51362, 47.08505], [9.52089, 47.10019], [9.51044, 47.13727], [9.48774, 47.17402], [9.4891, 47.19346], [9.50318, 47.22153], [9.52406, 47.24959], [9.53116, 47.27029], [9.54773, 47.2809], [9.55857, 47.29919], [9.58513, 47.31334], [9.59978, 47.34671], [9.62476, 47.36639], [9.65427, 47.36824], [9.66243, 47.37136], [9.6711, 47.37824], [9.67445, 47.38429], [9.67334, 47.39191], [9.6629, 47.39591], [9.65136, 47.40504], [9.65043, 47.41937], [9.6446, 47.43233], [9.64483, 47.43842], [9.65863, 47.44847], [9.65728, 47.45383], [9.6423, 47.45599], [9.62475, 47.45685], [9.62158, 47.45858], [9.60841, 47.47178], [9.60484, 47.46358], [9.60205, 47.46165], [9.59482, 47.46305], [9.58208, 47.48344], [9.56312, 47.49495], [9.55125, 47.53629], [9.25619, 47.65939], [9.18203, 47.65598], [9.17593, 47.65399], [9.1755, 47.65584], [9.1705, 47.65513], [9.15181, 47.66904], [9.13845, 47.66389], [9.09891, 47.67801], [9.02093, 47.6868], [8.94093, 47.65596], [8.89946, 47.64769], [8.87625, 47.65441], [8.87383, 47.67045], [8.85065, 47.68209], [8.86989, 47.70504], [8.82002, 47.71458], [8.80663, 47.73821], [8.77309, 47.72059], [8.76965, 47.7075], [8.79966, 47.70222], [8.79511, 47.67462], [8.75856, 47.68969], [8.72809, 47.69282]], [[8.95861, 45.96485], [8.96668, 45.98436], [8.97741, 45.98317], [8.97604, 45.96151], [8.95861, 45.96485]], [[8.70847, 47.68904], [8.68985, 47.69552], [8.66837, 47.68437], [8.65769, 47.68928], [8.67508, 47.6979], [8.66416, 47.71367], [8.70237, 47.71453], [8.71773, 47.69088], [8.70847, 47.68904]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "CI", + iso1A3: "CIV", + iso1N3: "384", + wikidata: "Q1008", + nameEn: "C\xF4te d'Ivoire", + groups: ["011", "202", "002", "UN"], + callingCodes: ["225"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-7.52774, 3.7105], [-3.34019, 4.17519], [-3.10675, 5.08515], [-3.11073, 5.12675], [-3.063, 5.13665], [-2.96554, 5.10397], [-2.95261, 5.12477], [-2.75502, 5.10657], [-2.73074, 5.1364], [-2.77625, 5.34621], [-2.72737, 5.34789], [-2.76614, 5.60963], [-2.85378, 5.65156], [-2.93132, 5.62137], [-2.96671, 5.6415], [-2.95323, 5.71865], [-3.01896, 5.71697], [-3.25999, 6.62521], [-3.21954, 6.74407], [-3.23327, 6.81744], [-2.95438, 7.23737], [-2.97822, 7.27165], [-2.92339, 7.60847], [-2.79467, 7.86002], [-2.78395, 7.94974], [-2.74819, 7.92613], [-2.67787, 8.02055], [-2.61232, 8.02645], [-2.62901, 8.11495], [-2.49037, 8.20872], [-2.58243, 8.7789], [-2.66357, 9.01771], [-2.77799, 9.04949], [-2.69814, 9.22717], [-2.68802, 9.49343], [-2.76494, 9.40778], [-2.93012, 9.57403], [-3.00765, 9.74019], [-3.16609, 9.85147], [-3.19306, 9.93781], [-3.27228, 9.84981], [-3.31779, 9.91125], [-3.69703, 9.94279], [-4.25999, 9.76012], [-4.31392, 9.60062], [-4.6426, 9.70696], [-4.96621, 9.89132], [-4.96453, 9.99923], [-5.12465, 10.29788], [-5.39602, 10.2929], [-5.51058, 10.43177], [-5.65135, 10.46767], [-5.78124, 10.43952], [-5.99478, 10.19694], [-6.18851, 10.24244], [-6.1731, 10.46983], [-6.24795, 10.74248], [-6.325, 10.68624], [-6.40646, 10.69922], [-6.42847, 10.5694], [-6.52974, 10.59104], [-6.63541, 10.66893], [-6.68164, 10.35074], [-6.93921, 10.35291], [-7.01186, 10.25111], [-6.97444, 10.21644], [-7.00966, 10.15794], [-7.0603, 10.14711], [-7.13331, 10.24877], [-7.3707, 10.24677], [-7.44555, 10.44602], [-7.52261, 10.4655], [-7.54462, 10.40921], [-7.63048, 10.46334], [-7.92107, 10.15577], [-7.97971, 10.17117], [-8.01225, 10.1021], [-8.11921, 10.04577], [-8.15652, 9.94288], [-8.09434, 9.86936], [-8.14657, 9.55062], [-8.03463, 9.39604], [-7.85056, 9.41812], [-7.90777, 9.20456], [-7.73862, 9.08422], [-7.92518, 8.99332], [-7.95503, 8.81146], [-7.69882, 8.66148], [-7.65653, 8.36873], [-7.92518, 8.50652], [-8.22991, 8.48438], [-8.2411, 8.24196], [-8.062, 8.16071], [-7.98675, 8.20134], [-7.99919, 8.11023], [-7.94695, 8.00925], [-8.06449, 8.04989], [-8.13414, 7.87991], [-8.09931, 7.78626], [-8.21374, 7.54466], [-8.4003, 7.6285], [-8.47114, 7.55676], [-8.41935, 7.51203], [-8.37458, 7.25794], [-8.29249, 7.1691], [-8.31736, 6.82837], [-8.59456, 6.50612], [-8.48652, 6.43797], [-8.45666, 6.49977], [-8.38453, 6.35887], [-8.3298, 6.36381], [-8.17557, 6.28222], [-8.00642, 6.31684], [-7.90692, 6.27728], [-7.83478, 6.20309], [-7.8497, 6.08932], [-7.79747, 6.07696], [-7.78254, 5.99037], [-7.70294, 5.90625], [-7.67309, 5.94337], [-7.48155, 5.80974], [-7.46165, 5.84934], [-7.43677, 5.84687], [-7.43926, 5.74787], [-7.37209, 5.61173], [-7.43428, 5.42355], [-7.36463, 5.32944], [-7.46165, 5.26256], [-7.48901, 5.14118], [-7.55369, 5.08667], [-7.53876, 4.94294], [-7.59349, 4.8909], [-7.53259, 4.35145], [-7.52774, 3.7105]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "CK", + iso1A3: "COK", + iso1N3: "184", + wikidata: "Q26988", + nameEn: "Cook Islands", + country: "NZ", + groups: ["061", "009", "UN"], + driveSide: "left", + callingCodes: ["682"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-168.15106, -10.26955], [-156.45576, -31.75456], [-156.48634, -15.52824], [-156.50903, -7.4975], [-168.15106, -10.26955]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "CL", + iso1A3: "CHL", + iso1N3: "152", + wikidata: "Q298", + nameEn: "Chile", + groups: ["005", "419", "019", "UN"], + callingCodes: ["56"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-68.60702, -52.65781], [-68.41683, -52.33516], [-69.97824, -52.00845], [-71.99889, -51.98018], [-72.33873, -51.59954], [-72.31343, -50.58411], [-73.15765, -50.78337], [-73.55259, -49.92488], [-73.45156, -49.79461], [-73.09655, -49.14342], [-72.56894, -48.81116], [-72.54042, -48.52392], [-72.27662, -48.28727], [-72.50478, -47.80586], [-71.94152, -47.13595], [-71.68577, -46.55385], [-71.75614, -45.61611], [-71.35687, -45.22075], [-72.06985, -44.81756], [-71.26418, -44.75684], [-71.16436, -44.46244], [-71.81318, -44.38097], [-71.64206, -43.64774], [-72.14828, -42.85321], [-72.15541, -42.15941], [-71.74901, -42.11711], [-71.92726, -40.72714], [-71.37826, -38.91474], [-70.89532, -38.6923], [-71.24279, -37.20264], [-70.95047, -36.4321], [-70.38008, -36.02375], [-70.49416, -35.24145], [-69.87386, -34.13344], [-69.88099, -33.34489], [-70.55832, -31.51559], [-70.14479, -30.36595], [-69.8596, -30.26131], [-69.99507, -29.28351], [-69.80969, -29.07185], [-69.66709, -28.44055], [-69.22504, -27.95042], [-68.77586, -27.16029], [-68.43363, -27.08414], [-68.27677, -26.90626], [-68.59048, -26.49861], [-68.56909, -26.28146], [-68.38372, -26.15353], [-68.57622, -25.32505], [-68.38372, -25.08636], [-68.56909, -24.69831], [-68.24825, -24.42596], [-67.33563, -24.04237], [-66.99632, -22.99839], [-67.18382, -22.81525], [-67.54284, -22.89771], [-67.85114, -22.87076], [-68.18816, -21.28614], [-68.40403, -20.94562], [-68.53957, -20.91542], [-68.55383, -20.7355], [-68.44023, -20.62701], [-68.7276, -20.46178], [-68.74273, -20.08817], [-68.57132, -20.03134], [-68.54611, -19.84651], [-68.66761, -19.72118], [-68.41218, -19.40499], [-68.61989, -19.27584], [-68.80602, -19.08355], [-68.87082, -19.06003], [-68.94987, -18.93302], [-69.07432, -18.28259], [-69.14807, -18.16893], [-69.07496, -18.03715], [-69.28671, -17.94844], [-69.34126, -17.72753], [-69.46623, -17.60518], [-69.46897, -17.4988], [-69.66483, -17.65083], [-69.79087, -17.65563], [-69.82868, -17.72048], [-69.75305, -17.94605], [-69.81607, -18.12582], [-69.96732, -18.25992], [-70.16394, -18.31737], [-70.31267, -18.31258], [-70.378, -18.3495], [-70.59118, -18.35072], [-113.52687, -26.52828], [-68.11646, -58.14883], [-66.07313, -55.19618], [-67.11046, -54.94199], [-67.46182, -54.92205], [-68.01394, -54.8753], [-68.60733, -54.9125], [-68.60702, -52.65781]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "CM", + iso1A3: "CMR", + iso1N3: "120", + wikidata: "Q1009", + nameEn: "Cameroon", + groups: ["017", "202", "002", "UN"], + callingCodes: ["237"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[14.83314, 12.62963], [14.55058, 12.78256], [14.56101, 12.91036], [14.46881, 13.08259], [14.08251, 13.0797], [14.20204, 12.53405], [14.17523, 12.41916], [14.22215, 12.36533], [14.4843, 12.35223], [14.6474, 12.17466], [14.61612, 11.7798], [14.55207, 11.72001], [14.64591, 11.66166], [14.6124, 11.51283], [14.17821, 11.23831], [13.97489, 11.30258], [13.78945, 11.00154], [13.7403, 11.00593], [13.70753, 10.94451], [13.73434, 10.9255], [13.54964, 10.61236], [13.5705, 10.53183], [13.43644, 10.13326], [13.34111, 10.12299], [13.25025, 10.03647], [13.25323, 10.00127], [13.286, 9.9822], [13.27409, 9.93232], [13.24132, 9.91031], [13.25025, 9.86042], [13.29941, 9.8296], [13.25472, 9.76795], [13.22642, 9.57266], [13.02385, 9.49334], [12.85628, 9.36698], [12.91958, 9.33905], [12.90022, 9.11411], [12.81085, 8.91992], [12.79, 8.75361], [12.71701, 8.7595], [12.68722, 8.65938], [12.44146, 8.6152], [12.4489, 8.52536], [12.26123, 8.43696], [12.24782, 8.17904], [12.19271, 8.10826], [12.20909, 7.97553], [11.99908, 7.67302], [12.01844, 7.52981], [11.93205, 7.47812], [11.84864, 7.26098], [11.87396, 7.09398], [11.63117, 6.9905], [11.55818, 6.86186], [11.57755, 6.74059], [11.51499, 6.60892], [11.42264, 6.5882], [11.42041, 6.53789], [11.09495, 6.51717], [11.09644, 6.68437], [10.94302, 6.69325], [10.8179, 6.83377], [10.83727, 6.9358], [10.60789, 7.06885], [10.59746, 7.14719], [10.57214, 7.16345], [10.53639, 6.93432], [10.21466, 6.88996], [10.15135, 7.03781], [9.86314, 6.77756], [9.77824, 6.79088], [9.70674, 6.51717], [9.51757, 6.43874], [8.84209, 5.82562], [8.88156, 5.78857], [8.83687, 5.68483], [8.92029, 5.58403], [8.78027, 5.1243], [8.60302, 4.87353], [8.34397, 4.30689], [9.22018, 3.72052], [9.81162, 2.33797], [9.82123, 2.35097], [9.83754, 2.32428], [9.83238, 2.29079], [9.84716, 2.24676], [9.89012, 2.20457], [9.90749, 2.20049], [9.991, 2.16561], [11.3561, 2.17217], [11.37116, 2.29975], [13.28534, 2.25716], [13.29457, 2.16106], [14.61145, 2.17866], [15.00996, 1.98887], [15.22634, 2.03243], [15.34776, 1.91264], [15.48942, 1.98265], [16.02959, 1.76483], [16.02647, 1.65591], [16.14634, 1.70259], [16.05294, 1.9811], [16.08563, 2.19733], [16.15568, 2.18955], [16.19357, 2.21537], [16.08252, 2.45708], [16.05449, 3.02306], [15.77725, 3.26835], [15.73522, 3.24348], [15.07686, 4.01805], [15.17482, 4.05131], [15.10644, 4.1362], [15.08609, 4.30282], [15.00825, 4.41458], [14.73383, 4.6135], [14.65489, 5.21343], [14.57083, 5.23979], [14.52724, 5.28319], [14.62531, 5.51411], [14.58951, 5.59777], [14.62375, 5.70466], [14.60974, 5.91838], [14.49455, 5.91683], [14.42917, 6.00508], [14.43073, 6.08867], [14.56149, 6.18928], [14.74206, 6.26356], [14.80122, 6.34866], [14.79966, 6.39043], [14.96311, 6.75693], [15.04717, 6.77085], [15.23397, 7.25135], [15.49743, 7.52179], [15.56964, 7.58936], [15.59272, 7.7696], [15.50743, 7.79302], [15.20426, 8.50892], [15.09484, 8.65982], [14.83566, 8.80557], [14.35707, 9.19611], [14.37094, 9.2954], [13.97544, 9.6365], [14.01793, 9.73169], [14.1317, 9.82413], [14.20411, 10.00055], [14.4673, 10.00264], [14.80082, 9.93818], [14.95722, 9.97926], [15.05999, 9.94845], [15.14043, 9.99246], [15.24618, 9.99246], [15.41408, 9.92876], [15.68761, 9.99344], [15.50535, 10.1098], [15.30874, 10.31063], [15.23724, 10.47764], [15.14936, 10.53915], [15.15532, 10.62846], [15.06737, 10.80921], [15.09127, 10.87431], [15.04957, 11.02347], [15.10021, 11.04101], [15.0585, 11.40481], [15.13149, 11.5537], [15.06595, 11.71126], [15.11579, 11.79313], [15.04808, 11.8731], [15.05786, 12.0608], [15.0349, 12.10698], [15.00146, 12.1223], [14.96952, 12.0925], [14.89019, 12.16593], [14.90827, 12.3269], [14.83314, 12.62963]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "CN", + iso1A3: "CHN", + iso1N3: "156", + wikidata: "Q148", + nameEn: "People's Republic of China" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "CO", + iso1A3: "COL", + iso1N3: "170", + wikidata: "Q739", + nameEn: "Colombia", + groups: ["005", "419", "019", "UN"], + callingCodes: ["57"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-71.19849, 12.65801], [-81.58685, 18.0025], [-82.06974, 14.49418], [-82.56142, 11.91792], [-78.79327, 9.93766], [-77.58292, 9.22278], [-77.32389, 8.81247], [-77.45064, 8.49991], [-77.17257, 7.97422], [-77.57185, 7.51147], [-77.72514, 7.72348], [-77.72157, 7.47612], [-77.81426, 7.48319], [-77.89178, 7.22681], [-78.06168, 7.07793], [-82.12561, 4.00341], [-78.87137, 1.47457], [-78.42749, 1.15389], [-77.85677, 0.80197], [-77.7148, 0.85003], [-77.68613, 0.83029], [-77.66416, 0.81604], [-77.67815, 0.73863], [-77.49984, 0.64476], [-77.52001, 0.40782], [-76.89177, 0.24736], [-76.4094, 0.24015], [-76.41215, 0.38228], [-76.23441, 0.42294], [-75.82927, 0.09578], [-75.25764, -0.11943], [-75.18513, -0.0308], [-74.42701, -0.50218], [-74.26675, -0.97229], [-73.65312, -1.26222], [-72.92587, -2.44514], [-71.75223, -2.15058], [-70.94377, -2.23142], [-70.04609, -2.73906], [-70.71396, -3.7921], [-70.52393, -3.87553], [-70.3374, -3.79505], [-69.94708, -4.2431], [-69.43395, -1.42219], [-69.4215, -1.01853], [-69.59796, -0.75136], [-69.603, -0.51947], [-70.03658, -0.19681], [-70.04162, 0.55437], [-69.47696, 0.71065], [-69.20976, 0.57958], [-69.14422, 0.84172], [-69.26017, 1.06856], [-69.82987, 1.07864], [-69.83491, 1.69353], [-69.53746, 1.76408], [-69.38621, 1.70865], [-68.18128, 1.72881], [-68.26699, 1.83463], [-68.18632, 2.00091], [-67.9292, 1.82455], [-67.40488, 2.22258], [-67.299, 1.87494], [-67.15784, 1.80439], [-67.08222, 1.17441], [-66.85795, 1.22998], [-67.21967, 2.35778], [-67.65696, 2.81691], [-67.85862, 2.79173], [-67.85862, 2.86727], [-67.30945, 3.38393], [-67.50067, 3.75812], [-67.62671, 3.74303], [-67.85358, 4.53249], [-67.83341, 5.31104], [-67.59141, 5.5369], [-67.63914, 5.64963], [-67.58558, 5.84537], [-67.43513, 5.98835], [-67.4625, 6.20625], [-67.60654, 6.2891], [-69.41843, 6.1072], [-70.10716, 6.96516], [-70.7596, 7.09799], [-71.03941, 6.98163], [-71.37234, 7.01588], [-71.42212, 7.03854], [-71.44118, 7.02116], [-71.82441, 7.04314], [-72.04895, 7.03837], [-72.19437, 7.37034], [-72.43132, 7.40034], [-72.47415, 7.48928], [-72.45321, 7.57232], [-72.47827, 7.65604], [-72.46763, 7.79518], [-72.44454, 7.86031], [-72.46183, 7.90682], [-72.45806, 7.91141], [-72.47042, 7.92306], [-72.48183, 7.92909], [-72.48801, 7.94329], [-72.47213, 7.96106], [-72.39137, 8.03534], [-72.35163, 8.01163], [-72.36987, 8.19976], [-72.4042, 8.36513], [-72.65474, 8.61428], [-72.77415, 9.10165], [-72.94052, 9.10663], [-73.02119, 9.27584], [-73.36905, 9.16636], [-72.98085, 9.85253], [-72.88002, 10.44309], [-72.4767, 11.1117], [-72.24983, 11.14138], [-71.9675, 11.65536], [-71.3275, 11.85], [-70.92579, 11.96275], [-71.19849, 12.65801]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "CP", + iso1A3: "CPT", + wikidata: "Q161258", + nameEn: "Clipperton Island", + country: "FR", + groups: ["013", "003", "019", "UN"], + isoStatus: "excRes" + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-110.36279, 9.79626], [-108.755, 9.84085], [-109.04145, 11.13245], [-110.36279, 9.79626]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "CR", + iso1A3: "CRI", + iso1N3: "188", + wikidata: "Q800", + nameEn: "Costa Rica", + groups: ["013", "003", "419", "019", "UN"], + callingCodes: ["506"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-83.68276, 11.01562], [-83.66597, 10.79916], [-83.90838, 10.71161], [-84.68197, 11.07568], [-84.92439, 10.9497], [-85.60529, 11.22607], [-85.71223, 11.06868], [-86.14524, 11.09059], [-87.41779, 5.02401], [-82.94503, 7.93865], [-82.89978, 8.04083], [-82.89137, 8.05755], [-82.88641, 8.10219], [-82.9388, 8.26634], [-83.05209, 8.33394], [-82.93056, 8.43465], [-82.8679, 8.44042], [-82.8382, 8.48117], [-82.83322, 8.52464], [-82.83975, 8.54755], [-82.82739, 8.60153], [-82.8794, 8.6981], [-82.92068, 8.74832], [-82.91377, 8.774], [-82.88253, 8.83331], [-82.72126, 8.97125], [-82.93516, 9.07687], [-82.93516, 9.46741], [-82.84871, 9.4973], [-82.87919, 9.62645], [-82.77206, 9.59573], [-82.66667, 9.49746], [-82.61345, 9.49881], [-82.56507, 9.57279], [-82.51044, 9.65379], [-83.54024, 10.96805], [-83.68276, 11.01562]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "CU", + iso1A3: "CUB", + iso1N3: "192", + wikidata: "Q241", + nameEn: "Cuba", + groups: ["029", "003", "419", "019", "UN"], + callingCodes: ["53"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-73.62304, 20.6935], [-82.02215, 24.23074], [-85.77883, 21.92705], [-74.81171, 18.82201], [-73.62304, 20.6935]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "CV", + iso1A3: "CPV", + iso1N3: "132", + wikidata: "Q1011", + nameEn: "Cape Verde", + groups: ["Q105472", "011", "202", "002", "UN"], + callingCodes: ["238"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-28.81604, 14.57305], [-20.39702, 14.12816], [-23.37101, 19.134], [-28.81604, 14.57305]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "CW", + iso1A3: "CUW", + iso1N3: "531", + wikidata: "Q25279", + nameEn: "Cura\xE7ao", + aliases: ["NL-CW"], + country: "NL", + groups: ["Q1451600", "029", "003", "419", "019", "UN"], + callingCodes: ["599"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-68.90012, 12.62309], [-69.59009, 12.46019], [-68.99639, 11.79035], [-68.33524, 11.78151], [-68.90012, 12.62309]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "CX", + iso1A3: "CXR", + iso1N3: "162", + wikidata: "Q31063", + nameEn: "Christmas Island", + country: "AU", + groups: ["053", "009", "UN"], + driveSide: "left", + callingCodes: ["61"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[105.66835, -9.31927], [104.67494, -11.2566], [106.66176, -11.14349], [105.66835, -9.31927]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "CY", + iso1A3: "CYP", + iso1N3: "196", + wikidata: "Q229", + nameEn: "Republic of Cyprus", + groups: ["Q644636", "EU", "145", "142", "UN"], + driveSide: "left", + callingCodes: ["357"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[32.46489, 35.48584], [30.15137, 34.08517], [32.74412, 34.43926], [32.75515, 34.64985], [32.76136, 34.68318], [32.79433, 34.67883], [32.82717, 34.70622], [32.86014, 34.70585], [32.86167, 34.68734], [32.9068, 34.66102], [32.91398, 34.67343], [32.93043, 34.67091], [32.92807, 34.66736], [32.93449, 34.66241], [32.93693, 34.67027], [32.94379, 34.67111], [32.94683, 34.67907], [32.95539, 34.68471], [32.99135, 34.68061], [32.98668, 34.67268], [32.99014, 34.65518], [32.97736, 34.65277], [32.97079, 34.66112], [32.95325, 34.66462], [32.94796, 34.6587], [32.94976, 34.65204], [32.95471, 34.64528], [32.95323, 34.64075], [32.95891, 34.62919], [32.96718, 34.63446], [32.96968, 34.64046], [33.0138, 34.64424], [33.26744, 34.49942], [33.83531, 34.73974], [33.70575, 34.97947], [33.70639, 34.99303], [33.71514, 35.00294], [33.69731, 35.01754], [33.69938, 35.03123], [33.67678, 35.03866], [33.63765, 35.03869], [33.61215, 35.0527], [33.59658, 35.03635], [33.567, 35.04803], [33.57478, 35.06049], [33.53975, 35.08151], [33.48915, 35.06594], [33.47666, 35.00701], [33.45256, 35.00288], [33.45178, 35.02078], [33.47825, 35.04103], [33.48136, 35.0636], [33.46813, 35.10564], [33.41675, 35.16325], [33.4076, 35.20062], [33.38575, 35.2018], [33.37248, 35.18698], [33.3717, 35.1788], [33.36569, 35.17479], [33.35612, 35.17402], [33.35596, 35.17942], [33.34964, 35.17803], [33.35056, 35.18328], [33.31955, 35.18096], [33.3072, 35.16816], [33.27068, 35.16815], [33.15138, 35.19504], [33.11105, 35.15639], [33.08249, 35.17319], [33.01192, 35.15639], [32.94471, 35.09422], [32.86406, 35.1043], [32.85733, 35.07742], [32.70779, 35.14127], [32.70947, 35.18328], [32.64864, 35.19967], [32.60361, 35.16647], [32.46489, 35.48584]]], [[[33.74144, 35.01053], [33.7492, 35.01319], [33.74983, 35.02274], [33.74265, 35.02329], [33.73781, 35.02181], [33.7343, 35.01178], [33.74144, 35.01053]]], [[[33.77312, 34.9976], [33.75994, 35.00113], [33.75682, 34.99916], [33.76605, 34.99543], [33.76738, 34.99188], [33.7778, 34.98981], [33.77843, 34.988], [33.78149, 34.98854], [33.78318, 34.98699], [33.78571, 34.98951], [33.78917, 34.98854], [33.79191, 34.98914], [33.78516, 34.99582], [33.77553, 34.99518], [33.77312, 34.9976]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "CZ", + iso1A3: "CZE", + iso1N3: "203", + wikidata: "Q213", + nameEn: "Czechia", + groups: ["EU", "151", "150", "UN"], + callingCodes: ["420"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[14.82803, 50.86966], [14.79139, 50.81438], [14.70661, 50.84096], [14.61993, 50.86049], [14.63434, 50.8883], [14.65259, 50.90513], [14.64802, 50.93241], [14.58024, 50.91443], [14.56374, 50.922], [14.59702, 50.96148], [14.59908, 50.98685], [14.58215, 50.99306], [14.56432, 51.01008], [14.53438, 51.00374], [14.53321, 51.01679], [14.49873, 51.02242], [14.50809, 51.0427], [14.49991, 51.04692], [14.49154, 51.04382], [14.49202, 51.02286], [14.45827, 51.03712], [14.41335, 51.02086], [14.30098, 51.05515], [14.25665, 50.98935], [14.28776, 50.97718], [14.32353, 50.98556], [14.32793, 50.97379], [14.30251, 50.96606], [14.31422, 50.95243], [14.39848, 50.93866], [14.38691, 50.89907], [14.30098, 50.88448], [14.27123, 50.89386], [14.24314, 50.88761], [14.22331, 50.86049], [14.02982, 50.80662], [13.98864, 50.8177], [13.89113, 50.78533], [13.89444, 50.74142], [13.82942, 50.7251], [13.76316, 50.73487], [13.70204, 50.71771], [13.65977, 50.73096], [13.52474, 50.70394], [13.53748, 50.67654], [13.5226, 50.64721], [13.49742, 50.63133], [13.46413, 50.60102], [13.42189, 50.61243], [13.37485, 50.64931], [13.37805, 50.627], [13.32264, 50.60317], [13.32594, 50.58009], [13.29454, 50.57904], [13.25158, 50.59268], [13.19043, 50.50237], [13.13424, 50.51709], [13.08301, 50.50132], [13.0312, 50.50944], [13.02038, 50.4734], [13.02147, 50.44763], [12.98433, 50.42016], [12.94058, 50.40944], [12.82465, 50.45738], [12.73476, 50.43237], [12.73044, 50.42268], [12.70731, 50.39948], [12.67261, 50.41949], [12.51356, 50.39694], [12.48747, 50.37278], [12.49214, 50.35228], [12.48256, 50.34784], [12.46643, 50.35527], [12.43722, 50.33774], [12.43371, 50.32506], [12.39924, 50.32302], [12.40158, 50.29521], [12.36594, 50.28289], [12.35425, 50.23993], [12.33263, 50.24367], [12.32445, 50.20442], [12.33847, 50.19432], [12.32596, 50.17146], [12.29232, 50.17524], [12.28063, 50.19544], [12.28755, 50.22429], [12.23943, 50.24594], [12.24791, 50.25525], [12.26953, 50.25189], [12.25119, 50.27079], [12.20823, 50.2729], [12.18013, 50.32146], [12.10907, 50.32041], [12.13716, 50.27396], [12.09287, 50.25032], [12.19335, 50.19997], [12.21484, 50.16399], [12.1917, 50.13434], [12.2073, 50.10315], [12.23709, 50.10213], [12.27433, 50.0771], [12.26111, 50.06331], [12.30798, 50.05719], [12.49908, 49.97305], [12.47264, 49.94222], [12.55197, 49.92094], [12.48256, 49.83575], [12.46603, 49.78882], [12.40489, 49.76321], [12.4462, 49.70233], [12.52553, 49.68415], [12.53544, 49.61888], [12.56188, 49.6146], [12.60155, 49.52887], [12.64782, 49.52565], [12.64121, 49.47628], [12.669, 49.42935], [12.71227, 49.42363], [12.75854, 49.3989], [12.78168, 49.34618], [12.88414, 49.33541], [12.88249, 49.35479], [12.94859, 49.34079], [13.03618, 49.30417], [13.02957, 49.27399], [13.05883, 49.26259], [13.17665, 49.16713], [13.17019, 49.14339], [13.20405, 49.12303], [13.23689, 49.11412], [13.28242, 49.1228], [13.39479, 49.04812], [13.40802, 48.98851], [13.50221, 48.93752], [13.50552, 48.97441], [13.58319, 48.96899], [13.61624, 48.9462], [13.67739, 48.87886], [13.73854, 48.88538], [13.76994, 48.83537], [13.78977, 48.83319], [13.8096, 48.77877], [13.84023, 48.76988], [14.06151, 48.66873], [14.01482, 48.63788], [14.09104, 48.5943], [14.20691, 48.5898], [14.33909, 48.55852], [14.43076, 48.58855], [14.4587, 48.64695], [14.56139, 48.60429], [14.60808, 48.62881], [14.66762, 48.58215], [14.71794, 48.59794], [14.72756, 48.69502], [14.80584, 48.73489], [14.80821, 48.77711], [14.81545, 48.7874], [14.94773, 48.76268], [14.95641, 48.75915], [14.9758, 48.76857], [14.98112, 48.77524], [14.9782, 48.7766], [14.98032, 48.77959], [14.95072, 48.79101], [14.98917, 48.90082], [14.97612, 48.96983], [14.99878, 49.01444], [15.15534, 48.99056], [15.16358, 48.94278], [15.26177, 48.95766], [15.28305, 48.98831], [15.34823, 48.98444], [15.48027, 48.94481], [15.51357, 48.91549], [15.61622, 48.89541], [15.6921, 48.85973], [15.75341, 48.8516], [15.78087, 48.87644], [15.84404, 48.86921], [16.06034, 48.75436], [16.37345, 48.729], [16.40915, 48.74576], [16.46134, 48.80865], [16.67008, 48.77699], [16.68518, 48.7281], [16.71883, 48.73806], [16.79779, 48.70998], [16.90354, 48.71541], [16.93955, 48.60371], [17.00215, 48.70887], [17.11202, 48.82925], [17.19355, 48.87602], [17.29054, 48.85546], [17.3853, 48.80936], [17.45671, 48.85004], [17.5295, 48.81117], [17.7094, 48.86721], [17.73126, 48.87885], [17.77944, 48.92318], [17.87831, 48.92679], [17.91814, 49.01784], [18.06885, 49.03157], [18.1104, 49.08624], [18.15022, 49.24518], [18.18456, 49.28909], [18.36446, 49.3267], [18.4139, 49.36517], [18.4084, 49.40003], [18.44686, 49.39467], [18.54848, 49.47059], [18.53063, 49.49022], [18.57183, 49.51162], [18.6144, 49.49824], [18.67757, 49.50895], [18.74761, 49.492], [18.84521, 49.51672], [18.84786, 49.5446], [18.80479, 49.6815], [18.72838, 49.68163], [18.69817, 49.70473], [18.62676, 49.71983], [18.62943, 49.74603], [18.62645, 49.75002], [18.61368, 49.75426], [18.61278, 49.7618], [18.57183, 49.83334], [18.60341, 49.86256], [18.57045, 49.87849], [18.57697, 49.91565], [18.54299, 49.92537], [18.54495, 49.9079], [18.53423, 49.89906], [18.41604, 49.93498], [18.33562, 49.94747], [18.33278, 49.92415], [18.31914, 49.91565], [18.27794, 49.93863], [18.27107, 49.96779], [18.21752, 49.97309], [18.20241, 49.99958], [18.10628, 50.00223], [18.07898, 50.04535], [18.03212, 50.06574], [18.00396, 50.04954], [18.04585, 50.03311], [18.04585, 50.01194], [18.00191, 50.01723], [17.86886, 49.97452], [17.77669, 50.02253], [17.7506, 50.07896], [17.6888, 50.12037], [17.66683, 50.10275], [17.59404, 50.16437], [17.70528, 50.18812], [17.76296, 50.23382], [17.72176, 50.25665], [17.74648, 50.29966], [17.69292, 50.32859], [17.67764, 50.28977], [17.58889, 50.27837], [17.3702, 50.28123], [17.34548, 50.2628], [17.34273, 50.32947], [17.27681, 50.32246], [17.19991, 50.3654], [17.19579, 50.38817], [17.14498, 50.38117], [17.1224, 50.39494], [16.89229, 50.45117], [16.85933, 50.41093], [16.90877, 50.38642], [16.94448, 50.31281], [16.99803, 50.30316], [17.02138, 50.27772], [16.99803, 50.25753], [17.02825, 50.23118], [17.00353, 50.21449], [16.98018, 50.24172], [16.8456, 50.20834], [16.7014, 50.09659], [16.63137, 50.1142], [16.55446, 50.16613], [16.56407, 50.21009], [16.42674, 50.32509], [16.39379, 50.3207], [16.3622, 50.34875], [16.36495, 50.37679], [16.30289, 50.38292], [16.28118, 50.36891], [16.22821, 50.41054], [16.21585, 50.40627], [16.19526, 50.43291], [16.31413, 50.50274], [16.34572, 50.49575], [16.44597, 50.58041], [16.33611, 50.66579], [16.23174, 50.67101], [16.20839, 50.63096], [16.10265, 50.66405], [16.02437, 50.60046], [15.98317, 50.61528], [16.0175, 50.63009], [15.97219, 50.69799], [15.87331, 50.67188], [15.81683, 50.75666], [15.73186, 50.73885], [15.43798, 50.80833], [15.3803, 50.77187], [15.36656, 50.83956], [15.2773, 50.8907], [15.27043, 50.97724], [15.2361, 50.99886], [15.1743, 50.9833], [15.16744, 51.01959], [15.11937, 50.99021], [15.10152, 51.01095], [15.06218, 51.02269], [15.03895, 51.0123], [15.02433, 51.0242], [14.96419, 50.99108], [15.01088, 50.97984], [14.99852, 50.86817], [14.82803, 50.86966]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "DE", + iso1A3: "DEU", + iso1N3: "276", + wikidata: "Q183", + nameEn: "Germany", + groups: ["EU", "155", "150", "UN"], + callingCodes: ["49"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[8.70847, 47.68904], [8.71773, 47.69088], [8.70237, 47.71453], [8.66416, 47.71367], [8.67508, 47.6979], [8.65769, 47.68928], [8.66837, 47.68437], [8.68985, 47.69552], [8.70847, 47.68904]]], [[[8.72617, 47.69651], [8.72809, 47.69282], [8.75856, 47.68969], [8.79511, 47.67462], [8.79966, 47.70222], [8.76965, 47.7075], [8.77309, 47.72059], [8.80663, 47.73821], [8.82002, 47.71458], [8.86989, 47.70504], [8.85065, 47.68209], [8.87383, 47.67045], [8.87625, 47.65441], [8.89946, 47.64769], [8.94093, 47.65596], [9.02093, 47.6868], [9.09891, 47.67801], [9.13845, 47.66389], [9.15181, 47.66904], [9.1705, 47.65513], [9.1755, 47.65584], [9.17593, 47.65399], [9.18203, 47.65598], [9.25619, 47.65939], [9.55125, 47.53629], [9.72736, 47.53457], [9.76748, 47.5934], [9.80254, 47.59419], [9.82591, 47.58158], [9.8189, 47.54688], [9.87499, 47.52953], [9.87733, 47.54688], [9.92407, 47.53111], [9.96029, 47.53899], [10.00003, 47.48216], [10.03859, 47.48927], [10.07131, 47.45531], [10.09001, 47.46005], [10.1052, 47.4316], [10.06897, 47.40709], [10.09819, 47.35724], [10.11805, 47.37228], [10.16362, 47.36674], [10.17648, 47.38889], [10.2127, 47.38019], [10.22774, 47.38904], [10.23757, 47.37609], [10.19998, 47.32832], [10.2147, 47.31014], [10.17648, 47.29149], [10.17531, 47.27167], [10.23257, 47.27088], [10.33424, 47.30813], [10.39851, 47.37623], [10.4324, 47.38494], [10.4359, 47.41183], [10.47446, 47.43318], [10.46278, 47.47901], [10.44291, 47.48453], [10.4324, 47.50111], [10.44992, 47.5524], [10.43473, 47.58394], [10.47329, 47.58552], [10.48849, 47.54057], [10.56912, 47.53584], [10.60337, 47.56755], [10.63456, 47.5591], [10.68832, 47.55752], [10.6965, 47.54253], [10.7596, 47.53228], [10.77596, 47.51729], [10.88814, 47.53701], [10.91268, 47.51334], [10.86945, 47.5015], [10.87061, 47.4786], [10.90918, 47.48571], [10.93839, 47.48018], [10.92437, 47.46991], [10.98513, 47.42882], [10.97111, 47.41617], [10.97111, 47.39561], [11.11835, 47.39719], [11.12536, 47.41222], [11.20482, 47.43198], [11.25157, 47.43277], [11.22002, 47.3964], [11.27844, 47.39956], [11.29597, 47.42566], [11.33804, 47.44937], [11.4175, 47.44621], [11.38128, 47.47465], [11.4362, 47.51413], [11.52618, 47.50939], [11.58578, 47.52281], [11.58811, 47.55515], [11.60681, 47.57881], [11.63934, 47.59202], [11.84052, 47.58354], [11.85572, 47.60166], [12.0088, 47.62451], [12.02282, 47.61033], [12.05788, 47.61742], [12.13734, 47.60639], [12.17824, 47.61506], [12.18145, 47.61019], [12.17737, 47.60121], [12.18568, 47.6049], [12.20398, 47.60667], [12.20801, 47.61082], [12.19895, 47.64085], [12.18507, 47.65984], [12.18347, 47.66663], [12.16769, 47.68167], [12.16217, 47.70105], [12.18303, 47.70065], [12.22571, 47.71776], [12.2542, 47.7433], [12.26238, 47.73544], [12.24017, 47.69534], [12.26004, 47.67725], [12.27991, 47.68827], [12.336, 47.69534], [12.37222, 47.68433], [12.43883, 47.6977], [12.44117, 47.6741], [12.50076, 47.62293], [12.53816, 47.63553], [12.57438, 47.63238], [12.6071, 47.6741], [12.7357, 47.6787], [12.77777, 47.66689], [12.76492, 47.64485], [12.82101, 47.61493], [12.77427, 47.58025], [12.80699, 47.54477], [12.84672, 47.54556], [12.85256, 47.52741], [12.9624, 47.47452], [12.98344, 47.48716], [12.9998, 47.46267], [13.04537, 47.49426], [13.03252, 47.53373], [13.05355, 47.56291], [13.04537, 47.58183], [13.06641, 47.58577], [13.06407, 47.60075], [13.09562, 47.63304], [13.07692, 47.68814], [13.01382, 47.72116], [12.98578, 47.7078], [12.92969, 47.71094], [12.91333, 47.7178], [12.90274, 47.72513], [12.91711, 47.74026], [12.9353, 47.74788], [12.94371, 47.76281], [12.93202, 47.77302], [12.96311, 47.79957], [12.98543, 47.82896], [13.00588, 47.84374], [12.94163, 47.92927], [12.93886, 47.94046], [12.93642, 47.94436], [12.93419, 47.94063], [12.92668, 47.93879], [12.91985, 47.94069], [12.9211, 47.95135], [12.91683, 47.95647], [12.87476, 47.96195], [12.8549, 48.01122], [12.76141, 48.07373], [12.74973, 48.10885], [12.7617, 48.12796], [12.78595, 48.12445], [12.80676, 48.14979], [12.82673, 48.15245], [12.8362, 48.15876], [12.836, 48.1647], [12.84475, 48.16556], [12.87126, 48.20318], [12.95306, 48.20629], [13.02083, 48.25689], [13.0851, 48.27711], [13.126, 48.27867], [13.18093, 48.29577], [13.26039, 48.29422], [13.30897, 48.31575], [13.40709, 48.37292], [13.43929, 48.43386], [13.42527, 48.45711], [13.45727, 48.51092], [13.43695, 48.55776], [13.45214, 48.56472], [13.46967, 48.55157], [13.50663, 48.57506], [13.50131, 48.58091], [13.51291, 48.59023], [13.57535, 48.55912], [13.59705, 48.57013], [13.62508, 48.55501], [13.65186, 48.55092], [13.66113, 48.53558], [13.72802, 48.51208], [13.74816, 48.53058], [13.7513, 48.5624], [13.76921, 48.55324], [13.80519, 48.58026], [13.80038, 48.59487], [13.82609, 48.62345], [13.81901, 48.6761], [13.81283, 48.68426], [13.81791, 48.69832], [13.79337, 48.71375], [13.81863, 48.73257], [13.82266, 48.75544], [13.84023, 48.76988], [13.8096, 48.77877], [13.78977, 48.83319], [13.76994, 48.83537], [13.73854, 48.88538], [13.67739, 48.87886], [13.61624, 48.9462], [13.58319, 48.96899], [13.50552, 48.97441], [13.50221, 48.93752], [13.40802, 48.98851], [13.39479, 49.04812], [13.28242, 49.1228], [13.23689, 49.11412], [13.20405, 49.12303], [13.17019, 49.14339], [13.17665, 49.16713], [13.05883, 49.26259], [13.02957, 49.27399], [13.03618, 49.30417], [12.94859, 49.34079], [12.88249, 49.35479], [12.88414, 49.33541], [12.78168, 49.34618], [12.75854, 49.3989], [12.71227, 49.42363], [12.669, 49.42935], [12.64121, 49.47628], [12.64782, 49.52565], [12.60155, 49.52887], [12.56188, 49.6146], [12.53544, 49.61888], [12.52553, 49.68415], [12.4462, 49.70233], [12.40489, 49.76321], [12.46603, 49.78882], [12.48256, 49.83575], [12.55197, 49.92094], [12.47264, 49.94222], [12.49908, 49.97305], [12.30798, 50.05719], [12.26111, 50.06331], [12.27433, 50.0771], [12.23709, 50.10213], [12.2073, 50.10315], [12.1917, 50.13434], [12.21484, 50.16399], [12.19335, 50.19997], [12.09287, 50.25032], [12.13716, 50.27396], [12.10907, 50.32041], [12.18013, 50.32146], [12.20823, 50.2729], [12.25119, 50.27079], [12.26953, 50.25189], [12.24791, 50.25525], [12.23943, 50.24594], [12.28755, 50.22429], [12.28063, 50.19544], [12.29232, 50.17524], [12.32596, 50.17146], [12.33847, 50.19432], [12.32445, 50.20442], [12.33263, 50.24367], [12.35425, 50.23993], [12.36594, 50.28289], [12.40158, 50.29521], [12.39924, 50.32302], [12.43371, 50.32506], [12.43722, 50.33774], [12.46643, 50.35527], [12.48256, 50.34784], [12.49214, 50.35228], [12.48747, 50.37278], [12.51356, 50.39694], [12.67261, 50.41949], [12.70731, 50.39948], [12.73044, 50.42268], [12.73476, 50.43237], [12.82465, 50.45738], [12.94058, 50.40944], [12.98433, 50.42016], [13.02147, 50.44763], [13.02038, 50.4734], [13.0312, 50.50944], [13.08301, 50.50132], [13.13424, 50.51709], [13.19043, 50.50237], [13.25158, 50.59268], [13.29454, 50.57904], [13.32594, 50.58009], [13.32264, 50.60317], [13.37805, 50.627], [13.37485, 50.64931], [13.42189, 50.61243], [13.46413, 50.60102], [13.49742, 50.63133], [13.5226, 50.64721], [13.53748, 50.67654], [13.52474, 50.70394], [13.65977, 50.73096], [13.70204, 50.71771], [13.76316, 50.73487], [13.82942, 50.7251], [13.89444, 50.74142], [13.89113, 50.78533], [13.98864, 50.8177], [14.02982, 50.80662], [14.22331, 50.86049], [14.24314, 50.88761], [14.27123, 50.89386], [14.30098, 50.88448], [14.38691, 50.89907], [14.39848, 50.93866], [14.31422, 50.95243], [14.30251, 50.96606], [14.32793, 50.97379], [14.32353, 50.98556], [14.28776, 50.97718], [14.25665, 50.98935], [14.30098, 51.05515], [14.41335, 51.02086], [14.45827, 51.03712], [14.49202, 51.02286], [14.49154, 51.04382], [14.49991, 51.04692], [14.50809, 51.0427], [14.49873, 51.02242], [14.53321, 51.01679], [14.53438, 51.00374], [14.56432, 51.01008], [14.58215, 50.99306], [14.59908, 50.98685], [14.59702, 50.96148], [14.56374, 50.922], [14.58024, 50.91443], [14.64802, 50.93241], [14.65259, 50.90513], [14.63434, 50.8883], [14.61993, 50.86049], [14.70661, 50.84096], [14.79139, 50.81438], [14.82803, 50.86966], [14.81664, 50.88148], [14.89681, 50.9422], [14.89252, 50.94999], [14.92942, 50.99744], [14.95529, 51.04552], [14.97938, 51.07742], [14.98229, 51.11354], [14.99689, 51.12205], [14.99079, 51.14284], [14.99646, 51.14365], [15.00083, 51.14974], [14.99414, 51.15813], [14.99311, 51.16249], [15.0047, 51.16874], [15.01242, 51.21285], [15.04288, 51.28387], [14.98008, 51.33449], [14.96899, 51.38367], [14.9652, 51.44793], [14.94749, 51.47155], [14.73219, 51.52922], [14.72652, 51.53902], [14.73047, 51.54606], [14.71125, 51.56209], [14.7727, 51.61263], [14.75759, 51.62318], [14.75392, 51.67445], [14.69065, 51.70842], [14.66386, 51.73282], [14.64625, 51.79472], [14.60493, 51.80473], [14.59089, 51.83302], [14.6588, 51.88359], [14.6933, 51.9044], [14.70601, 51.92944], [14.7177, 51.94048], [14.72163, 51.95188], [14.71836, 51.95606], [14.7139, 51.95643], [14.70488, 51.97679], [14.71339, 52.00337], [14.76026, 52.06624], [14.72971, 52.09167], [14.6917, 52.10283], [14.67683, 52.13936], [14.70616, 52.16927], [14.68344, 52.19612], [14.71319, 52.22144], [14.70139, 52.25038], [14.58149, 52.28007], [14.56378, 52.33838], [14.55228, 52.35264], [14.54423, 52.42568], [14.63056, 52.48993], [14.60081, 52.53116], [14.6289, 52.57136], [14.61073, 52.59847], [14.22071, 52.81175], [14.13806, 52.82392], [14.12256, 52.84311], [14.15873, 52.87715], [14.14056, 52.95786], [14.25954, 53.00264], [14.35044, 53.05829], [14.38679, 53.13669], [14.36696, 53.16444], [14.37853, 53.20405], [14.40662, 53.21098], [14.45125, 53.26241], [14.44133, 53.27427], [14.4215, 53.27724], [14.35209, 53.49506], [14.3273, 53.50587], [14.30416, 53.55499], [14.31904, 53.61581], [14.2853, 53.63392], [14.28477, 53.65955], [14.27133, 53.66613], [14.2836, 53.67721], [14.26782, 53.69866], [14.27249, 53.74464], [14.21323, 53.8664], [14.20823, 53.90776], [14.18544, 53.91258], [14.20647, 53.91671], [14.22634, 53.9291], [14.20811, 54.12784], [13.93395, 54.84044], [12.85844, 54.82438], [11.90309, 54.38543], [11.00303, 54.63689], [10.31111, 54.65968], [10.16755, 54.73883], [9.89314, 54.84171], [9.73563, 54.8247], [9.61187, 54.85548], [9.62734, 54.88057], [9.58937, 54.88785], [9.4659, 54.83131], [9.43155, 54.82586], [9.41213, 54.84254], [9.38532, 54.83968], [9.36496, 54.81749], [9.33849, 54.80233], [9.32771, 54.80602], [9.2474, 54.8112], [9.23445, 54.83432], [9.24631, 54.84726], [9.20571, 54.85841], [9.14275, 54.87421], [9.04629, 54.87249], [8.92795, 54.90452], [8.81178, 54.90518], [8.76387, 54.8948], [8.63979, 54.91069], [8.55769, 54.91837], [8.45719, 55.06747], [8.02459, 55.09613], [5.45168, 54.20039], [6.91025, 53.44221], [7.00198, 53.32672], [7.19052, 53.31866], [7.21679, 53.20058], [7.22681, 53.18165], [7.17898, 53.13817], [7.21694, 53.00742], [7.07253, 52.81083], [7.04557, 52.63318], [6.77307, 52.65375], [6.71641, 52.62905], [6.69507, 52.488], [6.94293, 52.43597], [6.99041, 52.47235], [7.03417, 52.40237], [7.07044, 52.37805], [7.02703, 52.27941], [7.06365, 52.23789], [7.03729, 52.22695], [6.9897, 52.2271], [6.97189, 52.20329], [6.83984, 52.11728], [6.76117, 52.11895], [6.68128, 52.05052], [6.83035, 51.9905], [6.82357, 51.96711], [6.72319, 51.89518], [6.68386, 51.91861], [6.58556, 51.89386], [6.50231, 51.86313], [6.47179, 51.85395], [6.38815, 51.87257], [6.40704, 51.82771], [6.30593, 51.84998], [6.29872, 51.86801], [6.21443, 51.86801], [6.15349, 51.90439], [6.11551, 51.89769], [6.16902, 51.84094], [6.10337, 51.84829], [6.06705, 51.86136], [5.99848, 51.83195], [5.94568, 51.82786], [5.98665, 51.76944], [5.95003, 51.7493], [6.04091, 51.71821], [6.02767, 51.6742], [6.11759, 51.65609], [6.09055, 51.60564], [6.18017, 51.54096], [6.21724, 51.48568], [6.20654, 51.40049], [6.22641, 51.39948], [6.22674, 51.36135], [6.16977, 51.33169], [6.07889, 51.24432], [6.07889, 51.17038], [6.17384, 51.19589], [6.16706, 51.15677], [5.98292, 51.07469], [5.9541, 51.03496], [5.9134, 51.06736], [5.86735, 51.05182], [5.87849, 51.01969], [5.90493, 51.00198], [5.90296, 50.97356], [5.95282, 50.98728], [6.02697, 50.98303], [6.01615, 50.93367], [6.09297, 50.92066], [6.07486, 50.89307], [6.08805, 50.87223], [6.07693, 50.86025], [6.07431, 50.84674], [6.05702, 50.85179], [6.05623, 50.8572], [6.01921, 50.84435], [6.02328, 50.81694], [6.00462, 50.80065], [5.98404, 50.80988], [5.97497, 50.79992], [6.02624, 50.77453], [6.01976, 50.75398], [6.03889, 50.74618], [6.0326, 50.72647], [6.0406, 50.71848], [6.04428, 50.72861], [6.11707, 50.72231], [6.17852, 50.6245], [6.26957, 50.62444], [6.2476, 50.60392], [6.24888, 50.59869], [6.24005, 50.58732], [6.22581, 50.5907], [6.20281, 50.56952], [6.17739, 50.55875], [6.17802, 50.54179], [6.19735, 50.53576], [6.19579, 50.5313], [6.18716, 50.52653], [6.19193, 50.5212], [6.20599, 50.52089], [6.22335, 50.49578], [6.26637, 50.50272], [6.30809, 50.50058], [6.3465, 50.48833], [6.34005, 50.46083], [6.37219, 50.45397], [6.36852, 50.40776], [6.34406, 50.37994], [6.3688, 50.35898], [6.40785, 50.33557], [6.40641, 50.32425], [6.35701, 50.31139], [6.32488, 50.32333], [6.29949, 50.30887], [6.28797, 50.27458], [6.208, 50.25179], [6.16853, 50.2234], [6.18364, 50.20815], [6.18739, 50.1822], [6.14588, 50.17106], [6.14132, 50.14971], [6.15298, 50.14126], [6.1379, 50.12964], [6.12055, 50.09171], [6.11274, 50.05916], [6.13458, 50.04141], [6.13044, 50.02929], [6.14666, 50.02207], [6.13794, 50.01466], [6.13273, 50.02019], [6.1295, 50.01849], [6.13806, 50.01056], [6.14948, 50.00908], [6.14147, 49.99563], [6.1701, 49.98518], [6.16466, 49.97086], [6.17872, 49.9537], [6.18554, 49.95622], [6.18045, 49.96611], [6.19089, 49.96991], [6.19856, 49.95053], [6.22094, 49.94955], [6.22608, 49.929], [6.21882, 49.92403], [6.22926, 49.92096], [6.23496, 49.89972], [6.26146, 49.88203], [6.28874, 49.87592], [6.29692, 49.86685], [6.30963, 49.87021], [6.32303, 49.85133], [6.32098, 49.83728], [6.33585, 49.83785], [6.34267, 49.84974], [6.36576, 49.85032], [6.40022, 49.82029], [6.42521, 49.81591], [6.42905, 49.81091], [6.44131, 49.81443], [6.45425, 49.81164], [6.47111, 49.82263], [6.48718, 49.81267], [6.50647, 49.80916], [6.51215, 49.80124], [6.52121, 49.81338], [6.53122, 49.80666], [6.52169, 49.79787], [6.50534, 49.78952], [6.51669, 49.78336], [6.51056, 49.77515], [6.51828, 49.76855], [6.51646, 49.75961], [6.50174, 49.75292], [6.50193, 49.73291], [6.51805, 49.72425], [6.51397, 49.72058], [6.50261, 49.72718], [6.49535, 49.72645], [6.49694, 49.72205], [6.5042, 49.71808], [6.50647, 49.71353], [6.49785, 49.71118], [6.48014, 49.69767], [6.46048, 49.69092], [6.44654, 49.67799], [6.42937, 49.66857], [6.42726, 49.66078], [6.43768, 49.66021], [6.4413, 49.65722], [6.41861, 49.61723], [6.39822, 49.60081], [6.385, 49.59946], [6.37464, 49.58886], [6.38342, 49.5799], [6.38024, 49.57593], [6.36676, 49.57813], [6.35825, 49.57053], [6.38228, 49.55855], [6.38072, 49.55171], [6.35666, 49.52931], [6.36788, 49.50377], [6.36907, 49.48931], [6.36778, 49.46937], [6.38352, 49.46463], [6.39168, 49.4667], [6.40274, 49.46546], [6.42432, 49.47683], [6.55404, 49.42464], [6.533, 49.40748], [6.60091, 49.36864], [6.58807, 49.35358], [6.572, 49.35027], [6.60186, 49.31055], [6.66583, 49.28065], [6.69274, 49.21661], [6.71843, 49.2208], [6.73256, 49.20486], [6.71137, 49.18808], [6.73765, 49.16375], [6.78265, 49.16793], [6.83385, 49.15162], [6.84703, 49.15734], [6.86225, 49.18185], [6.85016, 49.19354], [6.85119, 49.20038], [6.83555, 49.21249], [6.85939, 49.22376], [6.89298, 49.20863], [6.91875, 49.22261], [6.93831, 49.2223], [6.94028, 49.21641], [6.95963, 49.203], [6.97273, 49.2099], [7.01318, 49.19018], [7.03459, 49.19096], [7.0274, 49.17042], [7.03178, 49.15734], [7.04662, 49.13724], [7.04409, 49.12123], [7.04843, 49.11422], [7.05548, 49.11185], [7.06642, 49.11415], [7.07162, 49.1255], [7.09007, 49.13094], [7.07859, 49.15031], [7.10715, 49.15631], [7.10384, 49.13787], [7.12504, 49.14253], [7.1358, 49.1282], [7.1593, 49.1204], [7.23473, 49.12971], [7.29514, 49.11426], [7.3195, 49.14231], [7.35995, 49.14399], [7.3662, 49.17308], [7.44052, 49.18354], [7.44455, 49.16765], [7.49473, 49.17], [7.49172, 49.13915], [7.53012, 49.09818], [7.56416, 49.08136], [7.62575, 49.07654], [7.63618, 49.05428], [7.75948, 49.04562], [7.79557, 49.06583], [7.86386, 49.03499], [7.93641, 49.05544], [7.97783, 49.03161], [8.14189, 48.97833], [8.22604, 48.97352], [8.20031, 48.95856], [8.19989, 48.95825], [8.12813, 48.87985], [8.10253, 48.81829], [8.06802, 48.78957], [8.0326, 48.79017], [8.01534, 48.76085], [7.96994, 48.75606], [7.96812, 48.72491], [7.89002, 48.66317], [7.84098, 48.64217], [7.80057, 48.5857], [7.80167, 48.54758], [7.80647, 48.51239], [7.76833, 48.48945], [7.73109, 48.39192], [7.74562, 48.32736], [7.69022, 48.30018], [7.6648, 48.22219], [7.57137, 48.12292], [7.56966, 48.03265], [7.62302, 47.97898], [7.55673, 47.87371], [7.52921, 47.77747], [7.54761, 47.72912], [7.53722, 47.71635], [7.51266, 47.70197], [7.51915, 47.68335], [7.52067, 47.66437], [7.53384, 47.65115], [7.5591, 47.63849], [7.57423, 47.61628], [7.58851, 47.60794], [7.59301, 47.60058], [7.58945, 47.59017], [7.60523, 47.58519], [7.60459, 47.57869], [7.61929, 47.57683], [7.64309, 47.59151], [7.64213, 47.5944], [7.64599, 47.59695], [7.67395, 47.59212], [7.68229, 47.59905], [7.69385, 47.60099], [7.68486, 47.59601], [7.67115, 47.5871], [7.68904, 47.57133], [7.67655, 47.56435], [7.63338, 47.56256], [7.65083, 47.54662], [7.66174, 47.54554], [7.6656, 47.53752], [7.68101, 47.53232], [7.69642, 47.53297], [7.71961, 47.54219], [7.75261, 47.54599], [7.79486, 47.55691], [7.81901, 47.58798], [7.84412, 47.5841], [7.88664, 47.58854], [7.90673, 47.57674], [7.91251, 47.55031], [7.94494, 47.54511], [7.95682, 47.55789], [7.97581, 47.55493], [8.00113, 47.55616], [8.02136, 47.55096], [8.04383, 47.55443], [8.06663, 47.56374], [8.08557, 47.55768], [8.10002, 47.56504], [8.10395, 47.57918], [8.11543, 47.5841], [8.13662, 47.58432], [8.13823, 47.59147], [8.14947, 47.59558], [8.1652, 47.5945], [8.19378, 47.61636], [8.20617, 47.62141], [8.22011, 47.6181], [8.22577, 47.60385], [8.23809, 47.61204], [8.25863, 47.61571], [8.26313, 47.6103], [8.2824, 47.61225], [8.29722, 47.60603], [8.29524, 47.5919], [8.30277, 47.58607], [8.32735, 47.57133], [8.35512, 47.57014], [8.38273, 47.56608], [8.39477, 47.57826], [8.43235, 47.56617], [8.49431, 47.58107], [8.48949, 47.588], [8.46637, 47.58389], [8.45578, 47.60121], [8.50747, 47.61897], [8.51686, 47.63476], [8.55756, 47.62394], [8.57586, 47.59537], [8.60348, 47.61204], [8.59545, 47.64298], [8.60701, 47.65271], [8.61471, 47.64514], [8.60412, 47.63735], [8.62049, 47.63757], [8.62884, 47.65098], [8.61113, 47.66332], [8.6052, 47.67258], [8.57683, 47.66158], [8.56141, 47.67088], [8.52801, 47.66059], [8.5322, 47.64687], [8.49656, 47.64709], [8.46605, 47.64103], [8.4667, 47.65747], [8.44711, 47.65379], [8.42264, 47.66667], [8.41346, 47.66676], [8.40473, 47.67499], [8.4211, 47.68407], [8.40569, 47.69855], [8.44807, 47.72426], [8.45771, 47.7493], [8.48868, 47.77215], [8.56814, 47.78001], [8.56415, 47.80633], [8.61657, 47.79998], [8.62408, 47.7626], [8.64425, 47.76398], [8.65292, 47.80066], [8.68022, 47.78599], [8.68985, 47.75686], [8.71778, 47.76571], [8.74251, 47.75168], [8.70543, 47.73121], [8.73671, 47.7169], [8.72617, 47.69651]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "DG", + iso1A3: "DGA", + wikidata: "Q184851", + nameEn: "Diego Garcia", + country: "GB", + groups: ["IO", "BOTS", "014", "202", "002", "UN"], + isoStatus: "excRes", + callingCodes: ["246"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[73.14823, -7.76302], [73.09982, -6.07324], [71.43792, -7.73904], [73.14823, -7.76302]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "DJ", + iso1A3: "DJI", + iso1N3: "262", + wikidata: "Q977", + nameEn: "Djibouti", + groups: ["014", "202", "002", "UN"], + callingCodes: ["253"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[43.90659, 12.3823], [43.90659, 12.3823], [43.32909, 12.59711], [43.29075, 12.79154], [42.86195, 12.58747], [42.7996, 12.42629], [42.6957, 12.36201], [42.46941, 12.52661], [42.4037, 12.46478], [41.95461, 11.81157], [41.82878, 11.72361], [41.77727, 11.49902], [41.8096, 11.33606], [41.80056, 10.97127], [42.06302, 10.92599], [42.13691, 10.97586], [42.42669, 10.98493], [42.62989, 11.09711], [42.75111, 11.06992], [42.79037, 10.98493], [42.95776, 10.98533], [43.90659, 12.3823]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "DK", + iso1A3: "DNK", + iso1N3: "208", + wikidata: "Q756617", + nameEn: "Kingdom of Denmark" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "DM", + iso1A3: "DMA", + iso1N3: "212", + wikidata: "Q784", + nameEn: "Dominica", + groups: ["029", "003", "419", "019", "UN"], + driveSide: "left", + roadSpeedUnit: "mph", + callingCodes: ["1 767"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-61.32485, 14.91445], [-60.86656, 15.82603], [-61.95646, 15.5094], [-61.32485, 14.91445]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "DO", + iso1A3: "DOM", + iso1N3: "214", + wikidata: "Q786", + nameEn: "Dominican Republic", + groups: ["029", "003", "419", "019", "UN"], + callingCodes: ["1 809", "1 829", "1 849"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-67.87844, 21.7938], [-72.38946, 20.27111], [-71.77419, 19.73128], [-71.75865, 19.70231], [-71.7429, 19.58445], [-71.71449, 19.55364], [-71.71268, 19.53374], [-71.6802, 19.45008], [-71.69448, 19.37866], [-71.77766, 19.33823], [-71.73229, 19.26686], [-71.62642, 19.21212], [-71.65337, 19.11759], [-71.69938, 19.10916], [-71.71088, 19.08353], [-71.74088, 19.0437], [-71.88102, 18.95007], [-71.77766, 18.95007], [-71.72624, 18.87802], [-71.71885, 18.78423], [-71.82556, 18.62551], [-71.95412, 18.64939], [-72.00201, 18.62312], [-71.88102, 18.50125], [-71.90875, 18.45821], [-71.69952, 18.34101], [-71.78271, 18.18302], [-71.75465, 18.14405], [-71.74994, 18.11115], [-71.73783, 18.07177], [-71.75671, 18.03456], [-72.29523, 17.48026], [-68.39466, 16.14167], [-67.87844, 21.7938]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "DZ", + iso1A3: "DZA", + iso1N3: "012", + wikidata: "Q262", + nameEn: "Algeria", + groups: ["015", "002", "UN"], + callingCodes: ["213"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[8.59123, 37.14286], [5.10072, 39.89531], [-2.27707, 35.35051], [-2.21248, 35.08532], [-2.21445, 35.04378], [-2.04734, 34.93218], [-1.97833, 34.93218], [-1.97469, 34.886], [-1.73707, 34.74226], [-1.84569, 34.61907], [-1.69788, 34.48056], [-1.78042, 34.39018], [-1.64666, 34.10405], [-1.73494, 33.71721], [-1.59508, 33.59929], [-1.67067, 33.27084], [-1.46249, 33.0499], [-1.54244, 32.95499], [-1.37794, 32.73628], [-0.9912, 32.52467], [-1.24998, 32.32993], [-1.24453, 32.1917], [-1.15735, 32.12096], [-1.22829, 32.07832], [-2.46166, 32.16603], [-2.93873, 32.06557], [-2.82784, 31.79459], [-3.66314, 31.6339], [-3.66386, 31.39202], [-3.77647, 31.31912], [-3.77103, 31.14984], [-3.54944, 31.0503], [-3.65418, 30.85566], [-3.64735, 30.67539], [-4.31774, 30.53229], [-4.6058, 30.28343], [-5.21671, 29.95253], [-5.58831, 29.48103], [-5.72121, 29.52322], [-5.75616, 29.61407], [-6.69965, 29.51623], [-6.78351, 29.44634], [-6.95824, 29.50924], [-7.61585, 29.36252], [-8.6715, 28.71194], [-8.66879, 27.6666], [-8.66674, 27.31569], [-4.83423, 24.99935], [1.15698, 21.12843], [1.20992, 20.73533], [3.24648, 19.81703], [3.12501, 19.1366], [3.36082, 18.9745], [4.26651, 19.14224], [5.8153, 19.45101], [7.38361, 20.79165], [7.48273, 20.87258], [11.96886, 23.51735], [11.62498, 24.26669], [11.41061, 24.21456], [10.85323, 24.5595], [10.33159, 24.5465], [10.02432, 24.98124], [10.03146, 25.35635], [9.38834, 26.19288], [9.51696, 26.39148], [9.89569, 26.57696], [9.78136, 29.40961], [9.3876, 30.16738], [9.55544, 30.23971], [9.07483, 32.07865], [8.35999, 32.50101], [8.31895, 32.83483], [8.1179, 33.05086], [8.11433, 33.10175], [7.83028, 33.18851], [7.73687, 33.42114], [7.54088, 33.7726], [7.52851, 34.06493], [7.66174, 34.20167], [7.74207, 34.16492], [7.81242, 34.21841], [7.86264, 34.3987], [8.20482, 34.57575], [8.29655, 34.72798], [8.25189, 34.92009], [8.30727, 34.95378], [8.3555, 35.10007], [8.47318, 35.23376], [8.30329, 35.29884], [8.36086, 35.47774], [8.35371, 35.66373], [8.26472, 35.73669], [8.2626, 35.91733], [8.40731, 36.42208], [8.18936, 36.44939], [8.16167, 36.48817], [8.47609, 36.66607], [8.46537, 36.7706], [8.57613, 36.78062], [8.67706, 36.8364], [8.62972, 36.86499], [8.64044, 36.9401], [8.59123, 37.14286]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "EA", + wikidata: "Q28868874", + nameEn: "Ceuta, Melilla", + country: "ES", + level: "territory", + isoStatus: "excRes" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "EC", + iso1A3: "ECU", + iso1N3: "218", + wikidata: "Q736", + nameEn: "Ecuador" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "EE", + iso1A3: "EST", + iso1N3: "233", + wikidata: "Q191", + nameEn: "Estonia", + aliases: ["EW"], + groups: ["EU", "154", "150", "UN"], + callingCodes: ["372"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[26.32936, 60.00121], [20.5104, 59.15546], [19.84909, 57.57876], [22.80496, 57.87798], [23.20055, 57.56697], [24.26221, 57.91787], [24.3579, 57.87471], [25.19484, 58.0831], [25.28237, 57.98539], [25.29581, 58.08288], [25.73499, 57.90193], [26.05949, 57.84744], [26.0324, 57.79037], [26.02456, 57.78342], [26.027, 57.78158], [26.0266, 57.77441], [26.02069, 57.77169], [26.02415, 57.76865], [26.03332, 57.7718], [26.0543, 57.76105], [26.08098, 57.76619], [26.2029, 57.7206], [26.1866, 57.6849], [26.29253, 57.59244], [26.46527, 57.56885], [26.54675, 57.51813], [26.90364, 57.62823], [27.34698, 57.52242], [27.31919, 57.57672], [27.40393, 57.62125], [27.3746, 57.66834], [27.52615, 57.72843], [27.50171, 57.78842], [27.56689, 57.83356], [27.78526, 57.83963], [27.81841, 57.89244], [27.67282, 57.92627], [27.62393, 58.09462], [27.48541, 58.22615], [27.55489, 58.39525], [27.36366, 58.78381], [27.74429, 58.98351], [27.80482, 59.1116], [27.87978, 59.18097], [27.90911, 59.24353], [28.00689, 59.28351], [28.14215, 59.28934], [28.19284, 59.35791], [28.20537, 59.36491], [28.21137, 59.38058], [28.19061, 59.39962], [28.04187, 59.47017], [27.85643, 59.58538], [26.90044, 59.63819], [26.32936, 60.00121]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "EG", + iso1A3: "EGY", + iso1N3: "818", + wikidata: "Q79", + nameEn: "Egypt", + groups: ["015", "002", "UN"], + callingCodes: ["20"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[33.62659, 31.82938], [26.92891, 33.39516], [24.8458, 31.39877], [25.01077, 30.73861], [24.71117, 30.17441], [24.99968, 29.24574], [24.99885, 21.99535], [33.17563, 22.00405], [34.0765, 22.00501], [37.8565, 22.00903], [34.4454, 27.91479], [34.8812, 29.36878], [34.92298, 29.45305], [34.26742, 31.21998], [34.24012, 31.29591], [34.23572, 31.2966], [34.21853, 31.32363], [34.052, 31.46619], [33.62659, 31.82938]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "EH", + iso1A3: "ESH", + iso1N3: "732", + wikidata: "Q6250", + nameEn: "Western Sahara", + groups: ["015", "002"], + callingCodes: ["212"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-8.66879, 27.6666], [-8.77527, 27.66663], [-8.71787, 26.9898], [-9.08698, 26.98639], [-9.56957, 26.90042], [-9.81998, 26.71379], [-10.68417, 26.90984], [-11.35695, 26.8505], [-11.23622, 26.72023], [-11.38635, 26.611], [-11.62052, 26.05229], [-12.06001, 26.04442], [-12.12281, 25.13682], [-12.92147, 24.39502], [-13.00628, 24.01923], [-13.75627, 23.77231], [-14.10361, 22.75501], [-14.1291, 22.41636], [-14.48112, 22.00886], [-14.47329, 21.63839], [-14.78487, 21.36587], [-16.44269, 21.39745], [-16.9978, 21.36239], [-17.02707, 21.34022], [-17.21511, 21.34226], [-17.35589, 20.80492], [-17.0471, 20.76408], [-17.0695, 20.85742], [-17.06781, 20.92697], [-17.0396, 20.9961], [-17.0357, 21.05368], [-16.99806, 21.12142], [-16.95474, 21.33997], [-13.01525, 21.33343], [-13.08438, 22.53866], [-13.15313, 22.75649], [-13.10753, 22.89493], [-13.00412, 23.02297], [-12.5741, 23.28975], [-12.36213, 23.3187], [-12.14969, 23.41935], [-12.00251, 23.4538], [-12.0002, 25.9986], [-8.66721, 25.99918], [-8.66674, 27.31569], [-8.66879, 27.6666]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "ER", + iso1A3: "ERI", + iso1N3: "232", + wikidata: "Q986", + nameEn: "Eritrea", + groups: ["014", "202", "002", "UN"], + callingCodes: ["291"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[40.99158, 15.81743], [39.63762, 18.37348], [38.57727, 17.98125], [38.45916, 17.87167], [38.37133, 17.66269], [38.13362, 17.53906], [37.50967, 17.32199], [37.42694, 17.04041], [36.99777, 17.07172], [36.92193, 16.23451], [36.76371, 15.80831], [36.69761, 15.75323], [36.54276, 15.23478], [36.44337, 15.14963], [36.54376, 14.25597], [36.56536, 14.26177], [36.55659, 14.28237], [36.63364, 14.31172], [36.85787, 14.32201], [37.01622, 14.2561], [37.09486, 14.27155], [37.13206, 14.40746], [37.3106, 14.44657], [37.47319, 14.2149], [37.528, 14.18413], [37.91287, 14.89447], [38.0364, 14.72745], [38.25562, 14.67287], [38.3533, 14.51323], [38.45748, 14.41445], [38.78306, 14.4754], [38.98058, 14.54895], [39.02834, 14.63717], [39.16074, 14.65187], [39.14772, 14.61827], [39.19547, 14.56996], [39.23888, 14.56365], [39.26927, 14.48801], [39.2302, 14.44598], [39.2519, 14.40393], [39.37685, 14.54402], [39.52756, 14.49011], [39.50585, 14.55735], [39.58182, 14.60987], [39.76632, 14.54264], [39.9443, 14.41024], [40.07236, 14.54264], [40.14649, 14.53969], [40.21128, 14.39342], [40.25686, 14.41445], [40.9167, 14.11152], [41.25097, 13.60787], [41.62864, 13.38626], [42.05841, 12.80912], [42.21469, 12.75832], [42.2798, 12.6355], [42.4037, 12.46478], [42.46941, 12.52661], [42.6957, 12.36201], [42.7996, 12.42629], [42.86195, 12.58747], [43.29075, 12.79154], [40.99158, 15.81743]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "ES", + iso1A3: "ESP", + iso1N3: "724", + wikidata: "Q29", + nameEn: "Spain" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "ET", + iso1A3: "ETH", + iso1N3: "231", + wikidata: "Q115", + nameEn: "Ethiopia", + groups: ["014", "202", "002", "UN"], + callingCodes: ["251"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[42.4037, 12.46478], [42.2798, 12.6355], [42.21469, 12.75832], [42.05841, 12.80912], [41.62864, 13.38626], [41.25097, 13.60787], [40.9167, 14.11152], [40.25686, 14.41445], [40.21128, 14.39342], [40.14649, 14.53969], [40.07236, 14.54264], [39.9443, 14.41024], [39.76632, 14.54264], [39.58182, 14.60987], [39.50585, 14.55735], [39.52756, 14.49011], [39.37685, 14.54402], [39.2519, 14.40393], [39.2302, 14.44598], [39.26927, 14.48801], [39.23888, 14.56365], [39.19547, 14.56996], [39.14772, 14.61827], [39.16074, 14.65187], [39.02834, 14.63717], [38.98058, 14.54895], [38.78306, 14.4754], [38.45748, 14.41445], [38.3533, 14.51323], [38.25562, 14.67287], [38.0364, 14.72745], [37.91287, 14.89447], [37.528, 14.18413], [37.47319, 14.2149], [37.3106, 14.44657], [37.13206, 14.40746], [37.09486, 14.27155], [37.01622, 14.2561], [36.85787, 14.32201], [36.63364, 14.31172], [36.55659, 14.28237], [36.56536, 14.26177], [36.54376, 14.25597], [36.44653, 13.95666], [36.48824, 13.83954], [36.38993, 13.56459], [36.24545, 13.36759], [36.13374, 12.92665], [36.16651, 12.88019], [36.14268, 12.70879], [36.01458, 12.72478], [35.70476, 12.67101], [35.24302, 11.91132], [35.11492, 11.85156], [35.05832, 11.71158], [35.09556, 11.56278], [34.95704, 11.24448], [35.01215, 11.19626], [34.93172, 10.95946], [34.97789, 10.91559], [34.97491, 10.86147], [34.86916, 10.78832], [34.86618, 10.74588], [34.77532, 10.69027], [34.77383, 10.74588], [34.59062, 10.89072], [34.4372, 10.781], [34.2823, 10.53508], [34.34783, 10.23914], [34.32102, 10.11599], [34.22718, 10.02506], [34.20484, 9.9033], [34.13186, 9.7492], [34.08717, 9.55243], [34.10229, 9.50238], [34.14304, 9.04654], [34.14453, 8.60204], [34.01346, 8.50041], [33.89579, 8.4842], [33.87195, 8.41938], [33.71407, 8.3678], [33.66938, 8.44442], [33.54575, 8.47094], [33.3119, 8.45474], [33.19721, 8.40317], [33.1853, 8.29264], [33.18083, 8.13047], [33.08401, 8.05822], [33.0006, 7.90333], [33.04944, 7.78989], [33.24637, 7.77939], [33.32531, 7.71297], [33.44745, 7.7543], [33.71407, 7.65983], [33.87642, 7.5491], [34.02984, 7.36449], [34.03878, 7.27437], [34.01495, 7.25664], [34.19369, 7.12807], [34.19369, 7.04382], [34.35753, 6.91963], [34.47669, 6.91076], [34.53925, 6.82794], [34.53776, 6.74808], [34.65096, 6.72589], [34.77459, 6.5957], [34.87736, 6.60161], [35.01738, 6.46991], [34.96227, 6.26415], [35.00546, 5.89387], [35.12611, 5.68937], [35.13058, 5.62118], [35.31188, 5.50106], [35.29938, 5.34042], [35.50792, 5.42431], [35.8576, 5.33413], [35.81968, 5.10757], [35.82118, 4.77382], [35.9419, 4.61933], [35.95449, 4.53244], [36.03924, 4.44406], [36.84474, 4.44518], [37.07724, 4.33503], [38.14168, 3.62487], [38.45812, 3.60445], [38.52336, 3.62551], [38.91938, 3.51198], [39.07736, 3.5267], [39.19954, 3.47834], [39.49444, 3.45521], [39.51551, 3.40895], [39.55132, 3.39634], [39.58339, 3.47434], [39.76808, 3.67058], [39.86043, 3.86974], [40.77498, 4.27683], [41.1754, 3.94079], [41.89488, 3.97375], [42.07619, 4.17667], [42.55853, 4.20518], [42.84526, 4.28357], [42.97746, 4.44032], [43.04177, 4.57923], [43.40263, 4.79289], [44.02436, 4.9451], [44.98104, 4.91821], [47.97917, 8.00124], [47.92477, 8.00111], [46.99339, 7.9989], [44.19222, 8.93028], [43.32613, 9.59205], [43.23518, 9.84605], [43.0937, 9.90579], [42.87643, 10.18441], [42.69452, 10.62672], [42.95776, 10.98533], [42.79037, 10.98493], [42.75111, 11.06992], [42.62989, 11.09711], [42.42669, 10.98493], [42.13691, 10.97586], [42.06302, 10.92599], [41.80056, 10.97127], [41.8096, 11.33606], [41.77727, 11.49902], [41.82878, 11.72361], [41.95461, 11.81157], [42.4037, 12.46478]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "EU", + iso1A3: "EUE", + wikidata: "Q458", + nameEn: "European Union", + level: "union", + isoStatus: "excRes" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "FI", + iso1A3: "FIN", + iso1N3: "246", + wikidata: "Q33", + nameEn: "Finland", + aliases: ["SF"] + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "FJ", + iso1A3: "FJI", + iso1N3: "242", + wikidata: "Q712", + nameEn: "Fiji", + groups: ["054", "009", "UN"], + driveSide: "left", + callingCodes: ["679"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[174.245, -23.1974], [179.99999, -22.5], [179.99999, -11.5], [174, -11.5], [174.245, -23.1974]]], [[[-176.76826, -14.95183], [-180, -14.96041], [-180, -22.90585], [-176.74538, -22.89767], [-176.76826, -14.95183]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "FK", + iso1A3: "FLK", + iso1N3: "238", + wikidata: "Q9648", + nameEn: "Falkland Islands", + country: "GB", + groups: ["BOTS", "005", "419", "019", "UN"], + driveSide: "left", + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["500"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-63.67376, -55.11859], [-54.56126, -51.26248], [-61.26735, -50.63919], [-63.67376, -55.11859]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "FM", + iso1A3: "FSM", + iso1N3: "583", + wikidata: "Q702", + nameEn: "Federated States of Micronesia", + groups: ["057", "009", "UN"], + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["691"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[138.20583, 13.3783], [136.27107, 6.73747], [156.88247, -1.39237], [165.19726, 6.22546], [138.20583, 13.3783]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "FO", + iso1A3: "FRO", + iso1N3: "234", + wikidata: "Q4628", + nameEn: "Faroe Islands", + country: "DK", + groups: ["154", "150", "UN"], + callingCodes: ["298"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-8.51774, 62.35338], [-6.51083, 60.95272], [-5.70102, 62.77194], [-8.51774, 62.35338]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "FR", + iso1A3: "FRA", + iso1N3: "250", + wikidata: "Q142", + nameEn: "France" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "FX", + iso1A3: "FXX", + iso1N3: "249", + wikidata: "Q212429", + nameEn: "Metropolitan France", + country: "FR", + groups: ["EU", "155", "150", "UN"], + isoStatus: "excRes", + callingCodes: ["33"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[2.55904, 51.07014], [2.18458, 51.52087], [1.17405, 50.74239], [-2.02963, 49.91866], [-2.09454, 49.46288], [-1.83944, 49.23037], [-2.00491, 48.86706], [-2.65349, 49.15373], [-6.28985, 48.93406], [-1.81005, 43.59738], [-1.77289, 43.38957], [-1.79319, 43.37497], [-1.78332, 43.36399], [-1.78714, 43.35476], [-1.77068, 43.34396], [-1.75334, 43.34107], [-1.75079, 43.3317], [-1.7397, 43.32979], [-1.73074, 43.29481], [-1.69407, 43.31378], [-1.62481, 43.30726], [-1.63052, 43.28591], [-1.61341, 43.25269], [-1.57674, 43.25269], [-1.55963, 43.28828], [-1.50992, 43.29481], [-1.45289, 43.27049], [-1.40942, 43.27272], [-1.3758, 43.24511], [-1.41562, 43.12815], [-1.47555, 43.08372], [-1.44067, 43.047], [-1.35272, 43.02658], [-1.34419, 43.09665], [-1.32209, 43.1127], [-1.27118, 43.11961], [-1.30052, 43.09581], [-1.30531, 43.06859], [-1.25244, 43.04164], [-1.22881, 43.05534], [-1.10333, 43.0059], [-1.00963, 42.99279], [-0.97133, 42.96239], [-0.81652, 42.95166], [-0.75478, 42.96916], [-0.72037, 42.92541], [-0.73422, 42.91228], [-0.72608, 42.89318], [-0.69837, 42.87945], [-0.67637, 42.88303], [-0.55497, 42.77846], [-0.50863, 42.82713], [-0.44334, 42.79939], [-0.41319, 42.80776], [-0.38833, 42.80132], [-0.3122, 42.84788], [-0.17939, 42.78974], [-0.16141, 42.79535], [-0.10519, 42.72761], [-0.02468, 42.68513], [0.17569, 42.73424], [0.25336, 42.7174], [0.29407, 42.67431], [0.36251, 42.72282], [0.40214, 42.69779], [0.67873, 42.69458], [0.65421, 42.75872], [0.66121, 42.84021], [0.711, 42.86372], [0.93089, 42.79154], [0.96166, 42.80629], [0.98292, 42.78754], [1.0804, 42.78569], [1.15928, 42.71407], [1.35562, 42.71944], [1.44197, 42.60217], [1.47986, 42.61346], [1.46718, 42.63296], [1.48043, 42.65203], [1.50867, 42.64483], [1.55418, 42.65669], [1.60085, 42.62703], [1.63485, 42.62957], [1.6625, 42.61982], [1.68267, 42.62533], [1.73452, 42.61515], [1.72588, 42.59098], [1.7858, 42.57698], [1.73683, 42.55492], [1.72515, 42.50338], [1.76335, 42.48863], [1.83037, 42.48395], [1.88853, 42.4501], [1.93663, 42.45439], [1.94292, 42.44316], [1.94061, 42.43333], [1.94084, 42.43039], [1.9574, 42.42401], [1.96482, 42.37787], [2.00488, 42.35399], [2.06241, 42.35906], [2.11621, 42.38393], [2.12789, 42.41291], [2.16599, 42.42314], [2.20578, 42.41633], [2.25551, 42.43757], [2.38504, 42.39977], [2.43299, 42.39423], [2.43508, 42.37568], [2.48457, 42.33933], [2.54382, 42.33406], [2.55516, 42.35351], [2.57934, 42.35808], [2.6747, 42.33974], [2.65311, 42.38771], [2.72056, 42.42298], [2.75497, 42.42578], [2.77464, 42.41046], [2.84335, 42.45724], [2.85675, 42.45444], [2.86983, 42.46843], [2.88413, 42.45938], [2.92107, 42.4573], [2.94283, 42.48174], [2.96518, 42.46692], [3.03734, 42.47363], [3.08167, 42.42748], [3.10027, 42.42621], [3.11379, 42.43646], [3.17156, 42.43545], [3.75438, 42.33445], [7.60802, 41.05927], [10.09675, 41.44089], [9.56115, 43.20816], [7.50102, 43.51859], [7.42422, 43.72209], [7.40903, 43.7296], [7.41113, 43.73156], [7.41291, 43.73168], [7.41298, 43.73311], [7.41233, 43.73439], [7.42062, 43.73977], [7.42299, 43.74176], [7.42443, 43.74087], [7.42809, 43.74396], [7.43013, 43.74895], [7.43624, 43.75014], [7.43708, 43.75197], [7.4389, 43.75151], [7.4379, 43.74963], [7.47823, 43.73341], [7.53006, 43.78405], [7.50423, 43.84345], [7.49355, 43.86551], [7.51162, 43.88301], [7.56075, 43.89932], [7.56858, 43.94506], [7.60771, 43.95772], [7.65266, 43.9763], [7.66848, 43.99943], [7.6597, 44.03009], [7.72508, 44.07578], [7.66878, 44.12795], [7.68694, 44.17487], [7.63245, 44.17877], [7.62155, 44.14881], [7.36364, 44.11882], [7.34547, 44.14359], [7.27827, 44.1462], [7.16929, 44.20352], [7.00764, 44.23736], [6.98221, 44.28289], [6.89171, 44.36637], [6.88784, 44.42043], [6.94504, 44.43112], [6.86233, 44.49834], [6.85507, 44.53072], [6.96042, 44.62129], [6.95133, 44.66264], [7.00582, 44.69364], [7.07484, 44.68073], [7.00401, 44.78782], [7.02217, 44.82519], [6.93499, 44.8664], [6.90774, 44.84322], [6.75518, 44.89915], [6.74519, 44.93661], [6.74791, 45.01939], [6.66981, 45.02324], [6.62803, 45.11175], [6.7697, 45.16044], [6.85144, 45.13226], [6.96706, 45.20841], [7.07074, 45.21228], [7.13115, 45.25386], [7.10572, 45.32924], [7.18019, 45.40071], [7.00037, 45.509], [6.98948, 45.63869], [6.80785, 45.71864], [6.80785, 45.83265], [6.95315, 45.85163], [7.04151, 45.92435], [7.00946, 45.9944], [6.93862, 46.06502], [6.87868, 46.03855], [6.89321, 46.12548], [6.78968, 46.14058], [6.86052, 46.28512], [6.77152, 46.34784], [6.8024, 46.39171], [6.82312, 46.42661], [6.53358, 46.45431], [6.25432, 46.3632], [6.21981, 46.31304], [6.24826, 46.30175], [6.25137, 46.29014], [6.23775, 46.27822], [6.24952, 46.26255], [6.26749, 46.24745], [6.29474, 46.26221], [6.31041, 46.24417], [6.29663, 46.22688], [6.27694, 46.21566], [6.26007, 46.21165], [6.24821, 46.20531], [6.23913, 46.20511], [6.23544, 46.20714], [6.22175, 46.20045], [6.22222, 46.19888], [6.21844, 46.19837], [6.21603, 46.19507], [6.21273, 46.19409], [6.21114, 46.1927], [6.20539, 46.19163], [6.19807, 46.18369], [6.19552, 46.18401], [6.18707, 46.17999], [6.18871, 46.16644], [6.18116, 46.16187], [6.15305, 46.15194], [6.13397, 46.1406], [6.09926, 46.14373], [6.09199, 46.15191], [6.07491, 46.14879], [6.05203, 46.15191], [6.04564, 46.14031], [6.03614, 46.13712], [6.01791, 46.14228], [5.9871, 46.14499], [5.97893, 46.13303], [5.95781, 46.12925], [5.9641, 46.14412], [5.97508, 46.15863], [5.98188, 46.17392], [5.98846, 46.17046], [5.99573, 46.18587], [5.96515, 46.19638], [5.97542, 46.21525], [6.02461, 46.23313], [6.03342, 46.2383], [6.04602, 46.23127], [6.05029, 46.23518], [6.0633, 46.24583], [6.07072, 46.24085], [6.08563, 46.24651], [6.10071, 46.23772], [6.12446, 46.25059], [6.11926, 46.2634], [6.1013, 46.28512], [6.11697, 46.29547], [6.1198, 46.31157], [6.13876, 46.33844], [6.15738, 46.3491], [6.16987, 46.36759], [6.15985, 46.37721], [6.15016, 46.3778], [6.09926, 46.40768], [6.06407, 46.41676], [6.08427, 46.44305], [6.07269, 46.46244], [6.1567, 46.54402], [6.11084, 46.57649], [6.27135, 46.68251], [6.38351, 46.73171], [6.45209, 46.77502], [6.43216, 46.80336], [6.46456, 46.88865], [6.43341, 46.92703], [6.71531, 47.0494], [6.68823, 47.06616], [6.76788, 47.1208], [6.8489, 47.15933], [6.9508, 47.24338], [6.95108, 47.26428], [6.94316, 47.28747], [7.05305, 47.33304], [7.0564, 47.35134], [7.03125, 47.36996], [6.87959, 47.35335], [6.88542, 47.37262], [6.93744, 47.40714], [6.93953, 47.43388], [7.0024, 47.45264], [6.98425, 47.49432], [7.0231, 47.50522], [7.07425, 47.48863], [7.12781, 47.50371], [7.16249, 47.49025], [7.19583, 47.49455], [7.17026, 47.44312], [7.24669, 47.4205], [7.33526, 47.44186], [7.35603, 47.43432], [7.40308, 47.43638], [7.43088, 47.45846], [7.4462, 47.46264], [7.4583, 47.47216], [7.42923, 47.48628], [7.43356, 47.49712], [7.47534, 47.47932], [7.51076, 47.49651], [7.49804, 47.51798], [7.5229, 47.51644], [7.53199, 47.5284], [7.51904, 47.53515], [7.50588, 47.52856], [7.49691, 47.53821], [7.50873, 47.54546], [7.51723, 47.54578], [7.52831, 47.55347], [7.53634, 47.55553], [7.55652, 47.56779], [7.55689, 47.57232], [7.56548, 47.57617], [7.56684, 47.57785], [7.58386, 47.57536], [7.58945, 47.59017], [7.59301, 47.60058], [7.58851, 47.60794], [7.57423, 47.61628], [7.5591, 47.63849], [7.53384, 47.65115], [7.52067, 47.66437], [7.51915, 47.68335], [7.51266, 47.70197], [7.53722, 47.71635], [7.54761, 47.72912], [7.52921, 47.77747], [7.55673, 47.87371], [7.62302, 47.97898], [7.56966, 48.03265], [7.57137, 48.12292], [7.6648, 48.22219], [7.69022, 48.30018], [7.74562, 48.32736], [7.73109, 48.39192], [7.76833, 48.48945], [7.80647, 48.51239], [7.80167, 48.54758], [7.80057, 48.5857], [7.84098, 48.64217], [7.89002, 48.66317], [7.96812, 48.72491], [7.96994, 48.75606], [8.01534, 48.76085], [8.0326, 48.79017], [8.06802, 48.78957], [8.10253, 48.81829], [8.12813, 48.87985], [8.19989, 48.95825], [8.20031, 48.95856], [8.22604, 48.97352], [8.14189, 48.97833], [7.97783, 49.03161], [7.93641, 49.05544], [7.86386, 49.03499], [7.79557, 49.06583], [7.75948, 49.04562], [7.63618, 49.05428], [7.62575, 49.07654], [7.56416, 49.08136], [7.53012, 49.09818], [7.49172, 49.13915], [7.49473, 49.17], [7.44455, 49.16765], [7.44052, 49.18354], [7.3662, 49.17308], [7.35995, 49.14399], [7.3195, 49.14231], [7.29514, 49.11426], [7.23473, 49.12971], [7.1593, 49.1204], [7.1358, 49.1282], [7.12504, 49.14253], [7.10384, 49.13787], [7.10715, 49.15631], [7.07859, 49.15031], [7.09007, 49.13094], [7.07162, 49.1255], [7.06642, 49.11415], [7.05548, 49.11185], [7.04843, 49.11422], [7.04409, 49.12123], [7.04662, 49.13724], [7.03178, 49.15734], [7.0274, 49.17042], [7.03459, 49.19096], [7.01318, 49.19018], [6.97273, 49.2099], [6.95963, 49.203], [6.94028, 49.21641], [6.93831, 49.2223], [6.91875, 49.22261], [6.89298, 49.20863], [6.85939, 49.22376], [6.83555, 49.21249], [6.85119, 49.20038], [6.85016, 49.19354], [6.86225, 49.18185], [6.84703, 49.15734], [6.83385, 49.15162], [6.78265, 49.16793], [6.73765, 49.16375], [6.71137, 49.18808], [6.73256, 49.20486], [6.71843, 49.2208], [6.69274, 49.21661], [6.66583, 49.28065], [6.60186, 49.31055], [6.572, 49.35027], [6.58807, 49.35358], [6.60091, 49.36864], [6.533, 49.40748], [6.55404, 49.42464], [6.42432, 49.47683], [6.40274, 49.46546], [6.39168, 49.4667], [6.38352, 49.46463], [6.36778, 49.46937], [6.3687, 49.4593], [6.28818, 49.48465], [6.27875, 49.503], [6.25029, 49.50609], [6.2409, 49.51408], [6.19543, 49.50536], [6.17386, 49.50934], [6.15366, 49.50226], [6.16115, 49.49297], [6.14321, 49.48796], [6.12814, 49.49365], [6.12346, 49.4735], [6.10325, 49.4707], [6.09845, 49.46351], [6.10072, 49.45268], [6.08373, 49.45594], [6.07887, 49.46399], [6.05553, 49.46663], [6.04176, 49.44801], [6.02743, 49.44845], [6.02648, 49.45451], [5.97693, 49.45513], [5.96876, 49.49053], [5.94224, 49.49608], [5.94128, 49.50034], [5.86571, 49.50015], [5.83389, 49.52152], [5.83467, 49.52717], [5.84466, 49.53027], [5.83648, 49.5425], [5.81664, 49.53775], [5.80871, 49.5425], [5.81838, 49.54777], [5.79195, 49.55228], [5.77435, 49.56298], [5.7577, 49.55915], [5.75649, 49.54321], [5.64505, 49.55146], [5.60909, 49.51228], [5.55001, 49.52729], [5.46541, 49.49825], [5.46734, 49.52648], [5.43713, 49.5707], [5.3974, 49.61596], [5.34837, 49.62889], [5.33851, 49.61599], [5.3137, 49.61225], [5.30214, 49.63055], [5.33039, 49.6555], [5.31465, 49.66846], [5.26232, 49.69456], [5.14545, 49.70287], [5.09249, 49.76193], [4.96714, 49.79872], [4.85464, 49.78995], [4.86965, 49.82271], [4.85134, 49.86457], [4.88529, 49.9236], [4.78827, 49.95609], [4.8382, 50.06738], [4.88602, 50.15182], [4.83279, 50.15331], [4.82438, 50.16878], [4.75237, 50.11314], [4.70064, 50.09384], [4.68695, 49.99685], [4.5414, 49.96911], [4.51098, 49.94659], [4.43488, 49.94122], [4.35051, 49.95315], [4.31963, 49.97043], [4.20532, 49.95803], [4.14239, 49.98034], [4.13508, 50.01976], [4.16294, 50.04719], [4.23101, 50.06945], [4.20147, 50.13535], [4.13561, 50.13078], [4.16014, 50.19239], [4.15524, 50.21103], [4.21945, 50.25539], [4.20651, 50.27333], [4.17861, 50.27443], [4.17347, 50.28838], [4.15524, 50.2833], [4.16808, 50.25786], [4.13665, 50.25609], [4.11954, 50.30425], [4.10957, 50.30234], [4.10237, 50.31247], [4.0689, 50.3254], [4.0268, 50.35793], [3.96771, 50.34989], [3.90781, 50.32814], [3.84314, 50.35219], [3.73911, 50.34809], [3.70987, 50.3191], [3.71009, 50.30305], [3.66976, 50.34563], [3.65709, 50.36873], [3.67262, 50.38663], [3.67494, 50.40239], [3.66153, 50.45165], [3.64426, 50.46275], [3.61014, 50.49568], [3.58361, 50.49049], [3.5683, 50.50192], [3.49509, 50.48885], [3.51564, 50.5256], [3.47385, 50.53397], [3.44629, 50.51009], [3.37693, 50.49538], [3.28575, 50.52724], [3.2729, 50.60718], [3.23951, 50.6585], [3.264, 50.67668], [3.2536, 50.68977], [3.26141, 50.69151], [3.26063, 50.70086], [3.24593, 50.71389], [3.22042, 50.71019], [3.20845, 50.71662], [3.19017, 50.72569], [3.20064, 50.73547], [3.18811, 50.74025], [3.18339, 50.74981], [3.16476, 50.76843], [3.15017, 50.79031], [3.1257, 50.78603], [3.11987, 50.79188], [3.11206, 50.79416], [3.10614, 50.78303], [3.09163, 50.77717], [3.04314, 50.77674], [3.00537, 50.76588], [2.96778, 50.75242], [2.95019, 50.75138], [2.90873, 50.702], [2.91036, 50.6939], [2.90069, 50.69263], [2.88504, 50.70656], [2.87937, 50.70298], [2.86985, 50.7033], [2.8483, 50.72276], [2.81056, 50.71773], [2.71165, 50.81295], [2.63331, 50.81457], [2.59093, 50.91751], [2.63074, 50.94746], [2.57551, 51.00326], [2.55904, 51.07014]], [[1.99838, 42.44682], [1.98378, 42.44697], [1.96125, 42.45364], [1.95606, 42.45785], [1.96215, 42.47854], [1.97003, 42.48081], [1.97227, 42.48487], [1.97697, 42.48568], [1.98022, 42.49569], [1.98916, 42.49351], [1.99766, 42.4858], [1.98579, 42.47486], [1.99216, 42.46208], [2.01564, 42.45171], [1.99838, 42.44682]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "GA", + iso1A3: "GAB", + iso1N3: "266", + wikidata: "Q1000", + nameEn: "Gabon", + groups: ["017", "202", "002", "UN"], + callingCodes: ["241"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[13.29457, 2.16106], [13.28534, 2.25716], [11.37116, 2.29975], [11.3561, 2.17217], [11.35307, 1.00251], [9.79648, 1.0019], [9.75065, 1.06753], [9.66433, 1.06723], [7.24416, -0.64092], [10.75913, -4.39519], [11.12647, -3.94169], [11.22301, -3.69888], [11.48764, -3.51089], [11.57949, -3.52798], [11.68608, -3.68942], [11.87083, -3.71571], [11.92719, -3.62768], [11.8318, -3.5812], [11.96554, -3.30267], [11.70227, -3.17465], [11.70558, -3.0773], [11.80365, -3.00424], [11.64798, -2.81146], [11.5359, -2.85654], [11.64487, -2.61865], [11.57637, -2.33379], [11.74605, -2.39936], [11.96866, -2.33559], [12.04895, -2.41704], [12.47925, -2.32626], [12.44656, -1.92025], [12.61312, -1.8129], [12.82172, -1.91091], [13.02759, -2.33098], [13.47977, -2.43224], [13.75884, -2.09293], [13.92073, -2.35581], [13.85846, -2.46935], [14.10442, -2.49268], [14.23829, -2.33715], [14.16202, -2.23916], [14.23518, -2.15671], [14.25932, -1.97624], [14.41838, -1.89412], [14.52569, -0.57818], [14.41887, -0.44799], [14.2165, -0.38261], [14.06862, -0.20826], [13.90632, -0.2287], [13.88648, 0.26652], [14.10909, 0.58563], [14.26066, 0.57255], [14.48179, 0.9152], [14.25186, 1.39842], [13.89582, 1.4261], [13.15519, 1.23368], [13.25447, 1.32339], [13.13461, 1.57238], [13.29457, 2.16106]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "GB", + iso1A3: "GBR", + iso1N3: "826", + wikidata: "Q145", + ccTLD: ".uk", + nameEn: "United Kingdom", + aliases: ["UK"] + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "GD", + iso1A3: "GRD", + iso1N3: "308", + wikidata: "Q769", + nameEn: "Grenada", + aliases: ["WG"], + groups: ["029", "003", "419", "019", "UN"], + driveSide: "left", + roadSpeedUnit: "mph", + callingCodes: ["1 473"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-62.64026, 12.69984], [-61.77886, 11.36496], [-59.94058, 12.34011], [-62.64026, 12.69984]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "GE", + iso1A3: "GEO", + iso1N3: "268", + wikidata: "Q230", + nameEn: "Georgia", + groups: ["145", "142", "UN"], + callingCodes: ["995"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[46.42738, 41.91323], [45.61676, 42.20768], [45.78692, 42.48358], [45.36501, 42.55268], [45.15318, 42.70598], [44.88754, 42.74934], [44.80941, 42.61277], [44.70002, 42.74679], [44.54202, 42.75699], [43.95517, 42.55396], [43.73119, 42.62043], [43.81453, 42.74297], [43.0419, 43.02413], [43.03322, 43.08883], [42.75889, 43.19651], [42.66667, 43.13917], [42.40563, 43.23226], [41.64935, 43.22331], [40.65957, 43.56212], [40.10657, 43.57344], [40.04445, 43.47776], [40.03312, 43.44262], [40.01007, 43.42411], [40.01552, 43.42025], [40.00853, 43.40578], [40.0078, 43.38551], [39.81147, 43.06294], [40.89217, 41.72528], [41.54366, 41.52185], [41.7148, 41.4932], [41.7124, 41.47417], [41.81939, 41.43621], [41.95134, 41.52466], [42.26387, 41.49346], [42.51772, 41.43606], [42.59202, 41.58183], [42.72794, 41.59714], [42.84471, 41.58912], [42.78995, 41.50126], [42.84899, 41.47265], [42.8785, 41.50516], [43.02956, 41.37891], [43.21707, 41.30331], [43.13373, 41.25503], [43.1945, 41.25242], [43.23096, 41.17536], [43.36118, 41.2028], [43.44973, 41.17666], [43.4717, 41.12611], [43.67712, 41.13398], [43.74717, 41.1117], [43.84835, 41.16329], [44.16591, 41.19141], [44.18148, 41.24644], [44.32139, 41.2079], [44.34337, 41.20312], [44.34417, 41.2382], [44.46791, 41.18204], [44.59322, 41.1933], [44.61462, 41.24018], [44.72814, 41.20338], [44.82084, 41.21513], [44.87887, 41.20195], [44.89911, 41.21366], [44.84358, 41.23088], [44.81749, 41.23488], [44.80053, 41.25949], [44.81437, 41.30371], [44.93493, 41.25685], [45.0133, 41.29747], [45.09867, 41.34065], [45.1797, 41.42231], [45.26285, 41.46433], [45.31352, 41.47168], [45.4006, 41.42402], [45.45973, 41.45898], [45.68389, 41.3539], [45.71035, 41.36208], [45.75705, 41.35157], [45.69946, 41.29545], [45.80842, 41.2229], [45.95786, 41.17956], [46.13221, 41.19479], [46.27698, 41.19011], [46.37661, 41.10805], [46.456, 41.09984], [46.48558, 41.0576], [46.55096, 41.1104], [46.63969, 41.09515], [46.66148, 41.20533], [46.72375, 41.28609], [46.63658, 41.37727], [46.4669, 41.43331], [46.40307, 41.48464], [46.33925, 41.4963], [46.29794, 41.5724], [46.34126, 41.57454], [46.34039, 41.5947], [46.3253, 41.60912], [46.28182, 41.60089], [46.26531, 41.63339], [46.24429, 41.59883], [46.19759, 41.62327], [46.17891, 41.72094], [46.20538, 41.77205], [46.23962, 41.75811], [46.30863, 41.79133], [46.3984, 41.84399], [46.42738, 41.91323]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "GF", + iso1A3: "GUF", + iso1N3: "254", + wikidata: "Q3769", + nameEn: "French Guiana", + country: "FR", + groups: ["Q3320166", "EU", "005", "419", "019", "UN"], + callingCodes: ["594"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-51.35485, 4.8383], [-53.7094, 6.2264], [-54.01074, 5.68785], [-54.01877, 5.52789], [-54.26916, 5.26909], [-54.4717, 4.91964], [-54.38444, 4.13222], [-54.19367, 3.84387], [-54.05128, 3.63557], [-53.98914, 3.627], [-53.9849, 3.58697], [-54.28534, 2.67798], [-54.42864, 2.42442], [-54.6084, 2.32856], [-54.16286, 2.10779], [-53.78743, 2.34412], [-52.96539, 2.1881], [-52.6906, 2.37298], [-52.31787, 3.17896], [-51.85573, 3.83427], [-51.82312, 3.85825], [-51.79599, 3.89336], [-51.61983, 4.14596], [-51.63798, 4.51394], [-51.35485, 4.8383]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "GG", + iso1A3: "GGY", + iso1N3: "831", + wikidata: "Q25230", + nameEn: "Bailiwick of Guernsey", + country: "GB" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "GH", + iso1A3: "GHA", + iso1N3: "288", + wikidata: "Q117", + nameEn: "Ghana", + groups: ["011", "202", "002", "UN"], + callingCodes: ["233"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-0.13493, 11.14075], [-0.27374, 11.17157], [-0.28566, 11.12713], [-0.35955, 11.07801], [-0.38219, 11.12596], [-0.42391, 11.11661], [-0.44298, 11.04292], [-0.61937, 10.91305], [-0.67143, 10.99811], [-2.83373, 11.0067], [-2.94232, 10.64281], [-2.83108, 10.40252], [-2.74174, 9.83172], [-2.76534, 9.56589], [-2.68802, 9.49343], [-2.69814, 9.22717], [-2.77799, 9.04949], [-2.66357, 9.01771], [-2.58243, 8.7789], [-2.49037, 8.20872], [-2.62901, 8.11495], [-2.61232, 8.02645], [-2.67787, 8.02055], [-2.74819, 7.92613], [-2.78395, 7.94974], [-2.79467, 7.86002], [-2.92339, 7.60847], [-2.97822, 7.27165], [-2.95438, 7.23737], [-3.23327, 6.81744], [-3.21954, 6.74407], [-3.25999, 6.62521], [-3.01896, 5.71697], [-2.95323, 5.71865], [-2.96671, 5.6415], [-2.93132, 5.62137], [-2.85378, 5.65156], [-2.76614, 5.60963], [-2.72737, 5.34789], [-2.77625, 5.34621], [-2.73074, 5.1364], [-2.75502, 5.10657], [-2.95261, 5.12477], [-2.96554, 5.10397], [-3.063, 5.13665], [-3.11073, 5.12675], [-3.10675, 5.08515], [-3.34019, 4.17519], [1.07031, 5.15655], [1.27574, 5.93551], [1.19771, 6.11522], [1.19966, 6.17069], [1.09187, 6.17074], [1.05969, 6.22998], [1.03108, 6.24064], [0.99652, 6.33779], [0.89283, 6.33779], [0.71048, 6.53083], [0.74862, 6.56517], [0.63659, 6.63857], [0.6497, 6.73682], [0.58176, 6.76049], [0.57406, 6.80348], [0.52853, 6.82921], [0.56508, 6.92971], [0.52098, 6.94391], [0.52217, 6.9723], [0.59606, 7.01252], [0.65327, 7.31643], [0.62943, 7.41099], [0.57223, 7.39326], [0.52455, 7.45354], [0.51979, 7.58706], [0.58295, 7.62368], [0.62943, 7.85751], [0.58891, 8.12779], [0.6056, 8.13959], [0.61156, 8.18324], [0.5913, 8.19622], [0.63897, 8.25873], [0.73432, 8.29529], [0.64731, 8.48866], [0.47211, 8.59945], [0.37319, 8.75262], [0.52455, 8.87746], [0.45424, 9.04581], [0.56388, 9.40697], [0.49118, 9.48339], [0.36485, 9.49749], [0.33148, 9.44812], [0.25758, 9.42696], [0.2254, 9.47869], [0.31241, 9.50337], [0.30406, 9.521], [0.2409, 9.52335], [0.23851, 9.57389], [0.38153, 9.58682], [0.36008, 9.6256], [0.29334, 9.59387], [0.26712, 9.66437], [0.28261, 9.69022], [0.32313, 9.6491], [0.34816, 9.66907], [0.34816, 9.71607], [0.32075, 9.72781], [0.36366, 10.03309], [0.41252, 10.02018], [0.41371, 10.06361], [0.35293, 10.09412], [0.39584, 10.31112], [0.33028, 10.30408], [0.29453, 10.41546], [0.18846, 10.4096], [0.12886, 10.53149], [-0.05945, 10.63458], [-0.09141, 10.7147], [-0.07327, 10.71845], [-0.07183, 10.76794], [-0.0228, 10.81916], [-0.02685, 10.8783], [-908e-5, 10.91644], [-63e-4, 10.96417], [0.03355, 10.9807], [0.02395, 11.06229], [342e-5, 11.08317], [-514e-5, 11.10763], [-0.0275, 11.11202], [-0.05733, 11.08628], [-0.14462, 11.10811], [-0.13493, 11.14075]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "GI", + iso1A3: "GIB", + iso1N3: "292", + wikidata: "Q1410", + nameEn: "Gibraltar", + country: "GB", + groups: ["Q12837", "BOTS", "039", "150", "UN"], + callingCodes: ["350"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-5.34064, 36.03744], [-5.27801, 36.14942], [-5.33822, 36.15272], [-5.34536, 36.15501], [-5.40526, 36.15488], [-5.34064, 36.03744]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "GL", + iso1A3: "GRL", + iso1N3: "304", + wikidata: "Q223", + nameEn: "Greenland", + country: "DK", + groups: ["Q1451600", "021", "003", "019", "UN"], + callingCodes: ["299"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-49.33696, 84.57952], [-68.21821, 80.48551], [-77.52957, 77.23408], [-46.37635, 57.3249], [-9.68082, 72.73731], [-5.7106, 84.28058], [-49.33696, 84.57952]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "GM", + iso1A3: "GMB", + iso1N3: "270", + wikidata: "Q1005", + nameEn: "The Gambia", + groups: ["011", "202", "002", "UN"], + callingCodes: ["220"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-15.14917, 13.57989], [-14.36795, 13.23033], [-13.79409, 13.34472], [-13.8955, 13.59126], [-14.34721, 13.46578], [-14.93719, 13.80173], [-15.36504, 13.79313], [-15.47902, 13.58758], [-17.43598, 13.59273], [-17.43966, 13.04579], [-16.74676, 13.06025], [-16.69343, 13.16791], [-15.80355, 13.16729], [-15.80478, 13.34832], [-15.26908, 13.37768], [-15.14917, 13.57989]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "GN", + iso1A3: "GIN", + iso1N3: "324", + wikidata: "Q1006", + nameEn: "Guinea", + groups: ["011", "202", "002", "UN"], + callingCodes: ["224"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-11.37536, 12.40788], [-11.46267, 12.44559], [-11.91331, 12.42008], [-12.35415, 12.32758], [-12.87336, 12.51892], [-13.06603, 12.49342], [-13.05296, 12.64003], [-13.70523, 12.68013], [-13.7039, 12.60313], [-13.65089, 12.49515], [-13.64168, 12.42764], [-13.70851, 12.24978], [-13.92745, 12.24077], [-13.94589, 12.16869], [-13.7039, 12.00869], [-13.7039, 11.70195], [-14.09799, 11.63649], [-14.26623, 11.67486], [-14.31513, 11.60713], [-14.51173, 11.49708], [-14.66677, 11.51188], [-14.77786, 11.36323], [-14.95993, 10.99244], [-15.07174, 10.89557], [-15.96748, 10.162], [-14.36218, 8.64107], [-13.29911, 9.04245], [-13.18586, 9.0925], [-13.08953, 9.0409], [-12.94095, 9.26335], [-12.76788, 9.3133], [-12.47254, 9.86834], [-12.24262, 9.92386], [-12.12634, 9.87203], [-11.91023, 9.93927], [-11.89624, 9.99763], [-11.2118, 10.00098], [-10.6534, 9.29919], [-10.74484, 9.07998], [-10.5783, 9.06386], [-10.56197, 8.81225], [-10.47707, 8.67669], [-10.61422, 8.5314], [-10.70565, 8.29235], [-10.63934, 8.35326], [-10.54891, 8.31174], [-10.37257, 8.48941], [-10.27575, 8.48711], [-10.203, 8.47991], [-10.14579, 8.52665], [-10.05375, 8.50697], [-10.05873, 8.42578], [-9.77763, 8.54633], [-9.47415, 8.35195], [-9.50898, 8.18455], [-9.41445, 8.02448], [-9.44928, 7.9284], [-9.35724, 7.74111], [-9.37465, 7.62032], [-9.48161, 7.37122], [-9.41943, 7.41809], [-9.305, 7.42056], [-9.20798, 7.38109], [-9.18311, 7.30461], [-9.09107, 7.1985], [-8.93435, 7.2824], [-8.85724, 7.26019], [-8.8448, 7.35149], [-8.72789, 7.51429], [-8.67814, 7.69428], [-8.55874, 7.70167], [-8.55874, 7.62525], [-8.47114, 7.55676], [-8.4003, 7.6285], [-8.21374, 7.54466], [-8.09931, 7.78626], [-8.13414, 7.87991], [-8.06449, 8.04989], [-7.94695, 8.00925], [-7.99919, 8.11023], [-7.98675, 8.20134], [-8.062, 8.16071], [-8.2411, 8.24196], [-8.22991, 8.48438], [-7.92518, 8.50652], [-7.65653, 8.36873], [-7.69882, 8.66148], [-7.95503, 8.81146], [-7.92518, 8.99332], [-7.73862, 9.08422], [-7.90777, 9.20456], [-7.85056, 9.41812], [-8.03463, 9.39604], [-8.14657, 9.55062], [-8.09434, 9.86936], [-8.15652, 9.94288], [-8.11921, 10.04577], [-8.01225, 10.1021], [-7.97971, 10.17117], [-7.9578, 10.2703], [-8.10207, 10.44649], [-8.22711, 10.41722], [-8.32614, 10.69273], [-8.2667, 10.91762], [-8.35083, 11.06234], [-8.66923, 10.99397], [-8.40058, 11.37466], [-8.80854, 11.66715], [-8.94784, 12.34842], [-9.13689, 12.50875], [-9.38067, 12.48446], [-9.32097, 12.29009], [-9.63938, 12.18312], [-9.714, 12.0226], [-10.30604, 12.24634], [-10.71897, 11.91552], [-10.80355, 12.1053], [-10.99758, 12.24634], [-11.24136, 12.01286], [-11.50006, 12.17826], [-11.37536, 12.40788]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "GP", + iso1A3: "GLP", + iso1N3: "312", + wikidata: "Q17012", + nameEn: "Guadeloupe", + country: "FR", + groups: ["Q3320166", "EU", "029", "003", "419", "019", "UN"], + callingCodes: ["590"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-60.03183, 16.1129], [-61.60296, 16.73066], [-63.00549, 15.26166], [-60.03183, 16.1129]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "GQ", + iso1A3: "GNQ", + iso1N3: "226", + wikidata: "Q983", + nameEn: "Equatorial Guinea", + groups: ["017", "202", "002", "UN"], + callingCodes: ["240"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[9.22018, 3.72052], [8.34397, 4.30689], [7.71762, 0.6674], [3.35016, -3.29031], [9.66433, 1.06723], [9.75065, 1.06753], [9.79648, 1.0019], [11.35307, 1.00251], [11.3561, 2.17217], [9.991, 2.16561], [9.90749, 2.20049], [9.89012, 2.20457], [9.84716, 2.24676], [9.83238, 2.29079], [9.83754, 2.32428], [9.82123, 2.35097], [9.81162, 2.33797], [9.22018, 3.72052]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "GR", + iso1A3: "GRC", + iso1N3: "300", + wikidata: "Q41", + nameEn: "Greece", + aliases: ["EL"], + groups: ["EU", "039", "150", "UN"], + callingCodes: ["30"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[26.03489, 40.73051], [26.0754, 40.72772], [26.08638, 40.73214], [26.12495, 40.74283], [26.12854, 40.77339], [26.15685, 40.80709], [26.21351, 40.83298], [26.20856, 40.86048], [26.26169, 40.9168], [26.29441, 40.89119], [26.28623, 40.93005], [26.32259, 40.94042], [26.35894, 40.94292], [26.33297, 40.98388], [26.3606, 41.02027], [26.31928, 41.07386], [26.32259, 41.24929], [26.39861, 41.25053], [26.5209, 41.33993], [26.5837, 41.32131], [26.62997, 41.34613], [26.61767, 41.42281], [26.59742, 41.48058], [26.59196, 41.60491], [26.5209, 41.62592], [26.47958, 41.67037], [26.35957, 41.71149], [26.30255, 41.70925], [26.2654, 41.71544], [26.22888, 41.74139], [26.21325, 41.73223], [26.16841, 41.74858], [26.06148, 41.70345], [26.07083, 41.64584], [26.15146, 41.60828], [26.14328, 41.55496], [26.17951, 41.55409], [26.176, 41.50072], [26.14796, 41.47533], [26.20288, 41.43943], [26.16548, 41.42278], [26.12926, 41.35878], [25.87919, 41.30526], [25.8266, 41.34563], [25.70507, 41.29209], [25.66183, 41.31316], [25.61042, 41.30614], [25.55082, 41.31667], [25.52394, 41.2798], [25.48187, 41.28506], [25.28322, 41.23411], [25.11611, 41.34212], [24.942, 41.38685], [24.90928, 41.40876], [24.86136, 41.39298], [24.82514, 41.4035], [24.8041, 41.34913], [24.71529, 41.41928], [24.61129, 41.42278], [24.52599, 41.56808], [24.30513, 41.51297], [24.27124, 41.57682], [24.18126, 41.51735], [24.10063, 41.54796], [24.06323, 41.53222], [24.06908, 41.46132], [23.96975, 41.44118], [23.91483, 41.47971], [23.89613, 41.45257], [23.80148, 41.43943], [23.76525, 41.40175], [23.67644, 41.41139], [23.63203, 41.37632], [23.52453, 41.40262], [23.40416, 41.39999], [23.33639, 41.36317], [23.31301, 41.40525], [23.22771, 41.37106], [23.21953, 41.33773], [23.1833, 41.31755], [22.93334, 41.34104], [22.81199, 41.3398], [22.76408, 41.32225], [22.74538, 41.16321], [22.71266, 41.13945], [22.65306, 41.18168], [22.62852, 41.14385], [22.58295, 41.11568], [22.5549, 41.13065], [22.42285, 41.11921], [22.26744, 41.16409], [22.17629, 41.15969], [22.1424, 41.12449], [22.06527, 41.15617], [21.90869, 41.09191], [21.91102, 41.04786], [21.7556, 40.92525], [21.69601, 40.9429], [21.57448, 40.86076], [21.53007, 40.90759], [21.41555, 40.9173], [21.35595, 40.87578], [21.25779, 40.86165], [21.21105, 40.8855], [21.15262, 40.85546], [20.97887, 40.85475], [20.98396, 40.79109], [20.95752, 40.76982], [20.98134, 40.76046], [21.05833, 40.66586], [21.03932, 40.56299], [20.96908, 40.51526], [20.94925, 40.46625], [20.83688, 40.47882], [20.7906, 40.42726], [20.78234, 40.35803], [20.71789, 40.27739], [20.67162, 40.09433], [20.62566, 40.0897], [20.61081, 40.07866], [20.55593, 40.06524], [20.51297, 40.08168], [20.48487, 40.06271], [20.42373, 40.06777], [20.37911, 39.99058], [20.31135, 39.99438], [20.41546, 39.82832], [20.41475, 39.81437], [20.38572, 39.78516], [20.30804, 39.81563], [20.29152, 39.80421], [20.31961, 39.72799], [20.27412, 39.69884], [20.22707, 39.67459], [20.22376, 39.64532], [20.15988, 39.652], [20.12956, 39.65805], [20.05189, 39.69112], [20.00957, 39.69227], [19.98042, 39.6504], [19.92466, 39.69533], [19.97622, 39.78684], [19.95905, 39.82857], [19.0384, 40.35325], [19.20409, 39.7532], [22.5213, 33.45682], [29.73302, 35.92555], [29.69611, 36.10365], [29.61805, 36.14179], [29.61002, 36.1731], [29.48192, 36.18377], [29.30783, 36.01033], [28.23708, 36.56812], [27.95037, 36.46155], [27.89482, 36.69898], [27.46117, 36.53789], [27.24613, 36.71622], [27.45627, 36.9008], [27.20312, 36.94571], [27.14757, 37.32], [26.95583, 37.64989], [26.99377, 37.69034], [27.16428, 37.72343], [27.05537, 37.9131], [26.21136, 38.17558], [26.24183, 38.44695], [26.32173, 38.48731], [26.21136, 38.65436], [26.61814, 38.81372], [26.70773, 39.0312], [26.43357, 39.43096], [25.94257, 39.39358], [25.61285, 40.17161], [26.04292, 40.3958], [25.94795, 40.72797], [26.03489, 40.73051]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "GS", + iso1A3: "SGS", + iso1N3: "239", + wikidata: "Q35086", + nameEn: "South Georgia and South Sandwich Islands", + country: "GB", + groups: ["BOTS", "005", "419", "019", "UN"], + driveSide: "left", + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["500"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-35.26394, -43.68272], [-53.39656, -59.87088], [-22.31757, -59.85974], [-35.26394, -43.68272]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "GT", + iso1A3: "GTM", + iso1N3: "320", + wikidata: "Q774", + nameEn: "Guatemala", + groups: ["013", "003", "419", "019", "UN"], + callingCodes: ["502"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-89.14985, 17.81563], [-90.98678, 17.81655], [-90.99199, 17.25192], [-91.43809, 17.25373], [-91.04436, 16.92175], [-90.69064, 16.70697], [-90.61212, 16.49832], [-90.40499, 16.40524], [-90.44567, 16.07573], [-91.73182, 16.07371], [-92.20983, 15.26077], [-92.0621, 15.07406], [-92.1454, 14.98143], [-92.1423, 14.88647], [-92.18161, 14.84147], [-92.1454, 14.6804], [-92.2261, 14.53423], [-92.37213, 14.39277], [-90.55276, 12.8866], [-90.11344, 13.73679], [-90.10505, 13.85104], [-89.88937, 14.0396], [-89.81807, 14.07073], [-89.76103, 14.02923], [-89.73251, 14.04133], [-89.75569, 14.07073], [-89.70756, 14.1537], [-89.61844, 14.21937], [-89.52397, 14.22628], [-89.50614, 14.26084], [-89.58814, 14.33165], [-89.57441, 14.41637], [-89.39028, 14.44561], [-89.34776, 14.43013], [-89.35189, 14.47553], [-89.23719, 14.58046], [-89.15653, 14.57802], [-89.13132, 14.71582], [-89.23467, 14.85596], [-89.15149, 14.97775], [-89.18048, 14.99967], [-89.15149, 15.07392], [-88.97343, 15.14039], [-88.32467, 15.63665], [-88.31459, 15.66942], [-88.24022, 15.69247], [-88.22552, 15.72294], [-88.20359, 16.03858], [-88.40779, 16.09624], [-88.95358, 15.88698], [-89.02415, 15.9063], [-89.17418, 15.90898], [-89.22683, 15.88619], [-89.15025, 17.04813], [-89.14985, 17.81563]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "GU", + iso1A3: "GUM", + iso1N3: "316", + wikidata: "Q16635", + nameEn: "Guam", + aliases: ["US-GU"], + country: "US", + groups: ["Q1352230", "Q153732", "057", "009", "UN"], + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["1 671"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[146.25931, 13.85876], [143.82485, 13.92273], [144.61642, 12.82462], [146.25931, 13.85876]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "GW", + iso1A3: "GNB", + iso1N3: "624", + wikidata: "Q1007", + nameEn: "Guinea-Bissau", + groups: ["011", "202", "002", "UN"], + callingCodes: ["245"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-14.31513, 11.60713], [-14.26623, 11.67486], [-14.09799, 11.63649], [-13.7039, 11.70195], [-13.7039, 12.00869], [-13.94589, 12.16869], [-13.92745, 12.24077], [-13.70851, 12.24978], [-13.64168, 12.42764], [-13.65089, 12.49515], [-13.7039, 12.60313], [-13.70523, 12.68013], [-15.17582, 12.6847], [-15.67302, 12.42974], [-16.20591, 12.46157], [-16.38191, 12.36449], [-16.70562, 12.34803], [-17.4623, 11.92379], [-15.96748, 10.162], [-15.07174, 10.89557], [-14.95993, 10.99244], [-14.77786, 11.36323], [-14.66677, 11.51188], [-14.51173, 11.49708], [-14.31513, 11.60713]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "GY", + iso1A3: "GUY", + iso1N3: "328", + wikidata: "Q734", + nameEn: "Guyana", + groups: ["005", "419", "019", "UN"], + driveSide: "left", + callingCodes: ["592"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-56.84822, 6.73257], [-59.54058, 8.6862], [-59.98508, 8.53046], [-59.85562, 8.35213], [-59.80661, 8.28906], [-59.83156, 8.23261], [-59.97059, 8.20791], [-60.02407, 8.04557], [-60.38056, 7.8302], [-60.51959, 7.83373], [-60.64793, 7.56877], [-60.71923, 7.55817], [-60.59802, 7.33194], [-60.63367, 7.25061], [-60.54098, 7.14804], [-60.44116, 7.20817], [-60.28074, 7.1162], [-60.39419, 6.94847], [-60.54873, 6.8631], [-61.13632, 6.70922], [-61.20762, 6.58174], [-61.15058, 6.19558], [-61.4041, 5.95304], [-60.73204, 5.20931], [-60.32352, 5.21299], [-60.20944, 5.28754], [-59.98129, 5.07097], [-60.04189, 4.69801], [-60.15953, 4.53456], [-59.78878, 4.45637], [-59.69361, 4.34069], [-59.73353, 4.20399], [-59.51963, 3.91951], [-59.86899, 3.57089], [-59.79769, 3.37162], [-59.99733, 2.92312], [-59.91177, 2.36759], [-59.7264, 2.27497], [-59.74066, 1.87596], [-59.25583, 1.40559], [-58.92072, 1.31293], [-58.84229, 1.17749], [-58.53571, 1.29154], [-58.4858, 1.48399], [-58.33887, 1.58014], [-58.01873, 1.51966], [-57.97336, 1.64566], [-57.77281, 1.73344], [-57.55743, 1.69605], [-57.35073, 1.98327], [-57.23981, 1.95808], [-57.09109, 2.01854], [-57.07092, 1.95304], [-56.7659, 1.89509], [-56.47045, 1.95135], [-56.55439, 2.02003], [-56.70519, 2.02964], [-57.35891, 3.32121], [-58.0307, 3.95513], [-57.8699, 4.89394], [-57.37442, 5.0208], [-57.22536, 5.15605], [-57.31629, 5.33714], [-56.84822, 6.73257]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "HK", + iso1A3: "HKG", + iso1N3: "344", + wikidata: "Q8646", + nameEn: "Hong Kong", + country: "CN", + groups: ["030", "142", "UN"], + driveSide: "left", + callingCodes: ["852"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[113.92195, 22.13873], [114.50148, 22.15017], [114.44998, 22.55977], [114.25154, 22.55977], [114.22888, 22.5436], [114.22185, 22.55343], [114.20655, 22.55706], [114.18338, 22.55444], [114.17247, 22.55944], [114.1597, 22.56041], [114.15123, 22.55163], [114.1482, 22.54091], [114.13823, 22.54319], [114.12665, 22.54003], [114.11656, 22.53415], [114.11181, 22.52878], [114.1034, 22.5352], [114.09692, 22.53435], [114.09048, 22.53716], [114.08606, 22.53276], [114.07817, 22.52997], [114.07267, 22.51855], [114.06272, 22.51617], [114.05729, 22.51104], [114.05438, 22.5026], [114.03113, 22.5065], [113.86771, 22.42972], [113.81621, 22.2163], [113.83338, 22.1826], [113.92195, 22.13873]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "HM", + iso1A3: "HMD", + iso1N3: "334", + wikidata: "Q131198", + nameEn: "Heard Island and McDonald Islands", + country: "AU", + groups: ["053", "009", "UN"], + driveSide: "left" + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[71.08716, -53.87687], [75.44182, -53.99822], [72.87012, -51.48322], [71.08716, -53.87687]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "HN", + iso1A3: "HND", + iso1N3: "340", + wikidata: "Q783", + nameEn: "Honduras", + groups: ["013", "003", "419", "019", "UN"], + callingCodes: ["504"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-83.86109, 17.73736], [-88.20359, 16.03858], [-88.22552, 15.72294], [-88.24022, 15.69247], [-88.31459, 15.66942], [-88.32467, 15.63665], [-88.97343, 15.14039], [-89.15149, 15.07392], [-89.18048, 14.99967], [-89.15149, 14.97775], [-89.23467, 14.85596], [-89.13132, 14.71582], [-89.15653, 14.57802], [-89.23719, 14.58046], [-89.35189, 14.47553], [-89.34776, 14.43013], [-89.04187, 14.33644], [-88.94608, 14.20207], [-88.85785, 14.17763], [-88.815, 14.11652], [-88.73182, 14.10919], [-88.70661, 14.04317], [-88.49738, 13.97224], [-88.48982, 13.86458], [-88.25791, 13.91108], [-88.23018, 13.99915], [-88.07641, 13.98447], [-88.00331, 13.86948], [-87.7966, 13.91353], [-87.68821, 13.80829], [-87.73106, 13.75443], [-87.78148, 13.52906], [-87.71657, 13.50577], [-87.72115, 13.46083], [-87.73841, 13.44169], [-87.77354, 13.45767], [-87.83467, 13.44655], [-87.84675, 13.41078], [-87.80177, 13.35689], [-87.73714, 13.32715], [-87.69751, 13.25228], [-87.55124, 13.12523], [-87.37107, 12.98646], [-87.06306, 13.00892], [-87.03785, 12.98682], [-86.93197, 13.05313], [-86.93383, 13.18677], [-86.87066, 13.30641], [-86.71267, 13.30348], [-86.76812, 13.79605], [-86.35219, 13.77157], [-86.14801, 14.04317], [-86.00685, 14.08474], [-86.03458, 13.99181], [-85.75477, 13.8499], [-85.73964, 13.9698], [-85.45762, 14.11304], [-85.32149, 14.2562], [-85.18602, 14.24929], [-85.1575, 14.53934], [-84.90082, 14.80489], [-84.82596, 14.82212], [-84.70119, 14.68078], [-84.48373, 14.63249], [-84.10584, 14.76353], [-83.89551, 14.76697], [-83.62101, 14.89448], [-83.49268, 15.01158], [-83.13724, 15.00002], [-83.04763, 15.03256], [-82.06974, 14.49418], [-81.58685, 18.0025], [-83.86109, 17.73736]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "HR", + iso1A3: "HRV", + iso1N3: "191", + wikidata: "Q224", + nameEn: "Croatia", + groups: ["EU", "039", "150", "UN"], + callingCodes: ["385"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[17.6444, 42.88641], [17.5392, 42.92787], [17.70879, 42.97223], [17.64268, 43.08595], [17.46986, 43.16559], [17.286, 43.33065], [17.25579, 43.40353], [17.29699, 43.44542], [17.24411, 43.49376], [17.15828, 43.49376], [17.00585, 43.58037], [16.80736, 43.76011], [16.75316, 43.77157], [16.70922, 43.84887], [16.55472, 43.95326], [16.50528, 44.0244], [16.43629, 44.02826], [16.43662, 44.07523], [16.36864, 44.08263], [16.18688, 44.27012], [16.21346, 44.35231], [16.12969, 44.38275], [16.16814, 44.40679], [16.10566, 44.52586], [16.03012, 44.55572], [16.00884, 44.58605], [16.05828, 44.61538], [15.89348, 44.74964], [15.8255, 44.71501], [15.72584, 44.82334], [15.79472, 44.8455], [15.76096, 44.87045], [15.74723, 44.96818], [15.78568, 44.97401], [15.74585, 45.0638], [15.78842, 45.11519], [15.76371, 45.16508], [15.83512, 45.22459], [15.98412, 45.23088], [16.12153, 45.09616], [16.29036, 44.99732], [16.35404, 45.00241], [16.35863, 45.03529], [16.3749, 45.05206], [16.38219, 45.05139], [16.38309, 45.05955], [16.40023, 45.1147], [16.4634, 45.14522], [16.49155, 45.21153], [16.52982, 45.22713], [16.5501, 45.2212], [16.56559, 45.22307], [16.60194, 45.23042], [16.64962, 45.20714], [16.74845, 45.20393], [16.78219, 45.19002], [16.81137, 45.18434], [16.83804, 45.18951], [16.92405, 45.27607], [16.9385, 45.22742], [17.0415, 45.20759], [17.18438, 45.14764], [17.24325, 45.146], [17.25131, 45.14957], [17.26815, 45.18444], [17.32092, 45.16246], [17.33573, 45.14521], [17.41229, 45.13335], [17.4498, 45.16119], [17.45615, 45.12523], [17.47589, 45.12656], [17.51469, 45.10791], [17.59104, 45.10816], [17.66571, 45.13408], [17.84826, 45.04489], [17.87148, 45.04645], [17.93706, 45.08016], [17.97336, 45.12245], [17.97834, 45.13831], [17.99479, 45.14958], [18.01594, 45.15163], [18.03121, 45.12632], [18.1624, 45.07654], [18.24387, 45.13699], [18.32077, 45.1021], [18.41896, 45.11083], [18.47939, 45.05871], [18.65723, 45.07544], [18.78357, 44.97741], [18.80661, 44.93561], [18.76369, 44.93707], [18.76347, 44.90669], [18.8704, 44.85097], [19.01994, 44.85493], [18.98957, 44.90645], [19.02871, 44.92541], [19.06853, 44.89915], [19.15573, 44.95409], [19.05205, 44.97692], [19.1011, 45.01191], [19.07952, 45.14668], [19.14063, 45.12972], [19.19144, 45.17863], [19.43589, 45.17137], [19.41941, 45.23475], [19.28208, 45.23813], [19.10774, 45.29547], [18.97446, 45.37528], [18.99918, 45.49333], [19.08364, 45.48804], [19.07471, 45.53086], [18.94562, 45.53712], [18.88776, 45.57253], [18.96691, 45.66731], [18.90305, 45.71863], [18.85783, 45.85493], [18.81394, 45.91329], [18.80211, 45.87995], [18.6792, 45.92057], [18.57483, 45.80772], [18.44368, 45.73972], [18.12439, 45.78905], [18.08869, 45.76511], [17.99805, 45.79671], [17.87377, 45.78522], [17.66545, 45.84207], [17.56821, 45.93728], [17.35672, 45.95209], [17.14592, 46.16697], [16.8903, 46.28122], [16.8541, 46.36255], [16.7154, 46.39523], [16.6639, 46.45203], [16.59527, 46.47524], [16.52604, 46.47831], [16.5007, 46.49644], [16.44036, 46.5171], [16.38771, 46.53608], [16.37193, 46.55008], [16.29793, 46.5121], [16.26733, 46.51505], [16.26759, 46.50566], [16.23961, 46.49653], [16.25124, 46.48067], [16.27398, 46.42875], [16.27329, 46.41467], [16.30162, 46.40437], [16.30233, 46.37837], [16.18824, 46.38282], [16.14859, 46.40547], [16.05281, 46.39141], [16.05065, 46.3833], [16.07314, 46.36458], [16.07616, 46.3463], [15.97965, 46.30652], [15.79284, 46.25811], [15.78817, 46.21719], [15.75479, 46.20336], [15.75436, 46.21969], [15.67395, 46.22478], [15.6434, 46.21396], [15.64904, 46.19229], [15.59909, 46.14761], [15.6083, 46.11992], [15.62317, 46.09103], [15.72977, 46.04682], [15.71246, 46.01196], [15.70327, 46.00015], [15.70636, 45.92116], [15.67967, 45.90455], [15.68383, 45.88867], [15.68232, 45.86819], [15.70411, 45.8465], [15.66662, 45.84085], [15.64185, 45.82915], [15.57952, 45.84953], [15.52234, 45.82195], [15.47325, 45.8253], [15.47531, 45.79802], [15.40836, 45.79491], [15.25423, 45.72275], [15.30872, 45.69014], [15.34919, 45.71623], [15.4057, 45.64727], [15.38952, 45.63682], [15.34214, 45.64702], [15.34695, 45.63382], [15.31027, 45.6303], [15.27747, 45.60504], [15.29837, 45.5841], [15.30249, 45.53224], [15.38188, 45.48752], [15.33051, 45.45258], [15.27758, 45.46678], [15.16862, 45.42309], [15.05187, 45.49079], [15.02385, 45.48533], [14.92266, 45.52788], [14.90554, 45.47769], [14.81992, 45.45913], [14.80124, 45.49515], [14.71718, 45.53442], [14.68605, 45.53006], [14.69694, 45.57366], [14.59576, 45.62812], [14.60977, 45.66403], [14.57397, 45.67165], [14.53816, 45.6205], [14.5008, 45.60852], [14.49769, 45.54424], [14.36693, 45.48642], [14.32487, 45.47142], [14.27681, 45.4902], [14.26611, 45.48239], [14.24239, 45.50607], [14.22371, 45.50388], [14.20348, 45.46896], [14.07116, 45.48752], [14.00578, 45.52352], [13.96063, 45.50825], [13.99488, 45.47551], [13.97309, 45.45258], [13.90771, 45.45149], [13.88124, 45.42637], [13.81742, 45.43729], [13.7785, 45.46787], [13.67398, 45.4436], [13.62902, 45.45898], [13.56979, 45.4895], [13.45644, 45.59464], [13.05142, 45.33128], [13.12821, 44.48877], [16.15283, 42.18525], [18.45131, 42.21682], [18.54128, 42.39171], [18.52152, 42.42302], [18.43588, 42.48556], [18.44307, 42.51077], [18.43735, 42.55921], [18.36197, 42.61423], [18.24318, 42.6112], [17.88201, 42.83668], [17.80854, 42.9182], [17.7948, 42.89556], [17.68151, 42.92725], [17.6444, 42.88641]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "HT", + iso1A3: "HTI", + iso1N3: "332", + wikidata: "Q790", + nameEn: "Haiti", + aliases: ["RH"], + groups: ["029", "003", "419", "019", "UN"], + callingCodes: ["509"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-71.71885, 18.78423], [-71.72624, 18.87802], [-71.77766, 18.95007], [-71.88102, 18.95007], [-71.74088, 19.0437], [-71.71088, 19.08353], [-71.69938, 19.10916], [-71.65337, 19.11759], [-71.62642, 19.21212], [-71.73229, 19.26686], [-71.77766, 19.33823], [-71.69448, 19.37866], [-71.6802, 19.45008], [-71.71268, 19.53374], [-71.71449, 19.55364], [-71.7429, 19.58445], [-71.75865, 19.70231], [-71.77419, 19.73128], [-72.38946, 20.27111], [-73.37289, 20.43199], [-74.7289, 18.71009], [-74.76465, 18.06252], [-72.29523, 17.48026], [-71.75671, 18.03456], [-71.73783, 18.07177], [-71.74994, 18.11115], [-71.75465, 18.14405], [-71.78271, 18.18302], [-71.69952, 18.34101], [-71.90875, 18.45821], [-71.88102, 18.50125], [-72.00201, 18.62312], [-71.95412, 18.64939], [-71.82556, 18.62551], [-71.71885, 18.78423]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "HU", + iso1A3: "HUN", + iso1N3: "348", + wikidata: "Q28", + nameEn: "Hungary", + groups: ["EU", "151", "150", "UN"], + callingCodes: ["36"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[21.72525, 48.34628], [21.67134, 48.3989], [21.6068, 48.50365], [21.44063, 48.58456], [21.11516, 48.49546], [20.83248, 48.5824], [20.5215, 48.53336], [20.29943, 48.26104], [20.24312, 48.2784], [19.92452, 48.1283], [19.63338, 48.25006], [19.52489, 48.19791], [19.47957, 48.09437], [19.28182, 48.08336], [19.23924, 48.0595], [19.01952, 48.07052], [18.82176, 48.04206], [18.76134, 47.97499], [18.76821, 47.87469], [18.8506, 47.82308], [18.74074, 47.8157], [18.66521, 47.76772], [18.56496, 47.76588], [18.29305, 47.73541], [18.02938, 47.75665], [17.71215, 47.7548], [17.23699, 48.02094], [17.16001, 48.00636], [17.09786, 47.97336], [17.11022, 47.92461], [17.08275, 47.87719], [17.00997, 47.86245], [17.07039, 47.81129], [17.05048, 47.79377], [17.08893, 47.70928], [16.87538, 47.68895], [16.86509, 47.72268], [16.82938, 47.68432], [16.7511, 47.67878], [16.72089, 47.73469], [16.65679, 47.74197], [16.61183, 47.76171], [16.54779, 47.75074], [16.53514, 47.73837], [16.55129, 47.72268], [16.4222, 47.66537], [16.58699, 47.61772], [16.64193, 47.63114], [16.71059, 47.52692], [16.64821, 47.50155], [16.6718, 47.46139], [16.57152, 47.40868], [16.52414, 47.41007], [16.49908, 47.39416], [16.45104, 47.41181], [16.47782, 47.25918], [16.44142, 47.25079], [16.43663, 47.21127], [16.41739, 47.20649], [16.42801, 47.18422], [16.4523, 47.18812], [16.46442, 47.16845], [16.44932, 47.14418], [16.52863, 47.13974], [16.46134, 47.09395], [16.52176, 47.05747], [16.43936, 47.03548], [16.51369, 47.00084], [16.28202, 47.00159], [16.27594, 46.9643], [16.22403, 46.939], [16.19904, 46.94134], [16.10983, 46.867], [16.14365, 46.8547], [16.15711, 46.85434], [16.21892, 46.86961], [16.2365, 46.87775], [16.2941, 46.87137], [16.34547, 46.83836], [16.3408, 46.80641], [16.31303, 46.79838], [16.30966, 46.7787], [16.37816, 46.69975], [16.42641, 46.69228], [16.41863, 46.66238], [16.38594, 46.6549], [16.39217, 46.63673], [16.50139, 46.56684], [16.52885, 46.53303], [16.52604, 46.5051], [16.59527, 46.47524], [16.6639, 46.45203], [16.7154, 46.39523], [16.8541, 46.36255], [16.8903, 46.28122], [17.14592, 46.16697], [17.35672, 45.95209], [17.56821, 45.93728], [17.66545, 45.84207], [17.87377, 45.78522], [17.99805, 45.79671], [18.08869, 45.76511], [18.12439, 45.78905], [18.44368, 45.73972], [18.57483, 45.80772], [18.6792, 45.92057], [18.80211, 45.87995], [18.81394, 45.91329], [18.99712, 45.93537], [19.01284, 45.96529], [19.0791, 45.96458], [19.10388, 46.04015], [19.14543, 45.9998], [19.28826, 45.99694], [19.52473, 46.1171], [19.56113, 46.16824], [19.66007, 46.19005], [19.81491, 46.1313], [19.93508, 46.17553], [20.01816, 46.17696], [20.03533, 46.14509], [20.09713, 46.17315], [20.26068, 46.12332], [20.28324, 46.1438], [20.35573, 46.16629], [20.45377, 46.14405], [20.49718, 46.18721], [20.63863, 46.12728], [20.76085, 46.21002], [20.74574, 46.25467], [20.86797, 46.28884], [21.06572, 46.24897], [21.16872, 46.30118], [21.28061, 46.44941], [21.26929, 46.4993], [21.33214, 46.63035], [21.43926, 46.65109], [21.5151, 46.72147], [21.48935, 46.7577], [21.52028, 46.84118], [21.59307, 46.86935], [21.59581, 46.91628], [21.68645, 46.99595], [21.648, 47.03902], [21.78395, 47.11104], [21.94463, 47.38046], [22.01055, 47.37767], [22.03389, 47.42508], [22.00917, 47.50492], [22.31816, 47.76126], [22.41979, 47.7391], [22.46559, 47.76583], [22.67247, 47.7871], [22.76617, 47.8417], [22.77991, 47.87211], [22.89849, 47.95851], [22.84276, 47.98602], [22.87847, 48.04665], [22.81804, 48.11363], [22.73427, 48.12005], [22.66835, 48.09162], [22.58733, 48.10813], [22.59007, 48.15121], [22.49806, 48.25189], [22.38133, 48.23726], [22.2083, 48.42534], [22.14689, 48.4005], [21.83339, 48.36242], [21.8279, 48.33321], [21.72525, 48.34628]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "IC", + wikidata: "Q5813", + nameEn: "Canary Islands", + country: "ES", + groups: ["Q3320166", "Q105472", "EU", "039", "150", "UN"], + isoStatus: "excRes", + callingCodes: ["34"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-12.00985, 30.24121], [-25.3475, 27.87574], [-14.43883, 27.02969], [-12.00985, 30.24121]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "ID", + iso1A3: "IDN", + iso1N3: "360", + wikidata: "Q252", + nameEn: "Indonesia", + aliases: ["RI"] + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "IE", + iso1A3: "IRL", + iso1N3: "372", + wikidata: "Q27", + nameEn: "Republic of Ireland", + groups: ["EU", "Q22890", "154", "150", "UN"], + driveSide: "left", + callingCodes: ["353"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-6.26218, 54.09785], [-6.29003, 54.11278], [-6.32694, 54.09337], [-6.36279, 54.11248], [-6.36605, 54.07234], [-6.47849, 54.06947], [-6.62842, 54.03503], [-6.66264, 54.0666], [-6.6382, 54.17071], [-6.70175, 54.20218], [-6.74575, 54.18788], [-6.81583, 54.22791], [-6.85179, 54.29176], [-6.87775, 54.34682], [-7.02034, 54.4212], [-7.19145, 54.31296], [-7.14908, 54.22732], [-7.25012, 54.20063], [-7.26316, 54.13863], [-7.29493, 54.12013], [-7.29687, 54.1354], [-7.28017, 54.16714], [-7.29157, 54.17191], [-7.34005, 54.14698], [-7.30553, 54.11869], [-7.32834, 54.11475], [-7.44567, 54.1539], [-7.4799, 54.12239], [-7.55812, 54.12239], [-7.69501, 54.20731], [-7.81397, 54.20159], [-7.8596, 54.21779], [-7.87101, 54.29299], [-8.04555, 54.36292], [-8.179, 54.46763], [-8.04538, 54.48941], [-7.99812, 54.54427], [-7.8596, 54.53671], [-7.70315, 54.62077], [-7.93293, 54.66603], [-7.83352, 54.73854], [-7.75041, 54.7103], [-7.64449, 54.75265], [-7.54671, 54.74606], [-7.54508, 54.79401], [-7.47626, 54.83084], [-7.4473, 54.87003], [-7.44404, 54.9403], [-7.40004, 54.94498], [-7.4033, 55.00391], [-7.34464, 55.04688], [-7.2471, 55.06933], [-6.34755, 55.49206], [-7.75229, 55.93854], [-22.01468, 48.19557], [-6.03913, 51.13217], [-5.37267, 53.63269], [-6.26218, 54.09785]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "IL", + iso1A3: "ISR", + iso1N3: "376", + wikidata: "Q801", + nameEn: "Israel", + groups: ["145", "142", "UN"], + callingCodes: ["972"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[34.052, 31.46619], [34.29262, 31.70393], [34.48681, 31.59711], [34.56797, 31.54197], [34.48892, 31.48365], [34.40077, 31.40926], [34.36505, 31.36404], [34.37381, 31.30598], [34.36523, 31.28963], [34.29417, 31.24194], [34.26742, 31.21998], [34.92298, 29.45305], [34.97718, 29.54294], [34.98207, 29.58147], [35.02147, 29.66343], [35.14108, 30.07374], [35.19183, 30.34636], [35.16218, 30.43535], [35.19595, 30.50297], [35.21379, 30.60401], [35.29311, 30.71365], [35.33456, 30.81224], [35.33984, 30.8802], [35.41371, 30.95565], [35.43658, 31.12444], [35.40316, 31.25535], [35.47672, 31.49578], [35.39675, 31.49572], [35.22921, 31.37445], [35.13033, 31.3551], [35.02459, 31.35979], [34.92571, 31.34337], [34.88932, 31.37093], [34.87833, 31.39321], [34.89756, 31.43891], [34.93258, 31.47816], [34.94356, 31.50743], [34.9415, 31.55601], [34.95249, 31.59813], [35.00879, 31.65426], [35.08226, 31.69107], [35.10782, 31.71594], [35.11895, 31.71454], [35.12933, 31.7325], [35.13931, 31.73012], [35.15119, 31.73634], [35.15474, 31.73352], [35.16478, 31.73242], [35.18023, 31.72067], [35.20538, 31.72388], [35.21937, 31.71578], [35.22392, 31.71899], [35.23972, 31.70896], [35.24315, 31.71244], [35.2438, 31.7201], [35.24981, 31.72543], [35.25182, 31.73945], [35.26319, 31.74846], [35.25225, 31.7678], [35.26058, 31.79064], [35.25573, 31.81362], [35.26404, 31.82567], [35.251, 31.83085], [35.25753, 31.8387], [35.24816, 31.8458], [35.2304, 31.84222], [35.2249, 31.85433], [35.22817, 31.8638], [35.22567, 31.86745], [35.22294, 31.87889], [35.22014, 31.88264], [35.2136, 31.88241], [35.21276, 31.88153], [35.21016, 31.88237], [35.20945, 31.8815], [35.20791, 31.8821], [35.20673, 31.88151], [35.20381, 31.86716], [35.21128, 31.863], [35.216, 31.83894], [35.21469, 31.81835], [35.19461, 31.82687], [35.18169, 31.82542], [35.18603, 31.80901], [35.14174, 31.81325], [35.07677, 31.85627], [35.05617, 31.85685], [35.01978, 31.82944], [34.9724, 31.83352], [34.99712, 31.85569], [35.03489, 31.85919], [35.03978, 31.89276], [35.03489, 31.92448], [35.00124, 31.93264], [34.98682, 31.96935], [35.00261, 32.027], [34.9863, 32.09551], [34.99437, 32.10962], [34.98507, 32.12606], [34.99039, 32.14626], [34.96009, 32.17503], [34.95703, 32.19522], [34.98885, 32.20758], [35.01841, 32.23981], [35.02939, 32.2671], [35.01119, 32.28684], [35.01772, 32.33863], [35.04243, 32.35008], [35.05142, 32.3667], [35.0421, 32.38242], [35.05311, 32.4024], [35.05423, 32.41754], [35.07059, 32.4585], [35.08564, 32.46948], [35.09236, 32.47614], [35.10024, 32.47856], [35.10882, 32.4757], [35.15937, 32.50466], [35.2244, 32.55289], [35.25049, 32.52453], [35.29306, 32.50947], [35.30685, 32.51024], [35.35212, 32.52047], [35.40224, 32.50136], [35.42034, 32.46009], [35.41598, 32.45593], [35.41048, 32.43706], [35.42078, 32.41562], [35.55807, 32.38674], [35.55494, 32.42687], [35.57485, 32.48669], [35.56614, 32.64393], [35.59813, 32.65159], [35.61669, 32.67999], [35.66527, 32.681], [35.68467, 32.70715], [35.75983, 32.74803], [35.78745, 32.77938], [35.83758, 32.82817], [35.84021, 32.8725], [35.87012, 32.91976], [35.89298, 32.9456], [35.87188, 32.98028], [35.84802, 33.1031], [35.81911, 33.11077], [35.81911, 33.1336], [35.84285, 33.16673], [35.83846, 33.19397], [35.81647, 33.2028], [35.81295, 33.24841], [35.77513, 33.27342], [35.813, 33.3172], [35.77477, 33.33609], [35.62019, 33.27278], [35.62283, 33.24226], [35.58502, 33.26653], [35.58326, 33.28381], [35.56523, 33.28969], [35.55555, 33.25844], [35.54544, 33.25513], [35.54808, 33.236], [35.5362, 33.23196], [35.54228, 33.19865], [35.52573, 33.11921], [35.50335, 33.114], [35.50272, 33.09056], [35.448, 33.09264], [35.43059, 33.06659], [35.35223, 33.05617], [35.31429, 33.10515], [35.1924, 33.08743], [35.10645, 33.09318], [34.78515, 33.20368], [33.62659, 31.82938], [34.052, 31.46619]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "IM", + iso1A3: "IMN", + iso1N3: "833", + wikidata: "Q9676", + nameEn: "Isle of Man", + country: "GB", + groups: ["Q185086", "154", "150", "UN"], + driveSide: "left", + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["44 01624", "44 07624", "44 07524", "44 07924"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-3.98763, 54.07351], [-4.1819, 54.57861], [-5.6384, 53.81157], [-3.98763, 54.07351]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "IN", + iso1A3: "IND", + iso1N3: "356", + wikidata: "Q668", + nameEn: "India" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "IO", + iso1A3: "IOT", + iso1N3: "086", + wikidata: "Q43448", + nameEn: "British Indian Ocean Territory", + country: "GB" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "IQ", + iso1A3: "IRQ", + iso1N3: "368", + wikidata: "Q796", + nameEn: "Iraq", + groups: ["145", "142", "UN"], + callingCodes: ["964"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[42.78887, 37.38615], [42.56725, 37.14878], [42.35724, 37.10998], [42.36697, 37.0627], [41.81736, 36.58782], [41.40058, 36.52502], [41.28864, 36.35368], [41.2564, 36.06012], [41.37027, 35.84095], [41.38184, 35.62502], [41.26569, 35.42708], [41.21654, 35.1508], [41.2345, 34.80049], [41.12388, 34.65742], [40.97676, 34.39788], [40.64314, 34.31604], [38.79171, 33.37328], [39.08202, 32.50304], [38.98762, 32.47694], [39.04251, 32.30203], [39.26157, 32.35555], [39.29903, 32.23259], [40.01521, 32.05667], [42.97601, 30.72204], [42.97796, 30.48295], [44.72255, 29.19736], [46.42415, 29.05947], [46.5527, 29.10283], [46.89695, 29.50584], [47.15166, 30.01044], [47.37192, 30.10421], [47.7095, 30.10453], [48.01114, 29.98906], [48.06782, 30.02906], [48.17332, 30.02448], [48.40479, 29.85763], [48.59531, 29.66815], [48.83867, 29.78572], [48.61441, 29.93675], [48.51011, 29.96238], [48.44785, 30.00148], [48.4494, 30.04456], [48.43384, 30.08233], [48.38869, 30.11062], [48.38714, 30.13485], [48.41671, 30.17254], [48.41117, 30.19846], [48.26393, 30.3408], [48.24385, 30.33846], [48.21279, 30.31644], [48.19425, 30.32796], [48.18321, 30.39703], [48.14585, 30.44133], [48.02443, 30.4789], [48.03221, 30.9967], [47.68219, 31.00004], [47.6804, 31.39086], [47.86337, 31.78422], [47.64771, 32.07666], [47.52474, 32.15972], [47.57144, 32.20583], [47.37529, 32.47808], [47.17218, 32.45393], [46.46788, 32.91992], [46.32298, 32.9731], [46.17198, 32.95612], [46.09103, 32.98354], [46.15175, 33.07229], [46.03966, 33.09577], [46.05367, 33.13097], [46.11905, 33.11924], [46.20623, 33.20395], [45.99919, 33.5082], [45.86687, 33.49263], [45.96183, 33.55751], [45.89801, 33.63661], [45.77814, 33.60938], [45.50261, 33.94968], [45.42789, 33.9458], [45.41077, 33.97421], [45.47264, 34.03099], [45.56176, 34.15088], [45.58667, 34.30147], [45.53552, 34.35148], [45.49171, 34.3439], [45.46697, 34.38221], [45.43879, 34.45949], [45.51883, 34.47692], [45.53219, 34.60441], [45.59074, 34.55558], [45.60224, 34.55057], [45.73923, 34.54416], [45.70031, 34.69277], [45.65672, 34.7222], [45.68284, 34.76624], [45.70031, 34.82322], [45.73641, 34.83975], [45.79682, 34.85133], [45.78904, 34.91135], [45.86532, 34.89858], [45.89477, 34.95805], [45.87864, 35.03441], [45.92173, 35.0465], [45.92203, 35.09538], [45.93108, 35.08148], [45.94756, 35.09188], [46.06508, 35.03699], [46.07747, 35.0838], [46.11763, 35.07551], [46.19116, 35.11097], [46.15642, 35.1268], [46.16229, 35.16984], [46.19738, 35.18536], [46.18457, 35.22561], [46.11367, 35.23729], [46.15474, 35.2883], [46.13152, 35.32548], [46.05358, 35.38568], [45.98453, 35.49848], [46.01518, 35.52012], [45.97584, 35.58132], [46.03028, 35.57416], [46.01307, 35.59756], [46.0165, 35.61501], [45.99452, 35.63574], [46.0117, 35.65059], [46.01631, 35.69139], [46.23736, 35.71414], [46.34166, 35.78363], [46.32921, 35.82655], [46.17198, 35.8013], [46.08325, 35.8581], [45.94711, 35.82218], [45.89784, 35.83708], [45.81442, 35.82107], [45.76145, 35.79898], [45.6645, 35.92872], [45.60018, 35.96069], [45.55245, 35.99943], [45.46594, 36.00042], [45.38275, 35.97156], [45.33916, 35.99424], [45.37652, 36.06222], [45.37312, 36.09917], [45.32235, 36.17383], [45.30038, 36.27769], [45.26261, 36.3001], [45.27394, 36.35846], [45.23953, 36.43257], [45.11811, 36.40751], [45.00759, 36.5402], [45.06985, 36.62645], [45.06985, 36.6814], [45.01537, 36.75128], [44.84725, 36.77622], [44.83479, 36.81362], [44.90173, 36.86096], [44.91199, 36.91468], [44.89862, 37.01897], [44.81611, 37.04383], [44.75229, 37.11958], [44.78319, 37.1431], [44.76698, 37.16162], [44.63179, 37.19229], [44.42631, 37.05825], [44.38117, 37.05825], [44.35315, 37.04955], [44.35937, 37.02843], [44.30645, 36.97373], [44.25975, 36.98119], [44.18503, 37.09551], [44.22239, 37.15756], [44.27998, 37.16501], [44.2613, 37.25055], [44.13521, 37.32486], [44.02002, 37.33229], [43.90949, 37.22453], [43.84878, 37.22205], [43.82699, 37.19477], [43.8052, 37.22825], [43.7009, 37.23692], [43.63085, 37.21957], [43.56702, 37.25675], [43.50787, 37.24436], [43.33508, 37.33105], [43.30083, 37.30629], [43.11403, 37.37436], [42.93705, 37.32015], [42.78887, 37.38615]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "IR", + iso1A3: "IRN", + iso1N3: "364", + wikidata: "Q794", + nameEn: "Iran", + groups: ["034", "142", "UN"], + callingCodes: ["98"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[44.96746, 39.42998], [44.88916, 39.59653], [44.81043, 39.62677], [44.71806, 39.71124], [44.65422, 39.72163], [44.6137, 39.78393], [44.47298, 39.68788], [44.48111, 39.61579], [44.41849, 39.56659], [44.42832, 39.4131], [44.37921, 39.4131], [44.29818, 39.378], [44.22452, 39.4169], [44.03667, 39.39223], [44.1043, 39.19842], [44.20946, 39.13975], [44.18863, 38.93881], [44.30322, 38.81581], [44.26155, 38.71427], [44.28065, 38.6465], [44.32058, 38.62752], [44.3207, 38.49799], [44.3119, 38.37887], [44.38309, 38.36117], [44.44386, 38.38295], [44.50115, 38.33939], [44.42476, 38.25763], [44.22509, 37.88859], [44.3883, 37.85433], [44.45948, 37.77065], [44.55498, 37.783], [44.62096, 37.71985], [44.56887, 37.6429], [44.61401, 37.60165], [44.58449, 37.45018], [44.81021, 37.2915], [44.75986, 37.21549], [44.7868, 37.16644], [44.78319, 37.1431], [44.75229, 37.11958], [44.81611, 37.04383], [44.89862, 37.01897], [44.91199, 36.91468], [44.90173, 36.86096], [44.83479, 36.81362], [44.84725, 36.77622], [45.01537, 36.75128], [45.06985, 36.6814], [45.06985, 36.62645], [45.00759, 36.5402], [45.11811, 36.40751], [45.23953, 36.43257], [45.27394, 36.35846], [45.26261, 36.3001], [45.30038, 36.27769], [45.32235, 36.17383], [45.37312, 36.09917], [45.37652, 36.06222], [45.33916, 35.99424], [45.38275, 35.97156], [45.46594, 36.00042], [45.55245, 35.99943], [45.60018, 35.96069], [45.6645, 35.92872], [45.76145, 35.79898], [45.81442, 35.82107], [45.89784, 35.83708], [45.94711, 35.82218], [46.08325, 35.8581], [46.17198, 35.8013], [46.32921, 35.82655], [46.34166, 35.78363], [46.23736, 35.71414], [46.01631, 35.69139], [46.0117, 35.65059], [45.99452, 35.63574], [46.0165, 35.61501], [46.01307, 35.59756], [46.03028, 35.57416], [45.97584, 35.58132], [46.01518, 35.52012], [45.98453, 35.49848], [46.05358, 35.38568], [46.13152, 35.32548], [46.15474, 35.2883], [46.11367, 35.23729], [46.18457, 35.22561], [46.19738, 35.18536], [46.16229, 35.16984], [46.15642, 35.1268], [46.19116, 35.11097], [46.11763, 35.07551], [46.07747, 35.0838], [46.06508, 35.03699], [45.94756, 35.09188], [45.93108, 35.08148], [45.92203, 35.09538], [45.92173, 35.0465], [45.87864, 35.03441], [45.89477, 34.95805], [45.86532, 34.89858], [45.78904, 34.91135], [45.79682, 34.85133], [45.73641, 34.83975], [45.70031, 34.82322], [45.68284, 34.76624], [45.65672, 34.7222], [45.70031, 34.69277], [45.73923, 34.54416], [45.60224, 34.55057], [45.59074, 34.55558], [45.53219, 34.60441], [45.51883, 34.47692], [45.43879, 34.45949], [45.46697, 34.38221], [45.49171, 34.3439], [45.53552, 34.35148], [45.58667, 34.30147], [45.56176, 34.15088], [45.47264, 34.03099], [45.41077, 33.97421], [45.42789, 33.9458], [45.50261, 33.94968], [45.77814, 33.60938], [45.89801, 33.63661], [45.96183, 33.55751], [45.86687, 33.49263], [45.99919, 33.5082], [46.20623, 33.20395], [46.11905, 33.11924], [46.05367, 33.13097], [46.03966, 33.09577], [46.15175, 33.07229], [46.09103, 32.98354], [46.17198, 32.95612], [46.32298, 32.9731], [46.46788, 32.91992], [47.17218, 32.45393], [47.37529, 32.47808], [47.57144, 32.20583], [47.52474, 32.15972], [47.64771, 32.07666], [47.86337, 31.78422], [47.6804, 31.39086], [47.68219, 31.00004], [48.03221, 30.9967], [48.02443, 30.4789], [48.14585, 30.44133], [48.18321, 30.39703], [48.19425, 30.32796], [48.21279, 30.31644], [48.24385, 30.33846], [48.26393, 30.3408], [48.41117, 30.19846], [48.41671, 30.17254], [48.38714, 30.13485], [48.38869, 30.11062], [48.43384, 30.08233], [48.4494, 30.04456], [48.44785, 30.00148], [48.51011, 29.96238], [48.61441, 29.93675], [48.83867, 29.78572], [49.98877, 27.87827], [50.37726, 27.89227], [54.39838, 25.68383], [55.14145, 25.62624], [55.81777, 26.18798], [56.2644, 26.58649], [56.68954, 26.76645], [56.79239, 26.41236], [56.82555, 25.7713], [56.86325, 25.03856], [61.46682, 24.57869], [61.6433, 25.27541], [61.683, 25.66638], [61.83968, 25.7538], [61.83831, 26.07249], [61.89391, 26.26251], [62.05117, 26.31647], [62.21304, 26.26601], [62.31484, 26.528], [62.77352, 26.64099], [63.1889, 26.65072], [63.18688, 26.83844], [63.25005, 26.84212], [63.25005, 27.08692], [63.32283, 27.14437], [63.19649, 27.25674], [62.80604, 27.22412], [62.79684, 27.34381], [62.84905, 27.47627], [62.7638, 28.02992], [62.79412, 28.28108], [62.59499, 28.24842], [62.40259, 28.42703], [61.93581, 28.55284], [61.65978, 28.77937], [61.53765, 29.00507], [61.31508, 29.38903], [60.87231, 29.86514], [61.80829, 30.84224], [61.78268, 30.92724], [61.8335, 30.97669], [61.83257, 31.0452], [61.80957, 31.12576], [61.80569, 31.16167], [61.70929, 31.37391], [60.84541, 31.49561], [60.86191, 32.22565], [60.56485, 33.12944], [60.88908, 33.50219], [60.91133, 33.55596], [60.69573, 33.56054], [60.57762, 33.59772], [60.5485, 33.73422], [60.5838, 33.80793], [60.50209, 34.13992], [60.66502, 34.31539], [60.91321, 34.30411], [60.72316, 34.52857], [60.99922, 34.63064], [61.00197, 34.70631], [61.06926, 34.82139], [61.12831, 35.09938], [61.0991, 35.27845], [61.18187, 35.30249], [61.27371, 35.61482], [61.22719, 35.67038], [61.26152, 35.80749], [61.22444, 35.92879], [61.12007, 35.95992], [61.22719, 36.12759], [61.1393, 36.38782], [61.18187, 36.55348], [61.14516, 36.64644], [60.34767, 36.63214], [60.00768, 37.04102], [59.74678, 37.12499], [59.55178, 37.13594], [59.39385, 37.34257], [59.39797, 37.47892], [59.33507, 37.53146], [59.22905, 37.51161], [58.9338, 37.67374], [58.6921, 37.64548], [58.5479, 37.70526], [58.47786, 37.6433], [58.39959, 37.63134], [58.22999, 37.6856], [58.21399, 37.77281], [57.79534, 37.89299], [57.35042, 37.98546], [57.37236, 38.09321], [57.21169, 38.28965], [57.03453, 38.18717], [56.73928, 38.27887], [56.62255, 38.24005], [56.43303, 38.26054], [56.32454, 38.18502], [56.33278, 38.08132], [55.97847, 38.08024], [55.76561, 38.12238], [55.44152, 38.08564], [55.13412, 37.94705], [54.851, 37.75739], [54.77684, 37.62264], [54.81804, 37.61285], [54.77822, 37.51597], [54.67247, 37.43532], [54.58664, 37.45809], [54.36211, 37.34912], [54.24565, 37.32047], [53.89734, 37.3464], [48.88288, 38.43975], [48.84969, 38.45015], [48.81072, 38.44853], [48.78979, 38.45026], [48.70001, 38.40564], [48.62217, 38.40198], [48.58793, 38.45076], [48.45084, 38.61013], [48.3146, 38.59958], [48.24773, 38.71883], [48.02581, 38.82705], [48.01409, 38.90333], [48.07734, 38.91616], [48.08627, 38.94434], [48.28437, 38.97186], [48.33884, 39.03022], [48.31239, 39.09278], [48.15361, 39.19419], [48.12404, 39.25208], [48.15984, 39.30028], [48.37385, 39.37584], [48.34264, 39.42935], [47.98977, 39.70999], [47.84774, 39.66285], [47.50099, 39.49615], [47.38978, 39.45999], [47.31301, 39.37492], [47.05927, 39.24846], [47.05771, 39.20143], [46.95341, 39.13505], [46.92539, 39.16644], [46.83822, 39.13143], [46.75752, 39.03231], [46.53497, 38.86548], [46.34059, 38.92076], [46.20601, 38.85262], [46.14785, 38.84206], [46.06766, 38.87861], [46.00228, 38.87376], [45.94624, 38.89072], [45.90266, 38.87739], [45.83883, 38.90768], [45.65172, 38.95199], [45.6155, 38.94304], [45.6131, 38.964], [45.44966, 38.99243], [45.44811, 39.04927], [45.40452, 39.07224], [45.40148, 39.09007], [45.30489, 39.18333], [45.16168, 39.21952], [45.08751, 39.35052], [45.05932, 39.36435], [44.96746, 39.42998]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "IS", + iso1A3: "ISL", + iso1N3: "352", + wikidata: "Q189", + nameEn: "Iceland", + groups: ["154", "150", "UN"], + callingCodes: ["354"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-33.15676, 62.62995], [-8.25539, 63.0423], [-15.70914, 69.67442], [-33.15676, 62.62995]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "IT", + iso1A3: "ITA", + iso1N3: "380", + wikidata: "Q38", + nameEn: "Italy", + groups: ["EU", "039", "150", "UN"], + callingCodes: ["39"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[8.95861, 45.96485], [8.97604, 45.96151], [8.97741, 45.98317], [8.96668, 45.98436], [8.95861, 45.96485]]], [[[7.63035, 43.57419], [9.56115, 43.20816], [10.09675, 41.44089], [7.60802, 41.05927], [7.89009, 38.19924], [11.2718, 37.6713], [12.13667, 34.20326], [14.02721, 36.53141], [17.67657, 35.68918], [18.83516, 40.36999], [16.15283, 42.18525], [13.12821, 44.48877], [13.05142, 45.33128], [13.45644, 45.59464], [13.6076, 45.64761], [13.7198, 45.59352], [13.74587, 45.59811], [13.78445, 45.5825], [13.84106, 45.58185], [13.86771, 45.59898], [13.8695, 45.60835], [13.9191, 45.6322], [13.87933, 45.65207], [13.83422, 45.68703], [13.83332, 45.70855], [13.8235, 45.7176], [13.66986, 45.79955], [13.59784, 45.8072], [13.58858, 45.83503], [13.57563, 45.8425], [13.58644, 45.88173], [13.59565, 45.89446], [13.60857, 45.89907], [13.61931, 45.91782], [13.63815, 45.93607], [13.6329, 45.94894], [13.64307, 45.98326], [13.63458, 45.98947], [13.62074, 45.98388], [13.58903, 45.99009], [13.56759, 45.96991], [13.52963, 45.96588], [13.50104, 45.98078], [13.47474, 46.00546], [13.49702, 46.01832], [13.50998, 46.04498], [13.49568, 46.04839], [13.50104, 46.05986], [13.57072, 46.09022], [13.64053, 46.13587], [13.66472, 46.17392], [13.64451, 46.18966], [13.56682, 46.18703], [13.56114, 46.2054], [13.47587, 46.22725], [13.42218, 46.20758], [13.37671, 46.29668], [13.44808, 46.33507], [13.43418, 46.35992], [13.47019, 46.3621], [13.5763, 46.40915], [13.5763, 46.42613], [13.59777, 46.44137], [13.68684, 46.43881], [13.7148, 46.5222], [13.64088, 46.53438], [13.27627, 46.56059], [12.94445, 46.60401], [12.59992, 46.6595], [12.38708, 46.71529], [12.27591, 46.88651], [12.2006, 46.88854], [12.11675, 47.01241], [12.21781, 47.03996], [12.19254, 47.09331], [11.74789, 46.98484], [11.50739, 47.00644], [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.54783, 46.84505], [10.47197, 46.85698], [10.38659, 46.67847], [10.40475, 46.63671], [10.44686, 46.64162], [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.14439, 46.22992], [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.25502, 46.43743], [9.29226, 46.32717], [9.24503, 46.23616], [9.01618, 46.04928], [8.99257, 45.9698], [9.09065, 45.89906], [9.06642, 45.8761], [9.04546, 45.84968], [9.04059, 45.8464], [9.03505, 45.83976], [9.03793, 45.83548], [9.03279, 45.82865], [9.0298, 45.82127], [9.00324, 45.82055], [8.99663, 45.83466], [8.9621, 45.83707], [8.94737, 45.84285], [8.91129, 45.8388], [8.93504, 45.86245], [8.94372, 45.86587], [8.93649, 45.86775], [8.88904, 45.95465], [8.86688, 45.96135], [8.85121, 45.97239], [8.8319, 45.9879], [8.79362, 45.99207], [8.78585, 45.98973], [8.79414, 46.00913], [8.85617, 46.0748], [8.80778, 46.10085], [8.75697, 46.10395], [8.62242, 46.12112], [8.45032, 46.26869], [8.46317, 46.43712], [8.42464, 46.46367], [8.30648, 46.41587], [8.31162, 46.38044], [8.08814, 46.26692], [8.16866, 46.17817], [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], [7.07074, 45.21228], [6.96706, 45.20841], [6.85144, 45.13226], [6.7697, 45.16044], [6.62803, 45.11175], [6.66981, 45.02324], [6.74791, 45.01939], [6.74519, 44.93661], [6.75518, 44.89915], [6.90774, 44.84322], [6.93499, 44.8664], [7.02217, 44.82519], [7.00401, 44.78782], [7.07484, 44.68073], [7.00582, 44.69364], [6.95133, 44.66264], [6.96042, 44.62129], [6.85507, 44.53072], [6.86233, 44.49834], [6.94504, 44.43112], [6.88784, 44.42043], [6.89171, 44.36637], [6.98221, 44.28289], [7.00764, 44.23736], [7.16929, 44.20352], [7.27827, 44.1462], [7.34547, 44.14359], [7.36364, 44.11882], [7.62155, 44.14881], [7.63245, 44.17877], [7.68694, 44.17487], [7.66878, 44.12795], [7.72508, 44.07578], [7.6597, 44.03009], [7.66848, 43.99943], [7.65266, 43.9763], [7.60771, 43.95772], [7.56858, 43.94506], [7.56075, 43.89932], [7.51162, 43.88301], [7.49355, 43.86551], [7.50423, 43.84345], [7.53006, 43.78405], [7.63035, 43.57419]], [[12.45181, 41.90056], [12.44834, 41.90095], [12.44582, 41.90194], [12.44815, 41.90326], [12.44984, 41.90545], [12.45091, 41.90625], [12.45543, 41.90738], [12.45561, 41.90629], [12.45762, 41.9058], [12.45755, 41.9033], [12.45826, 41.90281], [12.45834, 41.90174], [12.4577, 41.90115], [12.45691, 41.90125], [12.45626, 41.90172], [12.45435, 41.90143], [12.45446, 41.90028], [12.45181, 41.90056]], [[12.45648, 43.89369], [12.44184, 43.90498], [12.41641, 43.89991], [12.40935, 43.9024], [12.41233, 43.90956], [12.40733, 43.92379], [12.41551, 43.92984], [12.41165, 43.93769], [12.40506, 43.94325], [12.40415, 43.95485], [12.41414, 43.95273], [12.42005, 43.9578], [12.43662, 43.95698], [12.44684, 43.96597], [12.46205, 43.97463], [12.47853, 43.98052], [12.49406, 43.98492], [12.50678, 43.99113], [12.51463, 43.99122], [12.5154, 43.98508], [12.51064, 43.98165], [12.51109, 43.97201], [12.50622, 43.97131], [12.50875, 43.96198], [12.50655, 43.95796], [12.51427, 43.94897], [12.51553, 43.94096], [12.50496, 43.93017], [12.50269, 43.92363], [12.49724, 43.92248], [12.49247, 43.91774], [12.49429, 43.90973], [12.48771, 43.89706], [12.45648, 43.89369]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "JE", + iso1A3: "JEY", + iso1N3: "832", + wikidata: "Q785", + nameEn: "Bailiwick of Jersey", + country: "GB", + groups: ["830", "Q185086", "154", "150", "UN"], + driveSide: "left", + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["44 01534"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-2.00491, 48.86706], [-1.83944, 49.23037], [-2.09454, 49.46288], [-2.65349, 49.15373], [-2.00491, 48.86706]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "JM", + iso1A3: "JAM", + iso1N3: "388", + wikidata: "Q766", + nameEn: "Jamaica", + aliases: ["JA"], + groups: ["029", "003", "419", "019", "UN"], + driveSide: "left", + callingCodes: ["1 876", "1 658"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-74.09729, 17.36817], [-78.9741, 19.59515], [-78.34606, 16.57862], [-74.09729, 17.36817]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "JO", + iso1A3: "JOR", + iso1N3: "400", + wikidata: "Q810", + nameEn: "Jordan", + groups: ["145", "142", "UN"], + callingCodes: ["962"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[39.04251, 32.30203], [38.98762, 32.47694], [39.08202, 32.50304], [38.79171, 33.37328], [36.83946, 32.31293], [36.40959, 32.37908], [36.23948, 32.50108], [36.20875, 32.49529], [36.20379, 32.52751], [36.08074, 32.51463], [36.02239, 32.65911], [35.96633, 32.66237], [35.93307, 32.71966], [35.88405, 32.71321], [35.75983, 32.74803], [35.68467, 32.70715], [35.66527, 32.681], [35.61669, 32.67999], [35.59813, 32.65159], [35.56614, 32.64393], [35.57485, 32.48669], [35.55494, 32.42687], [35.55807, 32.38674], [35.57111, 32.21877], [35.52012, 32.04076], [35.54375, 31.96587], [35.52758, 31.9131], [35.55941, 31.76535], [35.47672, 31.49578], [35.40316, 31.25535], [35.43658, 31.12444], [35.41371, 30.95565], [35.33984, 30.8802], [35.33456, 30.81224], [35.29311, 30.71365], [35.21379, 30.60401], [35.19595, 30.50297], [35.16218, 30.43535], [35.19183, 30.34636], [35.14108, 30.07374], [35.02147, 29.66343], [34.98207, 29.58147], [34.97718, 29.54294], [34.92298, 29.45305], [34.8812, 29.36878], [36.07081, 29.18469], [36.50005, 29.49696], [36.75083, 29.86903], [37.4971, 29.99949], [37.66395, 30.33245], [37.99354, 30.49998], [36.99791, 31.50081], [38.99233, 31.99721], [39.29903, 32.23259], [39.26157, 32.35555], [39.04251, 32.30203]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "JP", + iso1A3: "JPN", + iso1N3: "392", + wikidata: "Q17", + nameEn: "Japan", + groups: ["030", "142", "UN"], + driveSide: "left", + callingCodes: ["81"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[145.82361, 43.38904], [145.23667, 43.76813], [145.82343, 44.571], [140.9182, 45.92937], [133.61399, 37.41], [129.2669, 34.87122], [122.26612, 25.98197], [123.92912, 17.8782], [155.16731, 23.60141], [145.82361, 43.38904]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "KE", + iso1A3: "KEN", + iso1N3: "404", + wikidata: "Q114", + nameEn: "Kenya", + groups: ["014", "202", "002", "UN"], + driveSide: "left", + callingCodes: ["254"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[35.9419, 4.61933], [35.51424, 4.61643], [35.42366, 4.76969], [35.47843, 4.91872], [35.30992, 4.90402], [35.34151, 5.02364], [34.47601, 4.72162], [33.9873, 4.23316], [34.06046, 4.15235], [34.15429, 3.80464], [34.45815, 3.67385], [34.44922, 3.51627], [34.39112, 3.48802], [34.41794, 3.44342], [34.40006, 3.37949], [34.45815, 3.18319], [34.56242, 3.11478], [34.60114, 2.93034], [34.65774, 2.8753], [34.73967, 2.85447], [34.78137, 2.76223], [34.77244, 2.70272], [34.95267, 2.47209], [34.90947, 2.42447], [34.98692, 1.97348], [34.9899, 1.6668], [34.92734, 1.56109], [34.87819, 1.5596], [34.7918, 1.36752], [34.82606, 1.30944], [34.82606, 1.26626], [34.80223, 1.22754], [34.67562, 1.21265], [34.58029, 1.14712], [34.57427, 1.09868], [34.52369, 1.10692], [34.43349, 0.85254], [34.40041, 0.80266], [34.31516, 0.75693], [34.27345, 0.63182], [34.20196, 0.62289], [34.13493, 0.58118], [34.11408, 0.48884], [34.08727, 0.44713], [34.10067, 0.36372], [33.90936, 0.10581], [33.98449, -0.13079], [33.9264, -0.54188], [33.93107, -0.99298], [34.02286, -1.00779], [34.03084, -1.05101], [34.0824, -1.02264], [37.67199, -3.06222], [37.71745, -3.304], [37.5903, -3.42735], [37.63099, -3.50723], [37.75036, -3.54243], [37.81321, -3.69179], [39.21631, -4.67835], [39.44306, -4.93877], [39.62121, -4.68136], [41.75542, -1.85308], [41.56362, -1.66375], [41.56, -1.59812], [41.00099, -0.83068], [40.98767, 2.82959], [41.31368, 3.14314], [41.89488, 3.97375], [41.1754, 3.94079], [40.77498, 4.27683], [39.86043, 3.86974], [39.76808, 3.67058], [39.58339, 3.47434], [39.55132, 3.39634], [39.51551, 3.40895], [39.49444, 3.45521], [39.19954, 3.47834], [39.07736, 3.5267], [38.91938, 3.51198], [38.52336, 3.62551], [38.45812, 3.60445], [38.14168, 3.62487], [37.07724, 4.33503], [36.84474, 4.44518], [36.03924, 4.44406], [35.95449, 4.53244], [35.9419, 4.61933]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "KG", + iso1A3: "KGZ", + iso1N3: "417", + wikidata: "Q813", + nameEn: "Kyrgyzstan", + groups: ["143", "142", "UN"], + callingCodes: ["996"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[74.88756, 42.98612], [74.75, 42.99029], [74.70331, 43.02519], [74.64615, 43.05881], [74.57491, 43.13702], [74.22489, 43.24657], [73.55634, 43.03071], [73.50992, 42.82356], [73.44393, 42.43098], [71.88792, 42.83578], [71.62405, 42.76613], [71.53272, 42.8014], [71.2724, 42.77853], [71.22785, 42.69248], [71.17807, 42.67381], [71.15232, 42.60486], [70.97717, 42.50147], [70.85973, 42.30188], [70.94483, 42.26238], [71.13263, 42.28356], [71.28719, 42.18033], [70.69777, 41.92554], [70.17682, 41.5455], [70.48909, 41.40335], [70.67586, 41.47953], [70.78572, 41.36419], [70.77885, 41.24813], [70.86263, 41.23833], [70.9615, 41.16393], [71.02193, 41.19494], [71.11806, 41.15359], [71.25813, 41.18796], [71.27187, 41.11015], [71.34877, 41.16807], [71.40198, 41.09436], [71.46148, 41.13958], [71.43814, 41.19644], [71.46688, 41.31883], [71.57227, 41.29175], [71.6787, 41.42111], [71.65914, 41.49599], [71.73054, 41.54713], [71.71132, 41.43012], [71.76625, 41.4466], [71.83914, 41.3546], [71.91457, 41.2982], [71.85964, 41.19081], [72.07249, 41.11739], [72.10745, 41.15483], [72.16433, 41.16483], [72.17594, 41.15522], [72.14864, 41.13363], [72.1792, 41.10621], [72.21061, 41.05607], [72.17594, 41.02377], [72.18339, 40.99571], [72.324, 41.03381], [72.34026, 41.04539], [72.34757, 41.06104], [72.36138, 41.04384], [72.38511, 41.02785], [72.45206, 41.03018], [72.48742, 40.97136], [72.55109, 40.96046], [72.59136, 40.86947], [72.68157, 40.84942], [72.84291, 40.85512], [72.94454, 40.8094], [73.01869, 40.84681], [73.13267, 40.83512], [73.13412, 40.79122], [73.0612, 40.76678], [72.99133, 40.76457], [72.93296, 40.73089], [72.8722, 40.71111], [72.85372, 40.7116], [72.84754, 40.67229], [72.80137, 40.67856], [72.74866, 40.60873], [72.74894, 40.59592], [72.75982, 40.57273], [72.74862, 40.57131], [72.74768, 40.58051], [72.73995, 40.58409], [72.69579, 40.59778], [72.66713, 40.59076], [72.66713, 40.5219], [72.47795, 40.5532], [72.40517, 40.61917], [72.34406, 40.60144], [72.41714, 40.55736], [72.38384, 40.51535], [72.41513, 40.50856], [72.44191, 40.48222], [72.40346, 40.4007], [72.24368, 40.46091], [72.18648, 40.49893], [71.96401, 40.31907], [72.05464, 40.27586], [71.85002, 40.25647], [71.82646, 40.21872], [71.73054, 40.14818], [71.71719, 40.17886], [71.69621, 40.18492], [71.70569, 40.20391], [71.68386, 40.26984], [71.61931, 40.26775], [71.61725, 40.20615], [71.51549, 40.22986], [71.51215, 40.26943], [71.4246, 40.28619], [71.36663, 40.31593], [71.13042, 40.34106], [71.05901, 40.28765], [70.95789, 40.28761], [70.9818, 40.22392], [70.80495, 40.16813], [70.7928, 40.12797], [70.65827, 40.0981], [70.65946, 39.9878], [70.58912, 39.95211], [70.55033, 39.96619], [70.47557, 39.93216], [70.57384, 39.99394], [70.58297, 40.00891], [70.01283, 40.23288], [69.67001, 40.10639], [69.64704, 40.12165], [69.57615, 40.10524], [69.55555, 40.12296], [69.53794, 40.11833], [69.53855, 40.0887], [69.5057, 40.03277], [69.53615, 39.93991], [69.43557, 39.92877], [69.43134, 39.98431], [69.35649, 40.01994], [69.26938, 39.8127], [69.3594, 39.52516], [69.68677, 39.59281], [69.87491, 39.53882], [70.11111, 39.58223], [70.2869, 39.53141], [70.44757, 39.60128], [70.64087, 39.58792], [70.7854, 39.38933], [71.06418, 39.41586], [71.08752, 39.50704], [71.49814, 39.61397], [71.55856, 39.57588], [71.5517, 39.45722], [71.62688, 39.44056], [71.76816, 39.45456], [71.80164, 39.40631], [71.7522, 39.32031], [71.79202, 39.27355], [71.90601, 39.27674], [72.04059, 39.36704], [72.09689, 39.26823], [72.17242, 39.2661], [72.23834, 39.17248], [72.33173, 39.33093], [72.62027, 39.39696], [72.85934, 39.35116], [73.18454, 39.35536], [73.31912, 39.38615], [73.45096, 39.46677], [73.59831, 39.46425], [73.87018, 39.47879], [73.94683, 39.60733], [73.92354, 39.69565], [73.9051, 39.75073], [73.83006, 39.76136], [73.97049, 40.04378], [74.25533, 40.13191], [74.35063, 40.09742], [74.69875, 40.34668], [74.85996, 40.32857], [74.78168, 40.44886], [74.82013, 40.52197], [75.08243, 40.43945], [75.22834, 40.45382], [75.5854, 40.66874], [75.69663, 40.28642], [75.91361, 40.2948], [75.96168, 40.38064], [76.33659, 40.3482], [76.5261, 40.46114], [76.75681, 40.95354], [76.99302, 41.0696], [77.28004, 41.0033], [77.3693, 41.0375], [77.52723, 41.00227], [77.76206, 41.01574], [77.81287, 41.14307], [78.12873, 41.23091], [78.15757, 41.38565], [78.3732, 41.39603], [79.92977, 42.04113], [80.17842, 42.03211], [80.17807, 42.21166], [79.97364, 42.42816], [79.52921, 42.44778], [79.19763, 42.804], [78.91502, 42.76839], [78.48469, 42.89649], [75.82823, 42.94848], [75.72174, 42.79672], [75.29966, 42.86183], [75.22619, 42.85528], [74.88756, 42.98612]], [[70.74189, 39.86319], [70.63105, 39.77923], [70.59667, 39.83542], [70.54998, 39.85137], [70.52631, 39.86989], [70.53651, 39.89155], [70.74189, 39.86319]], [[71.86463, 39.98598], [71.84316, 39.95582], [71.7504, 39.93701], [71.71511, 39.96348], [71.78838, 40.01404], [71.86463, 39.98598]], [[71.21139, 40.03369], [71.1427, 39.95026], [71.23067, 39.93581], [71.16101, 39.88423], [71.10531, 39.91354], [71.04979, 39.89808], [71.10501, 39.95568], [71.09063, 39.99], [71.11668, 39.99291], [71.11037, 40.01984], [71.01035, 40.05481], [71.00236, 40.18154], [71.06305, 40.1771], [71.12218, 40.03052], [71.21139, 40.03369]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "KH", + iso1A3: "KHM", + iso1N3: "116", + wikidata: "Q424", + nameEn: "Cambodia", + groups: ["035", "142", "UN"], + callingCodes: ["855"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[105.87328, 11.55953], [105.81645, 11.56876], [105.80867, 11.60536], [105.8507, 11.66635], [105.88962, 11.67854], [105.95188, 11.63738], [106.00792, 11.7197], [106.02038, 11.77457], [106.06708, 11.77761], [106.13158, 11.73283], [106.18539, 11.75171], [106.26478, 11.72122], [106.30525, 11.67549], [106.37219, 11.69836], [106.44691, 11.66787], [106.45158, 11.68616], [106.41577, 11.76999], [106.44535, 11.8279], [106.44068, 11.86294], [106.4687, 11.86751], [106.4111, 11.97413], [106.70687, 11.96956], [106.79405, 12.0807], [106.92325, 12.06548], [106.99953, 12.08983], [107.15831, 12.27547], [107.34511, 12.33327], [107.42917, 12.24657], [107.4463, 12.29373], [107.55059, 12.36824], [107.5755, 12.52177], [107.55993, 12.7982], [107.49611, 12.88926], [107.49144, 13.01215], [107.62843, 13.3668], [107.61909, 13.52577], [107.53503, 13.73908], [107.45252, 13.78897], [107.46498, 13.91593], [107.44318, 13.99751], [107.38247, 13.99147], [107.35757, 14.02319], [107.37158, 14.07906], [107.33577, 14.11832], [107.40427, 14.24509], [107.39493, 14.32655], [107.44941, 14.41552], [107.48521, 14.40346], [107.52569, 14.54665], [107.52102, 14.59034], [107.55371, 14.628], [107.54361, 14.69092], [107.47238, 14.61523], [107.44435, 14.52785], [107.37897, 14.54443], [107.3276, 14.58812], [107.29803, 14.58963], [107.26534, 14.54292], [107.256, 14.48716], [107.21241, 14.48716], [107.17038, 14.41782], [107.09722, 14.3937], [107.03962, 14.45099], [107.04585, 14.41782], [106.98825, 14.36806], [106.9649, 14.3198], [106.90574, 14.33639], [106.8497, 14.29416], [106.80767, 14.31226], [106.73762, 14.42687], [106.63333, 14.44194], [106.59908, 14.50977], [106.57106, 14.50525], [106.54148, 14.59565], [106.50723, 14.58963], [106.45898, 14.55045], [106.47766, 14.50977], [106.43874, 14.52032], [106.40916, 14.45249], [106.32355, 14.44043], [106.25194, 14.48415], [106.21302, 14.36203], [106.00131, 14.36957], [105.99509, 14.32734], [106.02311, 14.30623], [106.04801, 14.20363], [106.10872, 14.18401], [106.11962, 14.11307], [106.18656, 14.06324], [106.16632, 14.01794], [106.10094, 13.98471], [106.10405, 13.9137], [105.90791, 13.92881], [105.78182, 14.02247], [105.78338, 14.08438], [105.5561, 14.15684], [105.44869, 14.10703], [105.36775, 14.09948], [105.2759, 14.17496], [105.20894, 14.34967], [105.17748, 14.34432], [105.14012, 14.23873], [105.08408, 14.20402], [105.02804, 14.23722], [104.97667, 14.38806], [104.69335, 14.42726], [104.55014, 14.36091], [104.27616, 14.39861], [103.93836, 14.3398], [103.70175, 14.38052], [103.71109, 14.4348], [103.53518, 14.42575], [103.39353, 14.35639], [103.16469, 14.33075], [102.93275, 14.19044], [102.91251, 14.01531], [102.77864, 13.93374], [102.72727, 13.77806], [102.56848, 13.69366], [102.5481, 13.6589], [102.58635, 13.6286], [102.62483, 13.60883], [102.57573, 13.60461], [102.5358, 13.56933], [102.44601, 13.5637], [102.36859, 13.57488], [102.33828, 13.55613], [102.361, 13.50551], [102.35563, 13.47307], [102.35692, 13.38274], [102.34611, 13.35618], [102.36001, 13.31142], [102.36146, 13.26006], [102.43422, 13.09061], [102.46011, 13.08057], [102.52275, 12.99813], [102.48694, 12.97537], [102.49335, 12.92711], [102.53053, 12.77506], [102.4994, 12.71736], [102.51963, 12.66117], [102.57567, 12.65358], [102.7796, 12.43781], [102.78116, 12.40284], [102.73134, 12.37091], [102.70176, 12.1686], [102.77026, 12.06815], [102.78427, 11.98746], [102.83957, 11.8519], [102.90973, 11.75613], [102.91449, 11.65512], [102.52395, 11.25257], [102.47649, 9.66162], [103.99198, 10.48391], [104.43778, 10.42386], [104.47963, 10.43046], [104.49869, 10.4057], [104.59018, 10.53073], [104.87933, 10.52833], [104.95094, 10.64003], [105.09571, 10.72722], [105.02722, 10.89236], [105.08326, 10.95656], [105.11449, 10.96332], [105.34011, 10.86179], [105.42884, 10.96878], [105.50045, 10.94586], [105.77751, 11.03671], [105.86376, 10.89839], [105.84603, 10.85873], [105.93403, 10.83853], [105.94535, 10.9168], [106.06708, 10.8098], [106.18539, 10.79451], [106.14301, 10.98176], [106.20095, 10.97795], [106.1757, 11.07301], [106.1527, 11.10476], [106.10444, 11.07879], [105.86782, 11.28343], [105.88962, 11.43605], [105.87328, 11.55953]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "KI", + iso1A3: "KIR", + iso1N3: "296", + wikidata: "Q710", + nameEn: "Kiribati", + groups: ["057", "009", "UN"], + driveSide: "left", + callingCodes: ["686"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[169, 3.9], [169, -3.5], [178, -3.5], [178, 3.9], [169, 3.9]]], [[[-161.06795, 5.2462], [-158.12991, -1.86122], [-175.33482, -1.40631], [-175.31804, -7.54825], [-156.50903, -7.4975], [-156.48634, -15.52824], [-135.59706, -4.70473], [-161.06795, 5.2462]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "KM", + iso1A3: "COM", + iso1N3: "174", + wikidata: "Q970", + nameEn: "Comoros", + groups: ["014", "202", "002", "UN"], + callingCodes: ["269"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[42.63904, -10.02522], [43.28731, -13.97126], [45.4971, -11.75965], [42.63904, -10.02522]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "KN", + iso1A3: "KNA", + iso1N3: "659", + wikidata: "Q763", + nameEn: "St. Kitts and Nevis", + groups: ["029", "003", "419", "019", "UN"], + driveSide: "left", + roadSpeedUnit: "mph", + callingCodes: ["1 869"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-62.29333, 17.43155], [-62.76692, 17.64353], [-63.09677, 17.21372], [-62.63813, 16.65446], [-62.29333, 17.43155]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "KP", + iso1A3: "PRK", + iso1N3: "408", + wikidata: "Q423", + nameEn: "North Korea", + groups: ["030", "142", "UN"], + callingCodes: ["850"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[130.26095, 42.9027], [130.09764, 42.91425], [130.12957, 42.98361], [129.96409, 42.97306], [129.95082, 43.01051], [129.8865, 43.00395], [129.85261, 42.96494], [129.83277, 42.86746], [129.80719, 42.79218], [129.7835, 42.76521], [129.77183, 42.69435], [129.75294, 42.59409], [129.72541, 42.43739], [129.60482, 42.44461], [129.54701, 42.37254], [129.42882, 42.44702], [129.28541, 42.41574], [129.22423, 42.3553], [129.22285, 42.26491], [129.15178, 42.17224], [128.96068, 42.06657], [128.94007, 42.03537], [128.04487, 42.01769], [128.15119, 41.74568], [128.30716, 41.60322], [128.20061, 41.40895], [128.18546, 41.41279], [128.12967, 41.37931], [128.03311, 41.39232], [128.02633, 41.42103], [127.92943, 41.44291], [127.29712, 41.49473], [127.17841, 41.59714], [126.90729, 41.79955], [126.60631, 41.65565], [126.53189, 41.35206], [126.242, 41.15454], [126.00335, 40.92835], [125.76869, 40.87908], [125.71172, 40.85223], [124.86913, 40.45387], [124.40719, 40.13655], [124.38556, 40.11047], [124.3322, 40.05573], [124.37089, 40.03004], [124.35029, 39.95639], [124.23201, 39.9248], [124.17532, 39.8232], [123.90497, 38.79949], [123.85601, 37.49093], [124.67666, 38.05679], [124.84224, 37.977], [124.87921, 37.80827], [125.06408, 37.66334], [125.37112, 37.62643], [125.81159, 37.72949], [126.13074, 37.70512], [126.18776, 37.74728], [126.19097, 37.81462], [126.24402, 37.83113], [126.43239, 37.84095], [126.46818, 37.80873], [126.56709, 37.76857], [126.59918, 37.76364], [126.66067, 37.7897], [126.68793, 37.83728], [126.68793, 37.9175], [126.67023, 37.95852], [126.84961, 38.0344], [126.88106, 38.10246], [126.95887, 38.1347], [126.95338, 38.17735], [127.04479, 38.25518], [127.15749, 38.30722], [127.38727, 38.33227], [127.49672, 38.30647], [127.55013, 38.32257], [128.02917, 38.31861], [128.27652, 38.41657], [128.31105, 38.58462], [128.37487, 38.62345], [128.65655, 38.61914], [131.95041, 41.5445], [130.65022, 42.32281], [130.66367, 42.38024], [130.64181, 42.41422], [130.60805, 42.4317], [130.56835, 42.43281], [130.55143, 42.52158], [130.50123, 42.61636], [130.44361, 42.54849], [130.41826, 42.6011], [130.2385, 42.71127], [130.23068, 42.80125], [130.26095, 42.9027]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "KR", + iso1A3: "KOR", + iso1N3: "410", + wikidata: "Q884", + nameEn: "South Korea", + groups: ["030", "142", "UN"], + callingCodes: ["82"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[133.11729, 37.53115], [128.65655, 38.61914], [128.37487, 38.62345], [128.31105, 38.58462], [128.27652, 38.41657], [128.02917, 38.31861], [127.55013, 38.32257], [127.49672, 38.30647], [127.38727, 38.33227], [127.15749, 38.30722], [127.04479, 38.25518], [126.95338, 38.17735], [126.95887, 38.1347], [126.88106, 38.10246], [126.84961, 38.0344], [126.67023, 37.95852], [126.68793, 37.9175], [126.68793, 37.83728], [126.66067, 37.7897], [126.59918, 37.76364], [126.56709, 37.76857], [126.46818, 37.80873], [126.43239, 37.84095], [126.24402, 37.83113], [126.19097, 37.81462], [126.18776, 37.74728], [126.13074, 37.70512], [125.81159, 37.72949], [125.37112, 37.62643], [125.06408, 37.66334], [124.87921, 37.80827], [124.84224, 37.977], [124.67666, 38.05679], [123.85601, 37.49093], [122.80525, 33.30571], [125.99728, 32.63328], [129.2669, 34.87122], [133.11729, 37.53115]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "KW", + iso1A3: "KWT", + iso1N3: "414", + wikidata: "Q817", + nameEn: "Kuwait", + groups: ["145", "142", "UN"], + callingCodes: ["965"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[49.00421, 28.81495], [48.59531, 29.66815], [48.40479, 29.85763], [48.17332, 30.02448], [48.06782, 30.02906], [48.01114, 29.98906], [47.7095, 30.10453], [47.37192, 30.10421], [47.15166, 30.01044], [46.89695, 29.50584], [46.5527, 29.10283], [47.46202, 29.0014], [47.58376, 28.83382], [47.59863, 28.66798], [47.70561, 28.5221], [48.42991, 28.53628], [49.00421, 28.81495]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "KY", + iso1A3: "CYM", + iso1N3: "136", + wikidata: "Q5785", + nameEn: "Cayman Islands", + country: "GB", + groups: ["BOTS", "029", "003", "419", "019", "UN"], + driveSide: "left", + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["1 345"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-82.11509, 19.60401], [-80.36068, 18.11751], [-79.32727, 20.06742], [-82.11509, 19.60401]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "KZ", + iso1A3: "KAZ", + iso1N3: "398", + wikidata: "Q232", + nameEn: "Kazakhstan", + groups: ["143", "142", "UN"], + callingCodes: ["7"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[68.90865, 55.38148], [68.19206, 55.18823], [68.26661, 55.09226], [68.21308, 54.98645], [65.20174, 54.55216], [65.24663, 54.35721], [65.11033, 54.33028], [64.97216, 54.4212], [63.97686, 54.29763], [64.02715, 54.22679], [63.91224, 54.20013], [63.80604, 54.27079], [62.58651, 54.05871], [62.56876, 53.94047], [62.45931, 53.90737], [62.38535, 54.03961], [62.00966, 54.04134], [62.03913, 53.94768], [61.65318, 54.02445], [61.56941, 53.95703], [61.47603, 54.08048], [61.3706, 54.08464], [61.26863, 53.92797], [60.99796, 53.93699], [61.14283, 53.90063], [61.22574, 53.80268], [60.90626, 53.62937], [61.55706, 53.57144], [61.57185, 53.50112], [61.37957, 53.45887], [61.29082, 53.50992], [61.14291, 53.41481], [61.19024, 53.30536], [62.14574, 53.09626], [62.12799, 52.99133], [62.0422, 52.96105], [61.23462, 53.03227], [61.05842, 52.92217], [60.71989, 52.75923], [60.71693, 52.66245], [60.84118, 52.63912], [60.84709, 52.52228], [60.98021, 52.50068], [61.05417, 52.35096], [60.78201, 52.22067], [60.72581, 52.15538], [60.48915, 52.15175], [60.19925, 51.99173], [59.99809, 51.98263], [60.09867, 51.87135], [60.50986, 51.7964], [60.36787, 51.66815], [60.5424, 51.61675], [60.92401, 51.61124], [60.95655, 51.48615], [61.50677, 51.40687], [61.55114, 51.32746], [61.6813, 51.25716], [61.56889, 51.23679], [61.4431, 50.80679], [60.81833, 50.6629], [60.31914, 50.67705], [60.17262, 50.83312], [60.01288, 50.8163], [59.81172, 50.54451], [59.51886, 50.49937], [59.48928, 50.64216], [58.87974, 50.70852], [58.3208, 51.15151], [57.75578, 51.13852], [57.74986, 50.93017], [57.44221, 50.88354], [57.17302, 51.11253], [56.17906, 50.93204], [56.11398, 50.7471], [55.67774, 50.54508], [54.72067, 51.03261], [54.56685, 51.01958], [54.71476, 50.61214], [54.55797, 50.52006], [54.41894, 50.61214], [54.46331, 50.85554], [54.12248, 51.11542], [53.69299, 51.23466], [53.46165, 51.49445], [52.54329, 51.48444], [52.36119, 51.74161], [51.8246, 51.67916], [51.77431, 51.49536], [51.301, 51.48799], [51.26254, 51.68466], [50.59695, 51.61859], [50.26859, 51.28677], [49.97277, 51.2405], [49.76866, 51.11067], [49.39001, 51.09396], [49.41959, 50.85927], [49.12673, 50.78639], [48.86936, 50.61589], [48.57946, 50.63278], [48.90782, 50.02281], [48.68352, 49.89546], [48.42564, 49.82283], [48.24519, 49.86099], [48.10044, 50.09242], [47.58551, 50.47867], [47.30448, 50.30894], [47.34589, 50.09308], [47.18319, 49.93721], [46.9078, 49.86707], [46.78398, 49.34026], [47.04658, 49.19834], [47.00857, 49.04921], [46.78392, 48.95352], [46.49011, 48.43019], [47.11516, 48.27188], [47.12107, 47.83687], [47.38731, 47.68176], [47.41689, 47.83687], [47.64973, 47.76559], [48.15348, 47.74545], [48.45173, 47.40818], [48.52326, 47.4102], [49.01136, 46.72716], [48.51142, 46.69268], [48.54988, 46.56267], [49.16518, 46.38542], [49.32259, 46.26944], [49.88945, 46.04554], [49.2134, 44.84989], [52.26048, 41.69249], [52.47884, 41.78034], [52.97575, 42.1308], [54.20635, 42.38477], [54.95182, 41.92424], [55.45471, 41.25609], [56.00314, 41.32584], [55.97584, 44.99322], [55.97584, 44.99328], [55.97584, 44.99338], [55.97584, 44.99343], [55.97584, 44.99348], [55.97584, 44.99353], [55.97584, 44.99359], [55.97584, 44.99369], [55.97584, 44.99374], [55.97584, 44.99384], [55.97584, 44.9939], [55.97584, 44.994], [55.97584, 44.99405], [55.97584, 44.99415], [55.97584, 44.99421], [55.97584, 44.99426], [55.97584, 44.99431], [55.97584, 44.99436], [55.97584, 44.99441], [55.97594, 44.99446], [55.97605, 44.99452], [55.97605, 44.99457], [55.97605, 44.99462], [55.97605, 44.99467], [55.97605, 44.99477], [55.97615, 44.99477], [55.97615, 44.99483], [55.97615, 44.99493], [55.97615, 44.99498], [55.97615, 44.99503], [55.97615, 44.99508], [55.97625, 44.99514], [55.97636, 44.99519], [55.97636, 44.99524], [55.97646, 44.99529], [55.97646, 44.99534], [55.97656, 44.99539], [55.97667, 44.99545], [55.97677, 44.9955], [55.97677, 44.99555], [55.97677, 44.9956], [55.97687, 44.9956], [55.97698, 44.99565], [55.97698, 44.9957], [55.97708, 44.99576], [55.97718, 44.99581], [55.97729, 44.99586], [55.97739, 44.99586], [55.97739, 44.99591], [55.97749, 44.99591], [55.9776, 44.99591], [55.9777, 44.99596], [55.9777, 44.99601], [55.9778, 44.99607], [55.97791, 44.99607], [55.97801, 44.99607], [55.97801, 44.99612], [55.97811, 44.99617], [55.97822, 44.99617], [55.97832, 44.99622], [55.97842, 44.99622], [58.59711, 45.58671], [61.01475, 44.41383], [62.01711, 43.51008], [63.34656, 43.64003], [64.53885, 43.56941], [64.96464, 43.74748], [65.18666, 43.48835], [65.53277, 43.31856], [65.85194, 42.85481], [66.09482, 42.93426], [66.00546, 41.94455], [66.53302, 41.87388], [66.69129, 41.1311], [67.9644, 41.14611], [67.98511, 41.02794], [68.08273, 41.08148], [68.1271, 41.0324], [67.96736, 40.83798], [68.49983, 40.56437], [68.63, 40.59358], [68.58444, 40.91447], [68.49983, 40.99669], [68.62221, 41.03019], [68.65662, 40.93861], [68.73945, 40.96989], [68.7217, 41.05025], [69.01308, 41.22804], [69.05006, 41.36183], [69.15137, 41.43078], [69.17701, 41.43769], [69.18528, 41.45175], [69.20439, 41.45391], [69.22671, 41.46298], [69.23332, 41.45847], [69.25059, 41.46693], [69.29778, 41.43673], [69.35554, 41.47211], [69.37468, 41.46555], [69.45081, 41.46246], [69.39485, 41.51518], [69.45751, 41.56863], [69.49545, 41.545], [70.94483, 42.26238], [70.85973, 42.30188], [70.97717, 42.50147], [71.15232, 42.60486], [71.17807, 42.67381], [71.22785, 42.69248], [71.2724, 42.77853], [71.53272, 42.8014], [71.62405, 42.76613], [71.88792, 42.83578], [73.44393, 42.43098], [73.50992, 42.82356], [73.55634, 43.03071], [74.22489, 43.24657], [74.57491, 43.13702], [74.64615, 43.05881], [74.70331, 43.02519], [74.75, 42.99029], [74.88756, 42.98612], [75.22619, 42.85528], [75.29966, 42.86183], [75.72174, 42.79672], [75.82823, 42.94848], [78.48469, 42.89649], [78.91502, 42.76839], [79.19763, 42.804], [79.52921, 42.44778], [79.97364, 42.42816], [80.17807, 42.21166], [80.26841, 42.23797], [80.16892, 42.61137], [80.26886, 42.8366], [80.38169, 42.83142], [80.58999, 42.9011], [80.3735, 43.01557], [80.62913, 43.141], [80.78817, 43.14235], [80.77771, 43.30065], [80.69718, 43.32589], [80.75156, 43.44948], [80.40031, 44.10986], [80.40229, 44.23319], [80.38384, 44.63073], [79.8987, 44.89957], [80.11169, 45.03352], [81.73278, 45.3504], [82.51374, 45.1755], [82.58474, 45.40027], [82.21792, 45.56619], [83.04622, 47.19053], [83.92184, 46.98912], [84.73077, 47.01394], [84.93995, 46.87399], [85.22443, 47.04816], [85.54294, 47.06171], [85.69696, 47.2898], [85.61067, 47.49753], [85.5169, 48.05493], [85.73581, 48.3939], [86.38069, 48.46064], [86.75343, 48.70331], [86.73568, 48.99918], [86.87238, 49.12432], [87.28386, 49.11626], [87.31465, 49.23603], [87.03071, 49.25142], [86.82606, 49.51796], [86.61307, 49.60239], [86.79056, 49.74787], [86.63674, 49.80136], [86.18709, 49.50259], [85.24047, 49.60239], [84.99198, 50.06793], [84.29385, 50.27257], [83.8442, 50.87375], [83.14607, 51.00796], [82.55443, 50.75412], [81.94999, 50.79307], [81.46581, 50.77658], [81.41248, 50.97524], [81.06091, 50.94833], [81.16999, 51.15662], [80.80318, 51.28262], [80.44819, 51.20855], [80.4127, 50.95581], [80.08138, 50.77658], [79.11255, 52.01171], [77.90383, 53.29807], [76.54243, 53.99329], [76.44076, 54.16017], [76.82266, 54.1798], [76.91052, 54.4677], [75.3668, 54.07439], [75.43398, 53.98652], [75.07405, 53.80831], [73.39218, 53.44623], [73.25412, 53.61532], [73.68921, 53.86522], [73.74778, 54.07194], [73.37963, 53.96132], [72.71026, 54.1161], [72.43415, 53.92685], [72.17477, 54.36303], [71.96141, 54.17736], [71.10379, 54.13326], [71.08706, 54.33376], [71.24185, 54.64965], [71.08288, 54.71253], [70.96009, 55.10558], [70.76493, 55.3027], [70.19179, 55.1476], [69.74917, 55.35545], [69.34224, 55.36344], [68.90865, 55.38148]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "LA", + iso1A3: "LAO", + iso1N3: "418", + wikidata: "Q819", + nameEn: "Laos", + groups: ["035", "142", "UN"], + callingCodes: ["856"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[102.1245, 22.43372], [102.03633, 22.46164], [101.98487, 22.42766], [101.91344, 22.44417], [101.90714, 22.38688], [101.86828, 22.38397], [101.7685, 22.50337], [101.68973, 22.46843], [101.61306, 22.27515], [101.56789, 22.28876], [101.53638, 22.24794], [101.60675, 22.13513], [101.57525, 22.13026], [101.62566, 21.96574], [101.7791, 21.83019], [101.74555, 21.72852], [101.83257, 21.61562], [101.80001, 21.57461], [101.7475, 21.5873], [101.7727, 21.51794], [101.74224, 21.48276], [101.74014, 21.30967], [101.84412, 21.25291], [101.83887, 21.20983], [101.76745, 21.21571], [101.79266, 21.19025], [101.7622, 21.14813], [101.70548, 21.14911], [101.66977, 21.20004], [101.60886, 21.17947], [101.59491, 21.18621], [101.6068, 21.23329], [101.54563, 21.25668], [101.29326, 21.17254], [101.2229, 21.23271], [101.26912, 21.36482], [101.19349, 21.41959], [101.2124, 21.56422], [101.15156, 21.56129], [101.16198, 21.52808], [101.00234, 21.39612], [100.80173, 21.2934], [100.72716, 21.31786], [100.63578, 21.05639], [100.55281, 21.02796], [100.50974, 20.88574], [100.64628, 20.88279], [100.60112, 20.8347], [100.51079, 20.82194], [100.36375, 20.82783], [100.1957, 20.68247], [100.08404, 20.36626], [100.09999, 20.31614], [100.09337, 20.26293], [100.11785, 20.24787], [100.1712, 20.24324], [100.16668, 20.2986], [100.22076, 20.31598], [100.25769, 20.3992], [100.33383, 20.4028], [100.37439, 20.35156], [100.41473, 20.25625], [100.44992, 20.23644], [100.4537, 20.19971], [100.47567, 20.19133], [100.51052, 20.14928], [100.55218, 20.17741], [100.58808, 20.15791], [100.5094, 19.87904], [100.398, 19.75047], [100.49604, 19.53504], [100.58219, 19.49164], [100.64606, 19.55884], [100.77231, 19.48324], [100.90302, 19.61901], [101.08928, 19.59748], [101.26545, 19.59242], [101.26991, 19.48324], [101.21347, 19.46223], [101.20604, 19.35296], [101.24911, 19.33334], [101.261, 19.12717], [101.35606, 19.04716], [101.25803, 18.89545], [101.22832, 18.73377], [101.27585, 18.68875], [101.06047, 18.43247], [101.18227, 18.34367], [101.15108, 18.25624], [101.19118, 18.2125], [101.1793, 18.0544], [101.02185, 17.87637], [100.96541, 17.57926], [101.15108, 17.47586], [101.44667, 17.7392], [101.72294, 17.92867], [101.78087, 18.07559], [101.88485, 18.02474], [102.11359, 18.21532], [102.45523, 17.97106], [102.59234, 17.96127], [102.60971, 17.95411], [102.61432, 17.92273], [102.5896, 17.84889], [102.59485, 17.83537], [102.68194, 17.80151], [102.69946, 17.81686], [102.67543, 17.84529], [102.68538, 17.86653], [102.75954, 17.89561], [102.79044, 17.93612], [102.81988, 17.94233], [102.86323, 17.97531], [102.95812, 18.0054], [102.9912, 17.9949], [103.01998, 17.97095], [103.0566, 18.00144], [103.07823, 18.03833], [103.07343, 18.12351], [103.1493, 18.17799], [103.14994, 18.23172], [103.17093, 18.2618], [103.29757, 18.30475], [103.23818, 18.34875], [103.24779, 18.37807], [103.30977, 18.4341], [103.41044, 18.4486], [103.47773, 18.42841], [103.60957, 18.40528], [103.699, 18.34125], [103.82449, 18.33979], [103.85642, 18.28666], [103.93916, 18.33914], [103.97725, 18.33631], [104.06533, 18.21656], [104.10927, 18.10826], [104.21776, 17.99335], [104.2757, 17.86139], [104.35432, 17.82871], [104.45404, 17.66788], [104.69867, 17.53038], [104.80061, 17.39367], [104.80716, 17.19025], [104.73712, 17.01404], [104.7373, 16.91125], [104.76442, 16.84752], [104.7397, 16.81005], [104.76099, 16.69302], [104.73349, 16.565], [104.88057, 16.37311], [105.00262, 16.25627], [105.06204, 16.09792], [105.42001, 16.00657], [105.38508, 15.987], [105.34115, 15.92737], [105.37959, 15.84074], [105.42285, 15.76971], [105.46573, 15.74742], [105.61756, 15.68792], [105.60446, 15.53301], [105.58191, 15.41031], [105.47635, 15.3796], [105.4692, 15.33709], [105.50662, 15.32054], [105.58043, 15.32724], [105.46661, 15.13132], [105.61162, 15.00037], [105.5121, 14.80802], [105.53864, 14.55731], [105.43783, 14.43865], [105.20894, 14.34967], [105.2759, 14.17496], [105.36775, 14.09948], [105.44869, 14.10703], [105.5561, 14.15684], [105.78338, 14.08438], [105.78182, 14.02247], [105.90791, 13.92881], [106.10405, 13.9137], [106.10094, 13.98471], [106.16632, 14.01794], [106.18656, 14.06324], [106.11962, 14.11307], [106.10872, 14.18401], [106.04801, 14.20363], [106.02311, 14.30623], [105.99509, 14.32734], [106.00131, 14.36957], [106.21302, 14.36203], [106.25194, 14.48415], [106.32355, 14.44043], [106.40916, 14.45249], [106.43874, 14.52032], [106.47766, 14.50977], [106.45898, 14.55045], [106.50723, 14.58963], [106.54148, 14.59565], [106.57106, 14.50525], [106.59908, 14.50977], [106.63333, 14.44194], [106.73762, 14.42687], [106.80767, 14.31226], [106.8497, 14.29416], [106.90574, 14.33639], [106.9649, 14.3198], [106.98825, 14.36806], [107.04585, 14.41782], [107.03962, 14.45099], [107.09722, 14.3937], [107.17038, 14.41782], [107.21241, 14.48716], [107.256, 14.48716], [107.26534, 14.54292], [107.29803, 14.58963], [107.3276, 14.58812], [107.37897, 14.54443], [107.44435, 14.52785], [107.47238, 14.61523], [107.54361, 14.69092], [107.51579, 14.79282], [107.59285, 14.87795], [107.48277, 14.93751], [107.46516, 15.00982], [107.61486, 15.0566], [107.61926, 15.13949], [107.58844, 15.20111], [107.62587, 15.2266], [107.60605, 15.37524], [107.62367, 15.42193], [107.53341, 15.40496], [107.50699, 15.48771], [107.3815, 15.49832], [107.34408, 15.62345], [107.27583, 15.62769], [107.27143, 15.71459], [107.21859, 15.74638], [107.21419, 15.83747], [107.34188, 15.89464], [107.39471, 15.88829], [107.46296, 16.01106], [107.44975, 16.08511], [107.33968, 16.05549], [107.25822, 16.13587], [107.14595, 16.17816], [107.15035, 16.26271], [107.09091, 16.3092], [107.02597, 16.31132], [106.97385, 16.30204], [106.96638, 16.34938], [106.88067, 16.43594], [106.88727, 16.52671], [106.84104, 16.55415], [106.74418, 16.41904], [106.65832, 16.47816], [106.66052, 16.56892], [106.61477, 16.60713], [106.58267, 16.6012], [106.59013, 16.62259], [106.55485, 16.68704], [106.55265, 16.86831], [106.52183, 16.87884], [106.51963, 16.92097], [106.54824, 16.92729], [106.55045, 17.0031], [106.50862, 16.9673], [106.43597, 17.01362], [106.31929, 17.20509], [106.29287, 17.3018], [106.24444, 17.24714], [106.18991, 17.28227], [106.09019, 17.36399], [105.85744, 17.63221], [105.76612, 17.67147], [105.60381, 17.89356], [105.64784, 17.96687], [105.46292, 18.22008], [105.38366, 18.15315], [105.15942, 18.38691], [105.10408, 18.43533], [105.1327, 18.58355], [105.19654, 18.64196], [105.12829, 18.70453], [104.64617, 18.85668], [104.5361, 18.97747], [103.87125, 19.31854], [104.06058, 19.43484], [104.10832, 19.51575], [104.05617, 19.61743], [104.06498, 19.66926], [104.23229, 19.70242], [104.41281, 19.70035], [104.53169, 19.61743], [104.64837, 19.62365], [104.68359, 19.72729], [104.8355, 19.80395], [104.8465, 19.91783], [104.9874, 20.09573], [104.91695, 20.15567], [104.86852, 20.14121], [104.61315, 20.24452], [104.62195, 20.36633], [104.72102, 20.40554], [104.66158, 20.47774], [104.47886, 20.37459], [104.40621, 20.3849], [104.38199, 20.47155], [104.63957, 20.6653], [104.27412, 20.91433], [104.11121, 20.96779], [103.98024, 20.91531], [103.82282, 20.8732], [103.73478, 20.6669], [103.68633, 20.66324], [103.45737, 20.82382], [103.38032, 20.79501], [103.21497, 20.89832], [103.12055, 20.89994], [103.03469, 21.05821], [102.97745, 21.05821], [102.89825, 21.24707], [102.80794, 21.25736], [102.88939, 21.3107], [102.94223, 21.46034], [102.86297, 21.4255], [102.98846, 21.58936], [102.97965, 21.74076], [102.86077, 21.71213], [102.85637, 21.84501], [102.81894, 21.83888], [102.82115, 21.73667], [102.74189, 21.66713], [102.67145, 21.65894], [102.62301, 21.91447], [102.49092, 21.99002], [102.51734, 22.02676], [102.18712, 22.30403], [102.14099, 22.40092], [102.1245, 22.43372]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "LB", + iso1A3: "LBN", + iso1N3: "422", + wikidata: "Q822", + nameEn: "Lebanon", + aliases: ["RL"], + groups: ["145", "142", "UN"], + callingCodes: ["961"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[35.94816, 33.47886], [35.94465, 33.52774], [36.05723, 33.57904], [35.9341, 33.6596], [36.06778, 33.82927], [36.14517, 33.85118], [36.3967, 33.83365], [36.38263, 33.86579], [36.28589, 33.91981], [36.41078, 34.05253], [36.50576, 34.05982], [36.5128, 34.09916], [36.62537, 34.20251], [36.59195, 34.2316], [36.58667, 34.27667], [36.60778, 34.31009], [36.56556, 34.31881], [36.53039, 34.3798], [36.55853, 34.41609], [36.46179, 34.46541], [36.4442, 34.50165], [36.34745, 34.5002], [36.3369, 34.52629], [36.39846, 34.55672], [36.41429, 34.61175], [36.45299, 34.59438], [36.46003, 34.6378], [36.42941, 34.62505], [36.35384, 34.65447], [36.35135, 34.68516], [36.32399, 34.69334], [36.29165, 34.62991], [35.98718, 34.64977], [35.97386, 34.63322], [35.48515, 34.70851], [34.78515, 33.20368], [35.10645, 33.09318], [35.1924, 33.08743], [35.31429, 33.10515], [35.35223, 33.05617], [35.43059, 33.06659], [35.448, 33.09264], [35.50272, 33.09056], [35.50335, 33.114], [35.52573, 33.11921], [35.54228, 33.19865], [35.5362, 33.23196], [35.54808, 33.236], [35.54544, 33.25513], [35.55555, 33.25844], [35.56523, 33.28969], [35.58326, 33.28381], [35.58502, 33.26653], [35.62283, 33.24226], [35.62019, 33.27278], [35.77477, 33.33609], [35.81324, 33.36354], [35.82577, 33.40479], [35.88668, 33.43183], [35.94816, 33.47886]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "LC", + iso1A3: "LCA", + iso1N3: "662", + wikidata: "Q760", + nameEn: "St. Lucia", + aliases: ["WL"], + groups: ["029", "003", "419", "019", "UN"], + driveSide: "left", + roadSpeedUnit: "mph", + callingCodes: ["1 758"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-59.95997, 14.20285], [-61.69315, 14.26451], [-59.94058, 12.34011], [-59.95997, 14.20285]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "LI", + iso1A3: "LIE", + iso1N3: "438", + wikidata: "Q347", + nameEn: "Liechtenstein", + aliases: ["FL"], + groups: ["155", "150", "UN"], + callingCodes: ["423"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[9.60717, 47.06091], [9.61216, 47.07732], [9.63395, 47.08443], [9.62623, 47.14685], [9.56539, 47.17124], [9.58264, 47.20673], [9.56981, 47.21926], [9.55176, 47.22585], [9.56766, 47.24281], [9.53116, 47.27029], [9.52406, 47.24959], [9.50318, 47.22153], [9.4891, 47.19346], [9.48774, 47.17402], [9.51044, 47.13727], [9.52089, 47.10019], [9.51362, 47.08505], [9.47139, 47.06402], [9.47548, 47.05257], [9.54041, 47.06495], [9.55721, 47.04762], [9.60717, 47.06091]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "LK", + iso1A3: "LKA", + iso1N3: "144", + wikidata: "Q854", + nameEn: "Sri Lanka", + groups: ["034", "142", "UN"], + driveSide: "left", + callingCodes: ["94"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[76.59015, 5.591], [85.15017, 5.21497], [80.48418, 10.20786], [79.42124, 9.80115], [79.50447, 8.91876], [76.59015, 5.591]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "LR", + iso1A3: "LBR", + iso1N3: "430", + wikidata: "Q1014", + nameEn: "Liberia", + groups: ["011", "202", "002", "UN"], + callingCodes: ["231"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-8.47114, 7.55676], [-8.55874, 7.62525], [-8.55874, 7.70167], [-8.67814, 7.69428], [-8.72789, 7.51429], [-8.8448, 7.35149], [-8.85724, 7.26019], [-8.93435, 7.2824], [-9.09107, 7.1985], [-9.18311, 7.30461], [-9.20798, 7.38109], [-9.305, 7.42056], [-9.41943, 7.41809], [-9.48161, 7.37122], [-9.37465, 7.62032], [-9.35724, 7.74111], [-9.44928, 7.9284], [-9.41445, 8.02448], [-9.50898, 8.18455], [-9.47415, 8.35195], [-9.77763, 8.54633], [-10.05873, 8.42578], [-10.05375, 8.50697], [-10.14579, 8.52665], [-10.203, 8.47991], [-10.27575, 8.48711], [-10.30084, 8.30008], [-10.31635, 8.28554], [-10.29839, 8.21283], [-10.35227, 8.15223], [-10.45023, 8.15627], [-10.51554, 8.1393], [-10.57523, 8.04829], [-10.60492, 8.04072], [-10.60422, 7.7739], [-11.29417, 7.21576], [-11.4027, 6.97746], [-11.50429, 6.92704], [-12.15048, 6.15992], [-7.52774, 3.7105], [-7.53259, 4.35145], [-7.59349, 4.8909], [-7.53876, 4.94294], [-7.55369, 5.08667], [-7.48901, 5.14118], [-7.46165, 5.26256], [-7.36463, 5.32944], [-7.43428, 5.42355], [-7.37209, 5.61173], [-7.43926, 5.74787], [-7.43677, 5.84687], [-7.46165, 5.84934], [-7.48155, 5.80974], [-7.67309, 5.94337], [-7.70294, 5.90625], [-7.78254, 5.99037], [-7.79747, 6.07696], [-7.8497, 6.08932], [-7.83478, 6.20309], [-7.90692, 6.27728], [-8.00642, 6.31684], [-8.17557, 6.28222], [-8.3298, 6.36381], [-8.38453, 6.35887], [-8.45666, 6.49977], [-8.48652, 6.43797], [-8.59456, 6.50612], [-8.31736, 6.82837], [-8.29249, 7.1691], [-8.37458, 7.25794], [-8.41935, 7.51203], [-8.47114, 7.55676]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "LS", + iso1A3: "LSO", + iso1N3: "426", + wikidata: "Q1013", + nameEn: "Lesotho", + groups: ["018", "202", "002", "UN"], + driveSide: "left", + callingCodes: ["266"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[29.33204, -29.45598], [29.44883, -29.3772], [29.40524, -29.21246], [28.68043, -28.58744], [28.65091, -28.57025], [28.40612, -28.6215], [28.30518, -28.69531], [28.2348, -28.69471], [28.1317, -28.7293], [28.02503, -28.85991], [27.98675, -28.8787], [27.9392, -28.84864], [27.88933, -28.88156], [27.8907, -28.91612], [27.75458, -28.89839], [27.55974, -29.18954], [27.5158, -29.2261], [27.54258, -29.25575], [27.48679, -29.29349], [27.45125, -29.29708], [27.47254, -29.31968], [27.4358, -29.33465], [27.33464, -29.48161], [27.01016, -29.65439], [27.09489, -29.72796], [27.22719, -30.00718], [27.29603, -30.05473], [27.32555, -30.14785], [27.40778, -30.14577], [27.37293, -30.19401], [27.36649, -30.27246], [27.38108, -30.33456], [27.45452, -30.32239], [27.56901, -30.42504], [27.56781, -30.44562], [27.62137, -30.50509], [27.6521, -30.51707], [27.67819, -30.53437], [27.69467, -30.55862], [27.74814, -30.60635], [28.12073, -30.68072], [28.2319, -30.28476], [28.399, -30.1592], [28.68627, -30.12885], [28.80222, -30.10579], [28.9338, -30.05072], [29.16548, -29.91706], [29.12553, -29.76266], [29.28545, -29.58456], [29.33204, -29.45598]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "LT", + iso1A3: "LTU", + iso1N3: "440", + wikidata: "Q37", + nameEn: "Lithuania", + groups: ["EU", "154", "150", "UN"], + callingCodes: ["370"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[24.89005, 56.46666], [24.83686, 56.41565], [24.70022, 56.40483], [24.57353, 56.31525], [24.58143, 56.29125], [24.42746, 56.26522], [24.32334, 56.30226], [24.13139, 56.24881], [24.02657, 56.3231], [23.75726, 56.37282], [23.49803, 56.34307], [23.40486, 56.37689], [23.31606, 56.3827], [23.17312, 56.36795], [23.09531, 56.30511], [22.96988, 56.41213], [22.83048, 56.367], [22.69354, 56.36284], [22.56441, 56.39305], [22.3361, 56.4016], [22.09728, 56.42851], [22.00548, 56.41508], [21.74558, 56.33181], [21.57888, 56.31406], [21.49736, 56.29106], [21.24644, 56.16917], [21.15016, 56.07818], [20.68447, 56.04073], [20.60454, 55.40986], [20.95181, 55.27994], [21.26425, 55.24456], [21.35465, 55.28427], [21.38446, 55.29348], [21.46766, 55.21115], [21.51095, 55.18507], [21.55605, 55.20311], [21.64954, 55.1791], [21.85521, 55.09493], [21.96505, 55.07353], [21.99543, 55.08691], [22.03984, 55.07888], [22.02582, 55.05078], [22.06087, 55.02935], [22.11697, 55.02131], [22.14267, 55.05345], [22.31562, 55.0655], [22.47688, 55.04408], [22.58907, 55.07085], [22.60075, 55.01863], [22.65451, 54.97037], [22.68723, 54.9811], [22.76422, 54.92521], [22.85083, 54.88711], [22.87317, 54.79492], [22.73631, 54.72952], [22.73397, 54.66604], [22.75467, 54.6483], [22.74225, 54.64339], [22.7522, 54.63525], [22.68021, 54.58486], [22.71293, 54.56454], [22.67788, 54.532], [22.70208, 54.45312], [22.7253, 54.41732], [22.79705, 54.36264], [22.83756, 54.40827], [23.00584, 54.38514], [22.99649, 54.35927], [23.05726, 54.34565], [23.04323, 54.31567], [23.104, 54.29794], [23.13905, 54.31567], [23.15526, 54.31076], [23.15938, 54.29894], [23.24656, 54.25701], [23.3494, 54.25155], [23.39525, 54.21672], [23.42418, 54.17911], [23.45223, 54.17775], [23.49196, 54.14764], [23.52702, 54.04622], [23.48261, 53.98855], [23.51284, 53.95052], [23.61677, 53.92691], [23.71726, 53.93379], [23.80543, 53.89558], [23.81309, 53.94205], [23.95098, 53.9613], [23.98837, 53.92554], [24.19638, 53.96405], [24.34128, 53.90076], [24.44411, 53.90076], [24.62275, 54.00217], [24.69652, 54.01901], [24.69185, 53.96543], [24.74279, 53.96663], [24.85311, 54.02862], [24.77131, 54.11091], [24.96894, 54.17589], [24.991, 54.14241], [25.0728, 54.13419], [25.19199, 54.219], [25.22705, 54.26271], [25.35559, 54.26544], [25.509, 54.30267], [25.56823, 54.25212], [25.51452, 54.17799], [25.54724, 54.14925], [25.64875, 54.1259], [25.71084, 54.16704], [25.78563, 54.15747], [25.78553, 54.23327], [25.68513, 54.31727], [25.55425, 54.31591], [25.5376, 54.33158], [25.63371, 54.42075], [25.62203, 54.4656], [25.64813, 54.48704], [25.68045, 54.5321], [25.75977, 54.57252], [25.74122, 54.80108], [25.89462, 54.93438], [25.99129, 54.95705], [26.05907, 54.94631], [26.13386, 54.98924], [26.20397, 54.99729], [26.26941, 55.08032], [26.23202, 55.10439], [26.30628, 55.12536], [26.35121, 55.1525], [26.46249, 55.12814], [26.51481, 55.16051], [26.54753, 55.14181], [26.69243, 55.16718], [26.68075, 55.19787], [26.72983, 55.21788], [26.73017, 55.24226], [26.835, 55.28182], [26.83266, 55.30444], [26.80929, 55.31642], [26.6714, 55.33902], [26.5709, 55.32572], [26.44937, 55.34832], [26.5522, 55.40277], [26.55094, 55.5093], [26.63167, 55.57887], [26.63231, 55.67968], [26.58248, 55.6754], [26.46661, 55.70375], [26.39561, 55.71156], [26.18509, 55.86813], [26.03815, 55.95884], [25.90047, 56.0013], [25.85893, 56.00188], [25.81773, 56.05444], [25.69246, 56.08892], [25.68588, 56.14725], [25.53621, 56.16663], [25.39751, 56.15707], [25.23099, 56.19147], [25.09325, 56.1878], [25.05762, 56.26742], [24.89005, 56.46666]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "LU", + iso1A3: "LUX", + iso1N3: "442", + wikidata: "Q32", + nameEn: "Luxembourg", + groups: ["EU", "155", "150", "UN"], + callingCodes: ["352"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[6.1379, 50.12964], [6.1137, 50.13668], [6.12028, 50.16374], [6.08577, 50.17246], [6.06406, 50.15344], [6.03093, 50.16362], [6.02488, 50.18283], [5.96453, 50.17259], [5.95929, 50.13295], [5.89488, 50.11476], [5.8857, 50.07824], [5.85474, 50.06342], [5.86904, 50.04614], [5.8551, 50.02683], [5.81866, 50.01286], [5.82331, 49.99662], [5.83968, 49.9892], [5.83467, 49.97823], [5.81163, 49.97142], [5.80833, 49.96451], [5.77291, 49.96056], [5.77314, 49.93646], [5.73621, 49.89796], [5.78415, 49.87922], [5.75269, 49.8711], [5.75861, 49.85631], [5.74567, 49.85368], [5.75884, 49.84811], [5.74953, 49.84709], [5.74975, 49.83933], [5.74076, 49.83823], [5.7404, 49.83452], [5.74844, 49.82435], [5.74364, 49.82058], [5.74953, 49.81428], [5.75409, 49.79239], [5.78871, 49.7962], [5.82245, 49.75048], [5.83149, 49.74729], [5.82562, 49.72395], [5.84193, 49.72161], [5.86503, 49.72739], [5.88677, 49.70951], [5.86527, 49.69291], [5.86175, 49.67862], [5.9069, 49.66377], [5.90164, 49.6511], [5.90599, 49.63853], [5.88552, 49.63507], [5.88393, 49.62802], [5.87609, 49.62047], [5.8762, 49.60898], [5.84826, 49.5969], [5.84971, 49.58674], [5.86986, 49.58756], [5.87256, 49.57539], [5.8424, 49.56082], [5.84692, 49.55663], [5.84143, 49.5533], [5.81838, 49.54777], [5.80871, 49.5425], [5.81664, 49.53775], [5.83648, 49.5425], [5.84466, 49.53027], [5.83467, 49.52717], [5.83389, 49.52152], [5.86571, 49.50015], [5.94128, 49.50034], [5.94224, 49.49608], [5.96876, 49.49053], [5.97693, 49.45513], [6.02648, 49.45451], [6.02743, 49.44845], [6.04176, 49.44801], [6.05553, 49.46663], [6.07887, 49.46399], [6.08373, 49.45594], [6.10072, 49.45268], [6.09845, 49.46351], [6.10325, 49.4707], [6.12346, 49.4735], [6.12814, 49.49365], [6.14321, 49.48796], [6.16115, 49.49297], [6.15366, 49.50226], [6.17386, 49.50934], [6.19543, 49.50536], [6.2409, 49.51408], [6.25029, 49.50609], [6.27875, 49.503], [6.28818, 49.48465], [6.3687, 49.4593], [6.36778, 49.46937], [6.36907, 49.48931], [6.36788, 49.50377], [6.35666, 49.52931], [6.38072, 49.55171], [6.38228, 49.55855], [6.35825, 49.57053], [6.36676, 49.57813], [6.38024, 49.57593], [6.38342, 49.5799], [6.37464, 49.58886], [6.385, 49.59946], [6.39822, 49.60081], [6.41861, 49.61723], [6.4413, 49.65722], [6.43768, 49.66021], [6.42726, 49.66078], [6.42937, 49.66857], [6.44654, 49.67799], [6.46048, 49.69092], [6.48014, 49.69767], [6.49785, 49.71118], [6.50647, 49.71353], [6.5042, 49.71808], [6.49694, 49.72205], [6.49535, 49.72645], [6.50261, 49.72718], [6.51397, 49.72058], [6.51805, 49.72425], [6.50193, 49.73291], [6.50174, 49.75292], [6.51646, 49.75961], [6.51828, 49.76855], [6.51056, 49.77515], [6.51669, 49.78336], [6.50534, 49.78952], [6.52169, 49.79787], [6.53122, 49.80666], [6.52121, 49.81338], [6.51215, 49.80124], [6.50647, 49.80916], [6.48718, 49.81267], [6.47111, 49.82263], [6.45425, 49.81164], [6.44131, 49.81443], [6.42905, 49.81091], [6.42521, 49.81591], [6.40022, 49.82029], [6.36576, 49.85032], [6.34267, 49.84974], [6.33585, 49.83785], [6.32098, 49.83728], [6.32303, 49.85133], [6.30963, 49.87021], [6.29692, 49.86685], [6.28874, 49.87592], [6.26146, 49.88203], [6.23496, 49.89972], [6.22926, 49.92096], [6.21882, 49.92403], [6.22608, 49.929], [6.22094, 49.94955], [6.19856, 49.95053], [6.19089, 49.96991], [6.18045, 49.96611], [6.18554, 49.95622], [6.17872, 49.9537], [6.16466, 49.97086], [6.1701, 49.98518], [6.14147, 49.99563], [6.14948, 50.00908], [6.13806, 50.01056], [6.1295, 50.01849], [6.13273, 50.02019], [6.13794, 50.01466], [6.14666, 50.02207], [6.13044, 50.02929], [6.13458, 50.04141], [6.11274, 50.05916], [6.12055, 50.09171], [6.1379, 50.12964]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "LV", + iso1A3: "LVA", + iso1N3: "428", + wikidata: "Q211", + nameEn: "Latvia", + groups: ["EU", "154", "150", "UN"], + callingCodes: ["371"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[27.34698, 57.52242], [26.90364, 57.62823], [26.54675, 57.51813], [26.46527, 57.56885], [26.29253, 57.59244], [26.1866, 57.6849], [26.2029, 57.7206], [26.08098, 57.76619], [26.0543, 57.76105], [26.03332, 57.7718], [26.02415, 57.76865], [26.02069, 57.77169], [26.0266, 57.77441], [26.027, 57.78158], [26.02456, 57.78342], [26.0324, 57.79037], [26.05949, 57.84744], [25.73499, 57.90193], [25.29581, 58.08288], [25.28237, 57.98539], [25.19484, 58.0831], [24.3579, 57.87471], [24.26221, 57.91787], [23.20055, 57.56697], [22.80496, 57.87798], [19.84909, 57.57876], [19.64795, 57.06466], [20.68447, 56.04073], [21.15016, 56.07818], [21.24644, 56.16917], [21.49736, 56.29106], [21.57888, 56.31406], [21.74558, 56.33181], [22.00548, 56.41508], [22.09728, 56.42851], [22.3361, 56.4016], [22.56441, 56.39305], [22.69354, 56.36284], [22.83048, 56.367], [22.96988, 56.41213], [23.09531, 56.30511], [23.17312, 56.36795], [23.31606, 56.3827], [23.40486, 56.37689], [23.49803, 56.34307], [23.75726, 56.37282], [24.02657, 56.3231], [24.13139, 56.24881], [24.32334, 56.30226], [24.42746, 56.26522], [24.58143, 56.29125], [24.57353, 56.31525], [24.70022, 56.40483], [24.83686, 56.41565], [24.89005, 56.46666], [25.05762, 56.26742], [25.09325, 56.1878], [25.23099, 56.19147], [25.39751, 56.15707], [25.53621, 56.16663], [25.68588, 56.14725], [25.69246, 56.08892], [25.81773, 56.05444], [25.85893, 56.00188], [25.90047, 56.0013], [26.03815, 55.95884], [26.18509, 55.86813], [26.39561, 55.71156], [26.46661, 55.70375], [26.58248, 55.6754], [26.63231, 55.67968], [26.64888, 55.70515], [26.71802, 55.70645], [26.76872, 55.67658], [26.87448, 55.7172], [26.97153, 55.8102], [27.1559, 55.85032], [27.27804, 55.78299], [27.3541, 55.8089], [27.61683, 55.78558], [27.63065, 55.89687], [27.97865, 56.11849], [28.15217, 56.16964], [28.23716, 56.27588], [28.16599, 56.37806], [28.19057, 56.44637], [28.10069, 56.524], [28.13526, 56.57989], [28.04768, 56.59004], [27.86101, 56.88204], [27.66511, 56.83921], [27.86101, 57.29402], [27.52453, 57.42826], [27.56832, 57.53728], [27.34698, 57.52242]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "LY", + iso1A3: "LBY", + iso1N3: "434", + wikidata: "Q1016", + nameEn: "Libya", + groups: ["015", "002", "UN"], + callingCodes: ["218"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[26.92891, 33.39516], [11.58941, 33.36891], [11.55852, 33.1409], [11.51549, 33.09826], [11.46037, 32.6307], [11.57828, 32.48013], [11.53898, 32.4138], [11.04234, 32.2145], [10.7315, 31.97235], [10.62788, 31.96629], [10.48497, 31.72956], [10.31364, 31.72648], [10.12239, 31.42098], [10.29516, 30.90337], [9.88152, 30.34074], [9.76848, 30.34366], [9.55544, 30.23971], [9.3876, 30.16738], [9.78136, 29.40961], [9.89569, 26.57696], [9.51696, 26.39148], [9.38834, 26.19288], [10.03146, 25.35635], [10.02432, 24.98124], [10.33159, 24.5465], [10.85323, 24.5595], [11.41061, 24.21456], [11.62498, 24.26669], [11.96886, 23.51735], [13.5631, 23.16574], [14.22918, 22.61719], [14.99751, 23.00539], [15.99566, 23.49639], [23.99539, 19.49944], [23.99715, 20.00038], [24.99794, 19.99661], [24.99885, 21.99535], [24.99968, 29.24574], [24.71117, 30.17441], [25.01077, 30.73861], [24.8458, 31.39877], [26.92891, 33.39516]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "MA", + iso1A3: "MAR", + iso1N3: "504", + wikidata: "Q1028", + nameEn: "Morocco", + groups: ["015", "002", "UN"], + callingCodes: ["212"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-2.27707, 35.35051], [-5.10878, 36.05227], [-7.2725, 35.73269], [-14.43883, 27.02969], [-17.27295, 21.93519], [-17.21511, 21.34226], [-17.02707, 21.34022], [-16.9978, 21.36239], [-16.44269, 21.39745], [-14.78487, 21.36587], [-14.47329, 21.63839], [-14.48112, 22.00886], [-14.1291, 22.41636], [-14.10361, 22.75501], [-13.75627, 23.77231], [-13.00628, 24.01923], [-12.92147, 24.39502], [-12.12281, 25.13682], [-12.06001, 26.04442], [-11.62052, 26.05229], [-11.38635, 26.611], [-11.23622, 26.72023], [-11.35695, 26.8505], [-10.68417, 26.90984], [-9.81998, 26.71379], [-9.56957, 26.90042], [-9.08698, 26.98639], [-8.71787, 26.9898], [-8.77527, 27.66663], [-8.66879, 27.6666], [-8.6715, 28.71194], [-7.61585, 29.36252], [-6.95824, 29.50924], [-6.78351, 29.44634], [-6.69965, 29.51623], [-5.75616, 29.61407], [-5.72121, 29.52322], [-5.58831, 29.48103], [-5.21671, 29.95253], [-4.6058, 30.28343], [-4.31774, 30.53229], [-3.64735, 30.67539], [-3.65418, 30.85566], [-3.54944, 31.0503], [-3.77103, 31.14984], [-3.77647, 31.31912], [-3.66386, 31.39202], [-3.66314, 31.6339], [-2.82784, 31.79459], [-2.93873, 32.06557], [-2.46166, 32.16603], [-1.22829, 32.07832], [-1.15735, 32.12096], [-1.24453, 32.1917], [-1.24998, 32.32993], [-0.9912, 32.52467], [-1.37794, 32.73628], [-1.54244, 32.95499], [-1.46249, 33.0499], [-1.67067, 33.27084], [-1.59508, 33.59929], [-1.73494, 33.71721], [-1.64666, 34.10405], [-1.78042, 34.39018], [-1.69788, 34.48056], [-1.84569, 34.61907], [-1.73707, 34.74226], [-1.97469, 34.886], [-1.97833, 34.93218], [-2.04734, 34.93218], [-2.21445, 35.04378], [-2.21248, 35.08532], [-2.27707, 35.35051]], [[-2.91909, 35.33927], [-2.92272, 35.27509], [-2.93893, 35.26737], [-2.95065, 35.26576], [-2.95431, 35.2728], [-2.96516, 35.27967], [-2.96826, 35.28296], [-2.96507, 35.28801], [-2.97035, 35.28852], [-2.96978, 35.29459], [-2.96648, 35.30475], [-2.96038, 35.31609], [-2.91909, 35.33927]], [[-3.90602, 35.21494], [-3.89343, 35.22728], [-3.88372, 35.20767], [-3.90602, 35.21494]], [[-4.30191, 35.17419], [-4.29436, 35.17149], [-4.30112, 35.17058], [-4.30191, 35.17419]], [[-2.40316, 35.16893], [-2.45965, 35.16527], [-2.43262, 35.20652], [-2.40316, 35.16893]], [[-5.38491, 35.92591], [-5.21179, 35.90091], [-5.34379, 35.8711], [-5.35844, 35.87375], [-5.37338, 35.88417], [-5.38491, 35.92591]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "MC", + iso1A3: "MCO", + iso1N3: "492", + wikidata: "Q235", + nameEn: "Monaco", + groups: ["155", "150", "UN"], + callingCodes: ["377"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[7.47823, 43.73341], [7.4379, 43.74963], [7.4389, 43.75151], [7.43708, 43.75197], [7.43624, 43.75014], [7.43013, 43.74895], [7.42809, 43.74396], [7.42443, 43.74087], [7.42299, 43.74176], [7.42062, 43.73977], [7.41233, 43.73439], [7.41298, 43.73311], [7.41291, 43.73168], [7.41113, 43.73156], [7.40903, 43.7296], [7.42422, 43.72209], [7.47823, 43.73341]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "MD", + iso1A3: "MDA", + iso1N3: "498", + wikidata: "Q217", + nameEn: "Moldova", + groups: ["151", "150", "UN"], + callingCodes: ["373"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[27.74422, 48.45926], [27.6658, 48.44034], [27.59027, 48.46311], [27.5889, 48.49224], [27.46942, 48.454], [27.44333, 48.41209], [27.37741, 48.41026], [27.37604, 48.44398], [27.32159, 48.4434], [27.27855, 48.37534], [27.13434, 48.37288], [27.08078, 48.43214], [27.0231, 48.42485], [27.03821, 48.37653], [26.93384, 48.36558], [26.85556, 48.41095], [26.71274, 48.40388], [26.82809, 48.31629], [26.79239, 48.29071], [26.6839, 48.35828], [26.62823, 48.25804], [26.81161, 48.25049], [26.87708, 48.19919], [26.94265, 48.1969], [26.98042, 48.15752], [26.96119, 48.13003], [27.04118, 48.12522], [27.02985, 48.09083], [27.15622, 47.98538], [27.1618, 47.92391], [27.29069, 47.73722], [27.25519, 47.71366], [27.32202, 47.64009], [27.3979, 47.59473], [27.47942, 47.48113], [27.55731, 47.46637], [27.60263, 47.32507], [27.68706, 47.28962], [27.73172, 47.29248], [27.81892, 47.1381], [28.09095, 46.97621], [28.12173, 46.82283], [28.24808, 46.64305], [28.22281, 46.50481], [28.25769, 46.43334], [28.18902, 46.35283], [28.19864, 46.31869], [28.10937, 46.22852], [28.13684, 46.18099], [28.08612, 46.01105], [28.13111, 45.92819], [28.16568, 45.6421], [28.08927, 45.6051], [28.18741, 45.47358], [28.21139, 45.46895], [28.30201, 45.54744], [28.41836, 45.51715], [28.43072, 45.48538], [28.51449, 45.49982], [28.49252, 45.56716], [28.54196, 45.58062], [28.51587, 45.6613], [28.47879, 45.66994], [28.52823, 45.73803], [28.70401, 45.78019], [28.69852, 45.81753], [28.78503, 45.83475], [28.74383, 45.96664], [28.98004, 46.00385], [29.00613, 46.04962], [28.94643, 46.09176], [29.06656, 46.19716], [28.94953, 46.25852], [28.98478, 46.31803], [29.004, 46.31495], [28.9306, 46.45699], [29.01241, 46.46177], [29.02409, 46.49582], [29.23547, 46.55435], [29.24886, 46.37912], [29.35357, 46.49505], [29.49914, 46.45889], [29.5939, 46.35472], [29.6763, 46.36041], [29.66359, 46.4215], [29.74496, 46.45605], [29.88329, 46.35851], [29.94114, 46.40114], [30.09103, 46.38694], [30.16794, 46.40967], [30.02511, 46.45132], [29.88916, 46.54302], [29.94409, 46.56002], [29.9743, 46.75325], [29.94522, 46.80055], [29.98814, 46.82358], [29.87405, 46.88199], [29.75458, 46.8604], [29.72986, 46.92234], [29.57056, 46.94766], [29.62137, 47.05069], [29.61038, 47.09932], [29.53044, 47.07851], [29.49732, 47.12878], [29.57696, 47.13581], [29.54996, 47.24962], [29.59665, 47.25521], [29.5733, 47.36508], [29.48678, 47.36043], [29.47854, 47.30366], [29.39889, 47.30179], [29.3261, 47.44664], [29.18603, 47.43387], [29.11743, 47.55001], [29.22414, 47.60012], [29.22242, 47.73607], [29.27255, 47.79953], [29.20663, 47.80367], [29.27804, 47.88893], [29.19839, 47.89261], [29.1723, 47.99013], [28.9306, 47.96255], [28.8414, 48.03392], [28.85232, 48.12506], [28.69896, 48.13106], [28.53921, 48.17453], [28.48428, 48.0737], [28.42454, 48.12047], [28.43701, 48.15832], [28.38712, 48.17567], [28.34009, 48.13147], [28.30609, 48.14018], [28.30586, 48.1597], [28.34912, 48.1787], [28.36996, 48.20543], [28.35519, 48.24957], [28.32508, 48.23384], [28.2856, 48.23202], [28.19314, 48.20749], [28.17666, 48.25963], [28.07504, 48.23494], [28.09873, 48.3124], [28.04527, 48.32661], [27.95883, 48.32368], [27.88391, 48.36699], [27.87533, 48.4037], [27.81902, 48.41874], [27.79225, 48.44244], [27.74422, 48.45926]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "ME", + iso1A3: "MNE", + iso1N3: "499", + wikidata: "Q236", + nameEn: "Montenegro", + groups: ["039", "150", "UN"], + callingCodes: ["382"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[19.22807, 43.5264], [19.15685, 43.53943], [19.13933, 43.5282], [19.04934, 43.50384], [19.01078, 43.55806], [18.91379, 43.50299], [18.95469, 43.49367], [18.96053, 43.45042], [19.01078, 43.43854], [19.04071, 43.397], [19.08673, 43.31453], [19.08206, 43.29668], [19.04233, 43.30008], [19.00844, 43.24988], [18.95001, 43.29327], [18.95819, 43.32899], [18.90911, 43.36383], [18.83912, 43.34795], [18.84794, 43.33735], [18.85342, 43.32426], [18.76538, 43.29838], [18.6976, 43.25243], [18.71747, 43.2286], [18.66605, 43.2056], [18.64735, 43.14766], [18.66254, 43.03928], [18.52232, 43.01451], [18.49076, 42.95553], [18.49661, 42.89306], [18.4935, 42.86433], [18.47633, 42.85829], [18.45921, 42.81682], [18.47324, 42.74992], [18.56789, 42.72074], [18.55221, 42.69045], [18.54603, 42.69171], [18.54841, 42.68328], [18.57373, 42.64429], [18.52232, 42.62279], [18.55504, 42.58409], [18.53751, 42.57376], [18.49778, 42.58409], [18.43735, 42.55921], [18.44307, 42.51077], [18.43588, 42.48556], [18.52152, 42.42302], [18.54128, 42.39171], [18.45131, 42.21682], [19.26406, 41.74971], [19.37597, 41.84849], [19.37451, 41.8842], [19.33812, 41.90669], [19.34601, 41.95675], [19.37691, 41.96977], [19.36867, 42.02564], [19.37548, 42.06835], [19.40687, 42.10024], [19.28623, 42.17745], [19.42, 42.33019], [19.42352, 42.36546], [19.4836, 42.40831], [19.65972, 42.62774], [19.73244, 42.66299], [19.77375, 42.58517], [19.74731, 42.57422], [19.76549, 42.50237], [19.82333, 42.46581], [19.9324, 42.51699], [20.00842, 42.5109], [20.01834, 42.54622], [20.07761, 42.55582], [20.0969, 42.65559], [20.02915, 42.71147], [20.02088, 42.74789], [20.04898, 42.77701], [20.2539, 42.76245], [20.27869, 42.81945], [20.35692, 42.8335], [20.34528, 42.90676], [20.16415, 42.97177], [20.14896, 42.99058], [20.12325, 42.96237], [20.05431, 42.99571], [20.04729, 43.02732], [19.98887, 43.0538], [19.96549, 43.11098], [19.92576, 43.08539], [19.79255, 43.11951], [19.76918, 43.16044], [19.64063, 43.19027], [19.62661, 43.2286], [19.54598, 43.25158], [19.52962, 43.31623], [19.48171, 43.32644], [19.44315, 43.38846], [19.22229, 43.47926], [19.22807, 43.5264]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "MF", + iso1A3: "MAF", + iso1N3: "663", + wikidata: "Q126125", + nameEn: "Saint-Martin", + country: "FR", + groups: ["Q3320166", "EU", "029", "003", "419", "019", "UN"], + callingCodes: ["590"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-62.93924, 18.02904], [-62.62718, 18.26185], [-63.35989, 18.06012], [-63.33064, 17.9615], [-63.13502, 18.05445], [-63.11042, 18.05339], [-63.09686, 18.04608], [-63.07759, 18.04943], [-63.0579, 18.06614], [-63.04039, 18.05619], [-63.02323, 18.05757], [-62.93924, 18.02904]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "MG", + iso1A3: "MDG", + iso1N3: "450", + wikidata: "Q1019", + nameEn: "Madagascar", + aliases: ["RM"], + groups: ["014", "202", "002", "UN"], + callingCodes: ["261"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[51.93891, -10.85085], [45.84651, -12.77177], [42.14681, -19.63341], [45.80092, -33.00974], [51.93891, -10.85085]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "MH", + iso1A3: "MHL", + iso1N3: "584", + wikidata: "Q709", + nameEn: "Marshall Islands", + groups: ["057", "009", "UN"], + roadSpeedUnit: "mph", + callingCodes: ["692"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[169, 3.9], [173.53711, 5.70687], [169.29099, 15.77133], [159.04653, 10.59067], [169, 3.9]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "MK", + iso1A3: "MKD", + iso1N3: "807", + wikidata: "Q221", + nameEn: "North Macedonia", + groups: ["039", "150", "UN"], + callingCodes: ["389"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[22.34773, 42.31725], [22.29275, 42.34913], [22.29605, 42.37477], [22.16384, 42.32103], [22.02908, 42.29848], [21.94405, 42.34669], [21.91595, 42.30392], [21.84654, 42.3247], [21.77176, 42.2648], [21.70111, 42.23789], [21.58992, 42.25915], [21.52145, 42.24465], [21.50823, 42.27156], [21.43882, 42.2789], [21.43882, 42.23609], [21.38428, 42.24465], [21.30496, 42.1418], [21.29913, 42.13954], [21.31983, 42.10993], [21.22728, 42.08909], [21.16614, 42.19815], [21.11491, 42.20794], [20.75464, 42.05229], [20.76786, 41.91839], [20.68523, 41.85318], [20.59524, 41.8818], [20.55976, 41.87068], [20.57144, 41.7897], [20.53405, 41.78099], [20.51301, 41.72433], [20.52937, 41.69292], [20.51769, 41.65975], [20.55508, 41.58113], [20.52103, 41.56473], [20.45809, 41.5549], [20.45331, 41.51436], [20.49039, 41.49277], [20.51301, 41.442], [20.55976, 41.4087], [20.52119, 41.34381], [20.49432, 41.33679], [20.51068, 41.2323], [20.59715, 41.13644], [20.58546, 41.11179], [20.59832, 41.09066], [20.63454, 41.0889], [20.65558, 41.08009], [20.71634, 40.91781], [20.73504, 40.9081], [20.81567, 40.89662], [20.83671, 40.92752], [20.94305, 40.92399], [20.97693, 40.90103], [20.97887, 40.85475], [21.15262, 40.85546], [21.21105, 40.8855], [21.25779, 40.86165], [21.35595, 40.87578], [21.41555, 40.9173], [21.53007, 40.90759], [21.57448, 40.86076], [21.69601, 40.9429], [21.7556, 40.92525], [21.91102, 41.04786], [21.90869, 41.09191], [22.06527, 41.15617], [22.1424, 41.12449], [22.17629, 41.15969], [22.26744, 41.16409], [22.42285, 41.11921], [22.5549, 41.13065], [22.58295, 41.11568], [22.62852, 41.14385], [22.65306, 41.18168], [22.71266, 41.13945], [22.74538, 41.16321], [22.76408, 41.32225], [22.81199, 41.3398], [22.93334, 41.34104], [22.96331, 41.35782], [22.95513, 41.63265], [23.03342, 41.71034], [23.01239, 41.76527], [22.96682, 41.77137], [22.90254, 41.87587], [22.86749, 42.02275], [22.67701, 42.06614], [22.51224, 42.15457], [22.50289, 42.19527], [22.47251, 42.20393], [22.38136, 42.30339], [22.34773, 42.31725]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "ML", + iso1A3: "MLI", + iso1N3: "466", + wikidata: "Q912", + nameEn: "Mali", + groups: ["011", "202", "002", "UN"], + callingCodes: ["223"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-4.83423, 24.99935], [-6.57191, 25.0002], [-5.60725, 16.49919], [-5.33435, 16.33354], [-5.50165, 15.50061], [-9.32979, 15.50032], [-9.31106, 15.69412], [-9.33314, 15.7044], [-9.44673, 15.60553], [-9.40447, 15.4396], [-10.71721, 15.4223], [-10.90932, 15.11001], [-11.43483, 15.62339], [-11.70705, 15.51558], [-11.94903, 14.76143], [-12.23936, 14.76324], [-11.93043, 13.84505], [-12.06897, 13.71049], [-11.83345, 13.33333], [-11.63025, 13.39174], [-11.39935, 12.97808], [-11.37536, 12.40788], [-11.50006, 12.17826], [-11.24136, 12.01286], [-10.99758, 12.24634], [-10.80355, 12.1053], [-10.71897, 11.91552], [-10.30604, 12.24634], [-9.714, 12.0226], [-9.63938, 12.18312], [-9.32097, 12.29009], [-9.38067, 12.48446], [-9.13689, 12.50875], [-8.94784, 12.34842], [-8.80854, 11.66715], [-8.40058, 11.37466], [-8.66923, 10.99397], [-8.35083, 11.06234], [-8.2667, 10.91762], [-8.32614, 10.69273], [-8.22711, 10.41722], [-8.10207, 10.44649], [-7.9578, 10.2703], [-7.97971, 10.17117], [-7.92107, 10.15577], [-7.63048, 10.46334], [-7.54462, 10.40921], [-7.52261, 10.4655], [-7.44555, 10.44602], [-7.3707, 10.24677], [-7.13331, 10.24877], [-7.0603, 10.14711], [-7.00966, 10.15794], [-6.97444, 10.21644], [-7.01186, 10.25111], [-6.93921, 10.35291], [-6.68164, 10.35074], [-6.63541, 10.66893], [-6.52974, 10.59104], [-6.42847, 10.5694], [-6.40646, 10.69922], [-6.325, 10.68624], [-6.24795, 10.74248], [-6.1731, 10.46983], [-6.18851, 10.24244], [-5.99478, 10.19694], [-5.78124, 10.43952], [-5.65135, 10.46767], [-5.51058, 10.43177], [-5.46643, 10.56074], [-5.47083, 10.75329], [-5.41579, 10.84628], [-5.49284, 11.07538], [-5.32994, 11.13371], [-5.32553, 11.21578], [-5.25949, 11.24816], [-5.25509, 11.36905], [-5.20665, 11.43811], [-5.22867, 11.60421], [-5.29251, 11.61715], [-5.26389, 11.75728], [-5.40258, 11.8327], [-5.26389, 11.84778], [-5.07897, 11.97918], [-4.72893, 12.01579], [-4.70692, 12.06746], [-4.62987, 12.06531], [-4.62546, 12.13204], [-4.54841, 12.1385], [-4.57703, 12.19875], [-4.41412, 12.31922], [-4.47356, 12.71252], [-4.238, 12.71467], [-4.21819, 12.95722], [-4.34477, 13.12927], [-3.96501, 13.49778], [-3.90558, 13.44375], [-3.96282, 13.38164], [-3.7911, 13.36665], [-3.54454, 13.1781], [-3.4313, 13.1588], [-3.43507, 13.27272], [-3.23599, 13.29035], [-3.28396, 13.5422], [-3.26407, 13.70699], [-2.88189, 13.64921], [-2.90831, 13.81174], [-2.84667, 14.05532], [-2.66175, 14.14713], [-2.47587, 14.29671], [-2.10223, 14.14878], [-1.9992, 14.19011], [-1.97945, 14.47709], [-1.68083, 14.50023], [-1.32166, 14.72774], [-1.05875, 14.7921], [-0.72004, 15.08655], [-0.24673, 15.07805], [0.06588, 14.96961], [0.23859, 15.00135], [0.72632, 14.95898], [0.96711, 14.98275], [1.31275, 15.27978], [3.01806, 15.34571], [3.03134, 15.42221], [3.50368, 15.35934], [4.19893, 16.39923], [4.21787, 17.00118], [4.26762, 17.00432], [4.26651, 19.14224], [3.36082, 18.9745], [3.12501, 19.1366], [3.24648, 19.81703], [1.20992, 20.73533], [1.15698, 21.12843], [-4.83423, 24.99935]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "MM", + iso1A3: "MMR", + iso1N3: "104", + wikidata: "Q836", + nameEn: "Myanmar", + aliases: ["Burma", "BU"], + groups: ["035", "142", "UN"], + callingCodes: ["95"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[92.62187, 21.87037], [92.59775, 21.6092], [92.68152, 21.28454], [92.60187, 21.24615], [92.55105, 21.3856], [92.43158, 21.37025], [92.37939, 21.47764], [92.20087, 21.337], [92.17752, 21.17445], [92.26071, 21.05697], [92.47409, 20.38654], [92.61042, 13.76986], [94.6371, 13.81803], [97.63455, 9.60854], [98.12555, 9.44056], [98.33094, 9.91973], [98.47298, 9.95782], [98.52291, 9.92389], [98.55174, 9.92804], [98.7391, 10.31488], [98.81944, 10.52761], [98.77275, 10.62548], [98.78511, 10.68351], [98.86819, 10.78336], [99.0069, 10.85485], [98.99701, 10.92962], [99.02337, 10.97217], [99.06938, 10.94857], [99.32756, 11.28545], [99.31573, 11.32081], [99.39485, 11.3925], [99.47598, 11.62434], [99.5672, 11.62732], [99.64108, 11.78948], [99.64891, 11.82699], [99.53424, 12.02317], [99.56445, 12.14805], [99.47519, 12.1353], [99.409, 12.60603], [99.29254, 12.68921], [99.18905, 12.84799], [99.18748, 12.9898], [99.10646, 13.05804], [99.12225, 13.19847], [99.20617, 13.20575], [99.16695, 13.72621], [98.97356, 14.04868], [98.56762, 14.37701], [98.24874, 14.83013], [98.18821, 15.13125], [98.22, 15.21327], [98.30446, 15.30667], [98.40522, 15.25268], [98.41906, 15.27103], [98.39351, 15.34177], [98.4866, 15.39154], [98.56027, 15.33471], [98.58598, 15.46821], [98.541, 15.65406], [98.59853, 15.87197], [98.57019, 16.04578], [98.69585, 16.13353], [98.8376, 16.11706], [98.92656, 16.36425], [98.84485, 16.42354], [98.68074, 16.27068], [98.63817, 16.47424], [98.57912, 16.55983], [98.5695, 16.62826], [98.51113, 16.64503], [98.51833, 16.676], [98.51472, 16.68521], [98.51579, 16.69433], [98.51043, 16.70107], [98.49713, 16.69022], [98.50253, 16.7139], [98.46994, 16.73613], [98.53833, 16.81934], [98.49603, 16.8446], [98.52624, 16.89979], [98.39441, 17.06266], [98.34566, 17.04822], [98.10439, 17.33847], [98.11185, 17.36829], [97.91829, 17.54504], [97.76407, 17.71595], [97.66794, 17.88005], [97.73723, 17.97912], [97.60841, 18.23846], [97.64116, 18.29778], [97.56219, 18.33885], [97.50383, 18.26844], [97.34522, 18.54596], [97.36444, 18.57138], [97.5258, 18.4939], [97.76752, 18.58097], [97.73836, 18.88478], [97.66487, 18.9371], [97.73654, 18.9812], [97.73797, 19.04261], [97.83479, 19.09972], [97.84024, 19.22217], [97.78606, 19.26769], [97.84186, 19.29526], [97.78769, 19.39429], [97.88423, 19.5041], [97.84715, 19.55782], [98.04364, 19.65755], [98.03314, 19.80941], [98.13829, 19.78541], [98.24884, 19.67876], [98.51182, 19.71303], [98.56065, 19.67807], [98.83661, 19.80931], [98.98679, 19.7419], [99.0735, 20.10298], [99.20328, 20.12877], [99.416, 20.08614], [99.52943, 20.14811], [99.5569, 20.20676], [99.46077, 20.36198], [99.46008, 20.39673], [99.68255, 20.32077], [99.81096, 20.33687], [99.86383, 20.44371], [99.88211, 20.44488], [99.88451, 20.44596], [99.89168, 20.44548], [99.89301, 20.44311], [99.89692, 20.44789], [99.90499, 20.4487], [99.91616, 20.44986], [99.95721, 20.46301], [100.08404, 20.36626], [100.1957, 20.68247], [100.36375, 20.82783], [100.51079, 20.82194], [100.60112, 20.8347], [100.64628, 20.88279], [100.50974, 20.88574], [100.55281, 21.02796], [100.63578, 21.05639], [100.72716, 21.31786], [100.80173, 21.2934], [101.00234, 21.39612], [101.16198, 21.52808], [101.15156, 21.56129], [101.11744, 21.77659], [100.87265, 21.67396], [100.72143, 21.51898], [100.57861, 21.45637], [100.4811, 21.46148], [100.42892, 21.54325], [100.35201, 21.53176], [100.25863, 21.47043], [100.18447, 21.51898], [100.1625, 21.48704], [100.12542, 21.50365], [100.10757, 21.59945], [100.17486, 21.65306], [100.12679, 21.70539], [100.04956, 21.66843], [99.98654, 21.71064], [99.94003, 21.82782], [99.99084, 21.97053], [99.96612, 22.05965], [99.85351, 22.04183], [99.47585, 22.13345], [99.33166, 22.09656], [99.1552, 22.15874], [99.19176, 22.16983], [99.17318, 22.18025], [99.28771, 22.4105], [99.37972, 22.50188], [99.38247, 22.57544], [99.31243, 22.73893], [99.45654, 22.85726], [99.43537, 22.94086], [99.54218, 22.90014], [99.52214, 23.08218], [99.34127, 23.13099], [99.25741, 23.09025], [99.04601, 23.12215], [99.05975, 23.16382], [98.88597, 23.18656], [98.92515, 23.29535], [98.93958, 23.31414], [98.87573, 23.33038], [98.92104, 23.36946], [98.87683, 23.48995], [98.82877, 23.47908], [98.80294, 23.5345], [98.88396, 23.59555], [98.81775, 23.694], [98.82933, 23.72921], [98.79607, 23.77947], [98.68209, 23.80492], [98.67797, 23.9644], [98.89632, 24.10612], [98.87998, 24.15624], [98.85319, 24.13042], [98.59256, 24.08371], [98.54476, 24.13119], [98.20666, 24.11406], [98.07806, 24.07988], [98.06703, 24.08028], [98.0607, 24.07812], [98.05671, 24.07961], [98.05302, 24.07408], [98.04709, 24.07616], [97.99583, 24.04932], [97.98691, 24.03897], [97.93951, 24.01953], [97.90998, 24.02094], [97.88616, 24.00463], [97.88414, 23.99405], [97.88814, 23.98605], [97.89683, 23.98389], [97.89676, 23.97931], [97.8955, 23.97758], [97.88811, 23.97446], [97.86545, 23.97723], [97.84328, 23.97603], [97.79416, 23.95663], [97.79456, 23.94836], [97.72302, 23.89288], [97.64667, 23.84574], [97.5247, 23.94032], [97.62363, 24.00506], [97.72903, 24.12606], [97.75305, 24.16902], [97.72799, 24.18883], [97.72998, 24.2302], [97.76799, 24.26365], [97.71941, 24.29652], [97.66723, 24.30027], [97.65624, 24.33781], [97.7098, 24.35658], [97.66998, 24.45288], [97.60029, 24.4401], [97.52757, 24.43748], [97.56286, 24.54535], [97.56525, 24.72838], [97.54675, 24.74202], [97.5542, 24.74943], [97.56383, 24.75535], [97.56648, 24.76475], [97.64354, 24.79171], [97.70181, 24.84557], [97.73127, 24.83015], [97.76481, 24.8289], [97.79949, 24.85655], [97.72903, 24.91332], [97.72216, 25.08508], [97.77023, 25.11492], [97.83614, 25.2715], [97.92541, 25.20815], [98.14925, 25.41547], [98.12591, 25.50722], [98.18084, 25.56298], [98.16848, 25.62739], [98.25774, 25.6051], [98.31268, 25.55307], [98.40606, 25.61129], [98.54064, 25.85129], [98.63128, 25.79937], [98.70818, 25.86241], [98.60763, 26.01512], [98.57085, 26.11547], [98.63128, 26.15492], [98.66884, 26.09165], [98.7329, 26.17218], [98.67797, 26.24487], [98.72741, 26.36183], [98.77547, 26.61994], [98.7333, 26.85615], [98.69582, 27.56499], [98.43353, 27.67086], [98.42529, 27.55404], [98.32641, 27.51385], [98.13964, 27.9478], [98.15337, 28.12114], [97.90069, 28.3776], [97.79632, 28.33168], [97.70705, 28.5056], [97.56835, 28.55628], [97.50518, 28.49716], [97.47085, 28.2688], [97.41729, 28.29783], [97.34547, 28.21385], [97.31292, 28.06784], [97.35412, 28.06663], [97.38845, 28.01329], [97.35824, 27.87256], [97.29919, 27.92233], [96.90112, 27.62149], [96.91431, 27.45752], [97.17422, 27.14052], [97.14675, 27.09041], [96.89132, 27.17474], [96.85287, 27.2065], [96.88445, 27.25046], [96.73888, 27.36638], [96.55761, 27.29928], [96.40779, 27.29818], [96.15591, 27.24572], [96.04949, 27.19428], [95.93002, 27.04149], [95.81603, 27.01335], [95.437, 26.7083], [95.30339, 26.65372], [95.23513, 26.68499], [95.05798, 26.45408], [95.12801, 26.38397], [95.11428, 26.1019], [95.18556, 26.07338], [94.80117, 25.49359], [94.68032, 25.47003], [94.57458, 25.20318], [94.74212, 25.13606], [94.73937, 25.00545], [94.60204, 24.70889], [94.5526, 24.70764], [94.50729, 24.59281], [94.45279, 24.56656], [94.32362, 24.27692], [94.30215, 24.23752], [94.14081, 23.83333], [93.92089, 23.95812], [93.80279, 23.92549], [93.75952, 24.0003], [93.62871, 24.00922], [93.50616, 23.94432], [93.46633, 23.97067], [93.41415, 24.07854], [93.34735, 24.10151], [93.32351, 24.04468], [93.36059, 23.93176], [93.3908, 23.92925], [93.3908, 23.7622], [93.43475, 23.68299], [93.38805, 23.4728], [93.39981, 23.38828], [93.38781, 23.36139], [93.36862, 23.35426], [93.38478, 23.13698], [93.2878, 23.00464], [93.12988, 23.05772], [93.134, 22.92498], [93.09417, 22.69459], [93.134, 22.59573], [93.11477, 22.54374], [93.13537, 22.45873], [93.18206, 22.43716], [93.19991, 22.25425], [93.14224, 22.24535], [93.15734, 22.18687], [93.04885, 22.20595], [92.99255, 22.05965], [92.99804, 21.98964], [92.93899, 22.02656], [92.89504, 21.95143], [92.86208, 22.05456], [92.70416, 22.16017], [92.67532, 22.03547], [92.60949, 21.97638], [92.62187, 21.87037]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "MN", + iso1A3: "MNG", + iso1N3: "496", + wikidata: "Q711", + nameEn: "Mongolia", + groups: ["030", "142", "UN"], + callingCodes: ["976"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[102.14032, 51.35566], [101.5044, 51.50467], [101.39085, 51.45753], [100.61116, 51.73028], [99.89203, 51.74903], [99.75578, 51.90108], [99.27888, 51.96876], [98.87768, 52.14563], [98.74142, 51.8637], [98.33222, 51.71832], [98.22053, 51.46579], [98.05257, 51.46696], [97.83305, 51.00248], [98.01472, 50.86652], [97.9693, 50.78044], [98.06393, 50.61262], [98.31373, 50.4996], [98.29481, 50.33561], [97.85197, 49.91339], [97.76871, 49.99861], [97.56432, 49.92801], [97.56811, 49.84265], [97.24639, 49.74737], [96.97388, 49.88413], [95.80056, 50.04239], [95.74757, 49.97915], [95.02465, 49.96941], [94.97166, 50.04725], [94.6121, 50.04239], [94.49477, 50.17832], [94.39258, 50.22193], [94.30823, 50.57498], [92.99595, 50.63183], [93.01109, 50.79001], [92.44714, 50.78762], [92.07173, 50.69585], [91.86048, 50.73734], [89.59711, 49.90851], [89.70687, 49.72535], [88.82499, 49.44808], [88.42449, 49.48821], [88.17223, 49.46934], [88.15543, 49.30314], [87.98977, 49.18147], [87.81333, 49.17354], [87.88171, 48.95853], [87.73822, 48.89582], [88.0788, 48.71436], [87.96361, 48.58478], [88.58939, 48.34531], [88.58316, 48.21893], [88.8011, 48.11302], [88.93186, 48.10263], [89.0711, 47.98528], [89.55453, 48.0423], [89.76624, 47.82745], [90.06512, 47.88177], [90.10871, 47.7375], [90.33598, 47.68303], [90.48854, 47.41826], [90.48542, 47.30438], [90.76108, 46.99399], [90.84035, 46.99525], [91.03649, 46.72916], [91.0147, 46.58171], [91.07696, 46.57315], [90.89639, 46.30711], [90.99672, 46.14207], [91.03026, 46.04194], [90.70907, 45.73437], [90.65114, 45.49314], [90.89169, 45.19667], [91.64048, 45.07408], [93.51161, 44.95964], [94.10003, 44.71016], [94.71959, 44.35284], [95.01191, 44.25274], [95.39772, 44.2805], [95.32891, 44.02407], [95.52594, 43.99353], [95.89543, 43.2528], [96.35658, 42.90363], [96.37926, 42.72055], [97.1777, 42.7964], [99.50671, 42.56535], [100.33297, 42.68231], [100.84979, 42.67087], [101.80515, 42.50074], [102.07645, 42.22519], [102.72403, 42.14675], [103.92804, 41.78246], [104.52258, 41.8706], [104.51667, 41.66113], [105.0123, 41.63188], [106.76517, 42.28741], [107.24774, 42.36107], [107.29755, 42.41395], [107.49681, 42.46221], [107.57258, 42.40898], [108.84489, 42.40246], [109.00679, 42.45302], [109.452, 42.44842], [109.89402, 42.63111], [110.08401, 42.6411], [110.4327, 42.78293], [111.0149, 43.3289], [111.59087, 43.51207], [111.79758, 43.6637], [111.93776, 43.68709], [111.96289, 43.81596], [111.40498, 44.3461], [111.76275, 44.98032], [111.98695, 45.09074], [112.4164, 45.06858], [112.74662, 44.86297], [113.70918, 44.72891], [114.5166, 45.27189], [114.54801, 45.38337], [114.74612, 45.43585], [114.94546, 45.37377], [115.60329, 45.44717], [116.16989, 45.68603], [116.27366, 45.78637], [116.24012, 45.8778], [116.26678, 45.96479], [116.58612, 46.30211], [116.75551, 46.33083], [116.83166, 46.38637], [117.36609, 46.36335], [117.41782, 46.57862], [117.60748, 46.59771], [117.69554, 46.50991], [118.30534, 46.73519], [118.78747, 46.68689], [118.8337, 46.77742], [118.89974, 46.77139], [118.92616, 46.72765], [119.00541, 46.74273], [119.10448, 46.65516], [119.24978, 46.64761], [119.32827, 46.61433], [119.42827, 46.63783], [119.65265, 46.62342], [119.68127, 46.59015], [119.77373, 46.62947], [119.80455, 46.67631], [119.89261, 46.66423], [119.91242, 46.90091], [119.85518, 46.92196], [119.71209, 47.19192], [119.62403, 47.24575], [119.56019, 47.24874], [119.54918, 47.29505], [119.31964, 47.42617], [119.35892, 47.48104], [119.13995, 47.53997], [119.12343, 47.66458], [118.7564, 47.76947], [118.55766, 47.99277], [118.29654, 48.00246], [118.22677, 48.03853], [118.11009, 48.04], [118.03676, 48.00982], [117.80196, 48.01661], [117.50181, 47.77216], [117.37875, 47.63627], [116.9723, 47.87285], [116.67405, 47.89039], [116.4465, 47.83662], [116.21879, 47.88505], [115.94296, 47.67741], [115.57128, 47.91988], [115.52082, 48.15367], [115.811, 48.25699], [115.78876, 48.51781], [116.06565, 48.81716], [116.03781, 48.87014], [116.71193, 49.83813], [116.62502, 49.92919], [116.22402, 50.04477], [115.73602, 49.87688], [115.26068, 49.97367], [114.9703, 50.19254], [114.325, 50.28098], [113.20216, 49.83356], [113.02647, 49.60772], [110.64493, 49.1816], [110.39891, 49.25083], [110.24373, 49.16676], [109.51325, 49.22859], [109.18017, 49.34709], [108.53969, 49.32325], [108.27937, 49.53167], [107.95387, 49.66659], [107.96116, 49.93191], [107.36407, 49.97612], [107.1174, 50.04239], [107.00007, 50.1977], [106.80326, 50.30177], [106.58373, 50.34044], [106.51122, 50.34408], [106.49628, 50.32436], [106.47156, 50.31909], [106.07865, 50.33474], [106.05562, 50.40582], [105.32528, 50.4648], [103.70343, 50.13952], [102.71178, 50.38873], [102.32194, 50.67982], [102.14032, 51.35566]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "MO", + iso1A3: "MAC", + iso1N3: "446", + wikidata: "Q14773", + nameEn: "Macau", + aliases: ["Macao"], + country: "CN", + groups: ["030", "142", "UN"], + driveSide: "left", + callingCodes: ["853"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[113.54942, 22.14519], [113.54839, 22.10909], [113.57191, 22.07696], [113.63011, 22.10782], [113.60504, 22.20464], [113.57123, 22.20416], [113.56865, 22.20973], [113.5508, 22.21672], [113.54333, 22.21688], [113.54093, 22.21314], [113.53593, 22.2137], [113.53301, 22.21235], [113.53552, 22.20607], [113.52659, 22.18271], [113.54093, 22.15497], [113.54942, 22.14519]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "MP", + iso1A3: "MNP", + iso1N3: "580", + wikidata: "Q16644", + nameEn: "Northern Mariana Islands", + aliases: ["US-MP"], + country: "US", + groups: ["Q1352230", "Q153732", "057", "009", "UN"], + roadSpeedUnit: "mph", + callingCodes: ["1 670"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[135.52896, 14.32623], [152.19114, 13.63487], [145.05972, 21.28731], [135.52896, 14.32623]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "MQ", + iso1A3: "MTQ", + iso1N3: "474", + wikidata: "Q17054", + nameEn: "Martinique", + country: "FR", + groups: ["Q3320166", "EU", "029", "003", "419", "019", "UN"], + callingCodes: ["596"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-59.95997, 14.20285], [-61.07821, 15.25109], [-61.69315, 14.26451], [-59.95997, 14.20285]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "MR", + iso1A3: "MRT", + iso1N3: "478", + wikidata: "Q1025", + nameEn: "Mauritania", + groups: ["011", "202", "002", "UN"], + callingCodes: ["222"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-5.60725, 16.49919], [-6.57191, 25.0002], [-4.83423, 24.99935], [-8.66674, 27.31569], [-8.66721, 25.99918], [-12.0002, 25.9986], [-12.00251, 23.4538], [-12.14969, 23.41935], [-12.36213, 23.3187], [-12.5741, 23.28975], [-13.00412, 23.02297], [-13.10753, 22.89493], [-13.15313, 22.75649], [-13.08438, 22.53866], [-13.01525, 21.33343], [-16.95474, 21.33997], [-16.99806, 21.12142], [-17.0357, 21.05368], [-17.0396, 20.9961], [-17.06781, 20.92697], [-17.0695, 20.85742], [-17.0471, 20.76408], [-17.15288, 16.07139], [-16.50854, 16.09032], [-16.48967, 16.0496], [-16.44814, 16.09753], [-16.4429, 16.20605], [-16.27016, 16.51565], [-15.6509, 16.50315], [-15.00557, 16.64997], [-14.32144, 16.61495], [-13.80075, 16.13961], [-13.43135, 16.09022], [-13.11029, 15.52116], [-12.23936, 14.76324], [-11.94903, 14.76143], [-11.70705, 15.51558], [-11.43483, 15.62339], [-10.90932, 15.11001], [-10.71721, 15.4223], [-9.40447, 15.4396], [-9.44673, 15.60553], [-9.33314, 15.7044], [-9.31106, 15.69412], [-9.32979, 15.50032], [-5.50165, 15.50061], [-5.33435, 16.33354], [-5.60725, 16.49919]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "MS", + iso1A3: "MSR", + iso1N3: "500", + wikidata: "Q13353", + nameEn: "Montserrat", + country: "GB", + groups: ["BOTS", "029", "003", "419", "019", "UN"], + driveSide: "left", + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["1 664"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-61.91508, 16.51165], [-62.1023, 16.97277], [-62.58307, 16.68909], [-61.91508, 16.51165]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "MT", + iso1A3: "MLT", + iso1N3: "470", + wikidata: "Q233", + nameEn: "Malta", + groups: ["EU", "039", "150", "UN"], + driveSide: "left", + callingCodes: ["356"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[15.70991, 35.79901], [14.07544, 36.41525], [13.27636, 35.20764], [15.70991, 35.79901]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "MU", + iso1A3: "MUS", + iso1N3: "480", + wikidata: "Q1027", + nameEn: "Mauritius", + groups: ["014", "202", "002", "UN"], + driveSide: "left", + callingCodes: ["230"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[56.09755, -9.55401], [57.50644, -31.92637], [68.4673, -19.15185], [56.09755, -9.55401]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "MV", + iso1A3: "MDV", + iso1N3: "462", + wikidata: "Q826", + nameEn: "Maldives", + groups: ["034", "142", "UN"], + driveSide: "left", + callingCodes: ["960"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[71.9161, 8.55531], [72.57428, -3.7623], [76.59015, 5.591], [71.9161, 8.55531]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "MW", + iso1A3: "MWI", + iso1N3: "454", + wikidata: "Q1020", + nameEn: "Malawi", + groups: ["014", "202", "002", "UN"], + driveSide: "left", + callingCodes: ["265"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[33.48052, -9.62442], [33.31581, -9.48554], [33.14925, -9.49322], [32.99397, -9.36712], [32.95389, -9.40138], [33.00476, -9.5133], [33.00256, -9.63053], [33.05485, -9.61316], [33.10163, -9.66525], [33.12144, -9.58929], [33.2095, -9.61099], [33.31517, -9.82364], [33.36581, -9.81063], [33.37902, -9.9104], [33.31297, -10.05133], [33.53863, -10.20148], [33.54797, -10.36077], [33.70675, -10.56896], [33.47636, -10.78465], [33.28022, -10.84428], [33.25998, -10.88862], [33.39697, -11.15296], [33.29267, -11.3789], [33.29267, -11.43536], [33.23663, -11.40637], [33.24252, -11.59302], [33.32692, -11.59248], [33.33937, -11.91252], [33.25998, -12.14242], [33.3705, -12.34931], [33.47636, -12.32498], [33.54485, -12.35996], [33.37517, -12.54085], [33.28177, -12.54692], [33.18837, -12.61377], [33.05917, -12.59554], [32.94397, -12.76868], [32.96733, -12.88251], [33.02181, -12.88707], [32.98289, -13.12671], [33.0078, -13.19492], [32.86113, -13.47292], [32.84176, -13.52794], [32.73683, -13.57682], [32.68436, -13.55769], [32.66468, -13.60019], [32.68654, -13.64268], [32.7828, -13.64805], [32.84528, -13.71576], [32.76962, -13.77224], [32.79015, -13.80755], [32.88985, -13.82956], [32.99042, -13.95689], [33.02977, -14.05022], [33.07568, -13.98447], [33.16749, -13.93992], [33.24249, -14.00019], [33.66677, -14.61306], [33.7247, -14.4989], [33.88503, -14.51652], [33.92898, -14.47929], [34.08588, -14.48893], [34.18733, -14.43823], [34.22355, -14.43607], [34.34453, -14.3985], [34.35843, -14.38652], [34.39277, -14.39467], [34.4192, -14.43191], [34.44641, -14.47746], [34.45053, -14.49873], [34.47628, -14.53363], [34.48932, -14.53646], [34.49636, -14.55091], [34.52366, -14.5667], [34.53962, -14.59776], [34.55112, -14.64494], [34.53516, -14.67782], [34.52057, -14.68263], [34.54503, -14.74672], [34.567, -14.77345], [34.61522, -14.99583], [34.57503, -15.30619], [34.43126, -15.44778], [34.44981, -15.60864], [34.25195, -15.90321], [34.43126, -16.04737], [34.40344, -16.20923], [35.04805, -16.83167], [35.13771, -16.81687], [35.17017, -16.93521], [35.04805, -17.00027], [35.0923, -17.13235], [35.3062, -17.1244], [35.27065, -16.93817], [35.30929, -16.82871], [35.27219, -16.69402], [35.14235, -16.56812], [35.25828, -16.4792], [35.30157, -16.2211], [35.43355, -16.11371], [35.52365, -16.15414], [35.70107, -16.10147], [35.80487, -16.03907], [35.85303, -15.41913], [35.78799, -15.17428], [35.91812, -14.89514], [35.87212, -14.89478], [35.86945, -14.67481], [35.5299, -14.27714], [35.47989, -14.15594], [34.86229, -13.48958], [34.60253, -13.48487], [34.37831, -12.17408], [34.46088, -12.0174], [34.70739, -12.15652], [34.82903, -12.04837], [34.57917, -11.87849], [34.64241, -11.57499], [34.96296, -11.57354], [34.91153, -11.39799], [34.79375, -11.32245], [34.63305, -11.11731], [34.61161, -11.01611], [34.67047, -10.93796], [34.65946, -10.6828], [34.57581, -10.56271], [34.51911, -10.12279], [34.54499, -10.0678], [34.03865, -9.49398], [33.95829, -9.54066], [33.9638, -9.62206], [33.93298, -9.71647], [33.76677, -9.58516], [33.48052, -9.62442]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "MX", + iso1A3: "MEX", + iso1N3: "484", + wikidata: "Q96", + nameEn: "Mexico", + groups: ["013", "003", "419", "019", "UN"], + callingCodes: ["52"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-117.1243, 32.53427], [-118.48109, 32.5991], [-120.12904, 18.41089], [-92.37213, 14.39277], [-92.2261, 14.53423], [-92.1454, 14.6804], [-92.18161, 14.84147], [-92.1423, 14.88647], [-92.1454, 14.98143], [-92.0621, 15.07406], [-92.20983, 15.26077], [-91.73182, 16.07371], [-90.44567, 16.07573], [-90.40499, 16.40524], [-90.61212, 16.49832], [-90.69064, 16.70697], [-91.04436, 16.92175], [-91.43809, 17.25373], [-90.99199, 17.25192], [-90.98678, 17.81655], [-89.14985, 17.81563], [-89.15105, 17.95104], [-89.03839, 18.0067], [-88.8716, 17.89535], [-88.71505, 18.0707], [-88.48242, 18.49164], [-88.3268, 18.49048], [-88.29909, 18.47591], [-88.26593, 18.47617], [-88.03238, 18.41778], [-88.03165, 18.16657], [-87.90671, 18.15213], [-87.87604, 18.18313], [-87.86657, 18.19971], [-87.85693, 18.18266], [-87.84815, 18.18511], [-86.92368, 17.61462], [-85.9092, 21.8218], [-96.92418, 25.97377], [-97.13927, 25.96583], [-97.35946, 25.92189], [-97.37332, 25.83854], [-97.42511, 25.83969], [-97.45669, 25.86874], [-97.49828, 25.89877], [-97.52025, 25.88518], [-97.66511, 26.01708], [-97.95155, 26.0625], [-97.97017, 26.05232], [-98.24603, 26.07191], [-98.27075, 26.09457], [-98.30491, 26.10475], [-98.35126, 26.15129], [-99.00546, 26.3925], [-99.03053, 26.41249], [-99.08477, 26.39849], [-99.53573, 27.30926], [-99.49744, 27.43746], [-99.482, 27.47128], [-99.48045, 27.49016], [-99.50208, 27.50021], [-99.52955, 27.49747], [-99.51478, 27.55836], [-99.55409, 27.61314], [-100.50029, 28.66117], [-100.51222, 28.70679], [-100.5075, 28.74066], [-100.52313, 28.75598], [-100.59809, 28.88197], [-100.63689, 28.90812], [-100.67294, 29.09744], [-100.79696, 29.24688], [-100.87982, 29.296], [-100.94056, 29.33371], [-100.94579, 29.34523], [-100.96725, 29.3477], [-101.01128, 29.36947], [-101.05686, 29.44738], [-101.47277, 29.7744], [-102.60596, 29.8192], [-103.15787, 28.93865], [-104.37752, 29.54255], [-104.39363, 29.55396], [-104.3969, 29.57105], [-104.5171, 29.64671], [-104.77674, 30.4236], [-106.00363, 31.39181], [-106.09025, 31.40569], [-106.20346, 31.46305], [-106.23711, 31.51262], [-106.24612, 31.54193], [-106.28084, 31.56173], [-106.30305, 31.62154], [-106.33419, 31.66303], [-106.34864, 31.69663], [-106.3718, 31.71165], [-106.38003, 31.73151], [-106.41773, 31.75196], [-106.43419, 31.75478], [-106.45244, 31.76523], [-106.46726, 31.75998], [-106.47298, 31.75054], [-106.48815, 31.74769], [-106.50111, 31.75714], [-106.50962, 31.76155], [-106.51251, 31.76922], [-106.52266, 31.77509], [-106.529, 31.784], [-108.20899, 31.78534], [-108.20979, 31.33316], [-111.07523, 31.33232], [-114.82011, 32.49609], [-114.79524, 32.55731], [-114.81141, 32.55543], [-114.80584, 32.62028], [-114.76736, 32.64094], [-114.71871, 32.71894], [-115.88053, 32.63624], [-117.1243, 32.53427]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "MY", + iso1A3: "MYS", + iso1N3: "458", + wikidata: "Q833", + nameEn: "Malaysia" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "MZ", + iso1A3: "MOZ", + iso1N3: "508", + wikidata: "Q1029", + nameEn: "Mozambique", + groups: ["014", "202", "002", "UN"], + driveSide: "left", + callingCodes: ["258"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[40.74206, -10.25691], [40.44265, -10.4618], [40.00295, -10.80255], [39.58249, -10.96043], [39.24395, -11.17433], [38.88996, -11.16978], [38.47258, -11.4199], [38.21598, -11.27289], [37.93618, -11.26228], [37.8388, -11.3123], [37.76614, -11.53352], [37.3936, -11.68949], [36.80309, -11.56836], [36.62068, -11.72884], [36.19094, -11.70008], [36.19094, -11.57593], [35.82767, -11.41081], [35.63599, -11.55927], [34.96296, -11.57354], [34.64241, -11.57499], [34.57917, -11.87849], [34.82903, -12.04837], [34.70739, -12.15652], [34.46088, -12.0174], [34.37831, -12.17408], [34.60253, -13.48487], [34.86229, -13.48958], [35.47989, -14.15594], [35.5299, -14.27714], [35.86945, -14.67481], [35.87212, -14.89478], [35.91812, -14.89514], [35.78799, -15.17428], [35.85303, -15.41913], [35.80487, -16.03907], [35.70107, -16.10147], [35.52365, -16.15414], [35.43355, -16.11371], [35.30157, -16.2211], [35.25828, -16.4792], [35.14235, -16.56812], [35.27219, -16.69402], [35.30929, -16.82871], [35.27065, -16.93817], [35.3062, -17.1244], [35.0923, -17.13235], [35.04805, -17.00027], [35.17017, -16.93521], [35.13771, -16.81687], [35.04805, -16.83167], [34.40344, -16.20923], [34.43126, -16.04737], [34.25195, -15.90321], [34.44981, -15.60864], [34.43126, -15.44778], [34.57503, -15.30619], [34.61522, -14.99583], [34.567, -14.77345], [34.54503, -14.74672], [34.52057, -14.68263], [34.53516, -14.67782], [34.55112, -14.64494], [34.53962, -14.59776], [34.52366, -14.5667], [34.49636, -14.55091], [34.48932, -14.53646], [34.47628, -14.53363], [34.45053, -14.49873], [34.44641, -14.47746], [34.4192, -14.43191], [34.39277, -14.39467], [34.35843, -14.38652], [34.34453, -14.3985], [34.22355, -14.43607], [34.18733, -14.43823], [34.08588, -14.48893], [33.92898, -14.47929], [33.88503, -14.51652], [33.7247, -14.4989], [33.66677, -14.61306], [33.24249, -14.00019], [30.22098, -14.99447], [30.41902, -15.62269], [30.42568, -15.9962], [30.91597, -15.99924], [30.97761, -16.05848], [31.13171, -15.98019], [31.30563, -16.01193], [31.42451, -16.15154], [31.67988, -16.19595], [31.90223, -16.34388], [31.91324, -16.41569], [32.02772, -16.43892], [32.28529, -16.43892], [32.42838, -16.4727], [32.71017, -16.59932], [32.69917, -16.66893], [32.78943, -16.70267], [32.97655, -16.70689], [32.91051, -16.89446], [32.84113, -16.92259], [32.96554, -17.11971], [33.00517, -17.30477], [33.0426, -17.3468], [32.96554, -17.48964], [32.98536, -17.55891], [33.0492, -17.60298], [32.94133, -17.99705], [33.03159, -18.35054], [33.02278, -18.4696], [32.88629, -18.51344], [32.88629, -18.58023], [32.95013, -18.69079], [32.9017, -18.7992], [32.82465, -18.77419], [32.70137, -18.84712], [32.73439, -18.92628], [32.69917, -18.94293], [32.72118, -19.02204], [32.84006, -19.0262], [32.87088, -19.09279], [32.85107, -19.29238], [32.77966, -19.36098], [32.78282, -19.47513], [32.84446, -19.48343], [32.84666, -19.68462], [32.95013, -19.67219], [33.06461, -19.77787], [33.01178, -20.02007], [32.93032, -20.03868], [32.85987, -20.16686], [32.85987, -20.27841], [32.66174, -20.56106], [32.55167, -20.56312], [32.48122, -20.63319], [32.51644, -20.91929], [32.37115, -21.133], [32.48236, -21.32873], [32.41234, -21.31246], [31.38336, -22.36919], [31.30611, -22.422], [31.55779, -23.176], [31.56539, -23.47268], [31.67942, -23.60858], [31.70223, -23.72695], [31.77445, -23.90082], [31.87707, -23.95293], [31.90368, -24.18892], [31.9835, -24.29983], [32.03196, -25.10785], [32.01676, -25.38117], [31.97875, -25.46356], [32.00631, -25.65044], [31.92649, -25.84216], [31.974, -25.95387], [32.00916, -25.999], [32.08599, -26.00978], [32.10435, -26.15656], [32.07352, -26.40185], [32.13409, -26.5317], [32.13315, -26.84345], [32.19409, -26.84032], [32.22302, -26.84136], [32.29584, -26.852], [32.35222, -26.86027], [34.51034, -26.91792], [42.99868, -12.65261], [40.74206, -10.25691]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "NA", + iso1A3: "NAM", + iso1N3: "516", + wikidata: "Q1030", + nameEn: "Namibia", + groups: ["018", "202", "002", "UN"], + driveSide: "left", + callingCodes: ["264"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[14.28743, -17.38814], [13.95896, -17.43141], [13.36212, -16.98048], [12.97145, -16.98567], [12.52111, -17.24495], [12.07076, -17.15165], [11.75063, -17.25013], [10.5065, -17.25284], [12.51595, -32.27486], [16.45332, -28.63117], [16.46592, -28.57126], [16.59922, -28.53246], [16.90446, -28.057], [17.15405, -28.08573], [17.4579, -28.68718], [18.99885, -28.89165], [19.99882, -28.42622], [19.99817, -24.76768], [19.99912, -21.99991], [20.99751, -22.00026], [20.99904, -18.31743], [21.45556, -18.31795], [23.0996, -18.00075], [23.29618, -17.99855], [23.61088, -18.4881], [24.19416, -18.01919], [24.40577, -17.95726], [24.57485, -18.07151], [24.6303, -17.9863], [24.71887, -17.9218], [24.73364, -17.89338], [24.95586, -17.79674], [25.05895, -17.84452], [25.16882, -17.78253], [25.26433, -17.79571], [25.00198, -17.58221], [24.70864, -17.49501], [24.5621, -17.52963], [24.38712, -17.46818], [24.32811, -17.49082], [24.23619, -17.47489], [23.47474, -17.62877], [21.42741, -18.02787], [21.14283, -17.94318], [18.84226, -17.80375], [18.39229, -17.38927], [14.28743, -17.38814]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "NC", + iso1A3: "NCL", + iso1N3: "540", + wikidata: "Q33788", + nameEn: "New Caledonia", + country: "FR", + groups: ["Q1451600", "054", "009", "UN"], + callingCodes: ["687"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[159.77159, -28.41151], [174.245, -23.1974], [156.73836, -14.50464], [159.77159, -28.41151]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "NE", + iso1A3: "NER", + iso1N3: "562", + wikidata: "Q1032", + nameEn: "Niger", + aliases: ["RN"], + groups: ["011", "202", "002", "UN"], + callingCodes: ["227"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[14.22918, 22.61719], [13.5631, 23.16574], [11.96886, 23.51735], [7.48273, 20.87258], [7.38361, 20.79165], [5.8153, 19.45101], [4.26651, 19.14224], [4.26762, 17.00432], [4.21787, 17.00118], [4.19893, 16.39923], [3.50368, 15.35934], [3.03134, 15.42221], [3.01806, 15.34571], [1.31275, 15.27978], [0.96711, 14.98275], [0.72632, 14.95898], [0.23859, 15.00135], [0.16936, 14.51654], [0.38051, 14.05575], [0.61924, 13.68491], [0.77377, 13.6866], [0.77637, 13.64442], [0.99514, 13.5668], [1.02813, 13.46635], [1.20088, 13.38951], [1.24429, 13.39373], [1.28509, 13.35488], [1.24516, 13.33968], [1.21217, 13.37853], [1.18873, 13.31771], [0.99253, 13.37515], [0.99167, 13.10727], [2.26349, 12.41915], [2.05785, 12.35539], [2.39723, 11.89473], [2.45824, 11.98672], [2.39657, 12.10952], [2.37783, 12.24804], [2.6593, 12.30631], [2.83978, 12.40585], [3.25352, 12.01467], [3.31613, 11.88495], [3.48187, 11.86092], [3.59375, 11.70269], [3.61075, 11.69181], [3.67988, 11.75429], [3.67122, 11.80865], [3.63063, 11.83042], [3.61955, 11.91847], [3.67775, 11.97599], [3.63136, 12.11826], [3.66364, 12.25884], [3.65111, 12.52223], [3.94339, 12.74979], [4.10006, 12.98862], [4.14367, 13.17189], [4.14186, 13.47586], [4.23456, 13.47725], [4.4668, 13.68286], [4.87425, 13.78], [4.9368, 13.7345], [5.07396, 13.75052], [5.21026, 13.73627], [5.27797, 13.75474], [5.35437, 13.83567], [5.52957, 13.8845], [6.15771, 13.64564], [6.27411, 13.67835], [6.43053, 13.6006], [6.69617, 13.34057], [6.94445, 12.99825], [7.0521, 13.00076], [7.12676, 13.02445], [7.22399, 13.1293], [7.39241, 13.09717], [7.81085, 13.34902], [8.07997, 13.30847], [8.25185, 13.20369], [8.41853, 13.06166], [8.49493, 13.07519], [8.60431, 13.01768], [8.64251, 12.93985], [8.97413, 12.83661], [9.65995, 12.80614], [10.00373, 13.18171], [10.19993, 13.27129], [10.46731, 13.28819], [10.66004, 13.36422], [11.4535, 13.37773], [11.88236, 13.2527], [12.04209, 13.14452], [12.16189, 13.10056], [12.19315, 13.12423], [12.47095, 13.06673], [12.58033, 13.27805], [12.6793, 13.29157], [12.87376, 13.48919], [13.05085, 13.53984], [13.19844, 13.52802], [13.33213, 13.71195], [13.6302, 13.71094], [13.47559, 14.40881], [13.48259, 14.46704], [13.68573, 14.55276], [13.67878, 14.64013], [13.809, 14.72915], [13.78991, 14.87519], [13.86301, 15.04043], [14.37425, 15.72591], [15.50373, 16.89649], [15.6032, 18.77402], [15.75098, 19.93002], [15.99632, 20.35364], [15.6721, 20.70069], [15.59841, 20.74039], [15.56004, 20.79488], [15.55382, 20.86507], [15.57248, 20.92138], [15.62515, 20.95395], [15.28332, 21.44557], [15.20213, 21.49365], [15.19692, 21.99339], [14.99751, 23.00539], [14.22918, 22.61719]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "NF", + iso1A3: "NFK", + iso1N3: "574", + wikidata: "Q31057", + nameEn: "Norfolk Island", + country: "AU", + groups: ["053", "009", "UN"], + driveSide: "left", + callingCodes: ["672 3"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[169.82316, -28.16667], [166.29505, -28.29175], [167.94076, -30.60745], [169.82316, -28.16667]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "NG", + iso1A3: "NGA", + iso1N3: "566", + wikidata: "Q1033", + nameEn: "Nigeria", + groups: ["011", "202", "002", "UN"], + callingCodes: ["234"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[6.15771, 13.64564], [5.52957, 13.8845], [5.35437, 13.83567], [5.27797, 13.75474], [5.21026, 13.73627], [5.07396, 13.75052], [4.9368, 13.7345], [4.87425, 13.78], [4.4668, 13.68286], [4.23456, 13.47725], [4.14186, 13.47586], [4.14367, 13.17189], [4.10006, 12.98862], [3.94339, 12.74979], [3.65111, 12.52223], [3.66364, 12.25884], [3.63136, 12.11826], [3.67775, 11.97599], [3.61955, 11.91847], [3.63063, 11.83042], [3.67122, 11.80865], [3.67988, 11.75429], [3.61075, 11.69181], [3.59375, 11.70269], [3.49175, 11.29765], [3.71505, 11.13015], [3.84243, 10.59316], [3.78292, 10.40538], [3.6844, 10.46351], [3.57275, 10.27185], [3.66908, 10.18136], [3.54429, 9.87739], [3.35383, 9.83641], [3.32099, 9.78032], [3.34726, 9.70696], [3.25093, 9.61632], [3.13928, 9.47167], [3.14147, 9.28375], [3.08017, 9.10006], [2.77907, 9.06924], [2.67523, 7.87825], [2.73095, 7.7755], [2.73405, 7.5423], [2.78668, 7.5116], [2.79442, 7.43486], [2.74489, 7.42565], [2.76965, 7.13543], [2.71702, 6.95722], [2.74024, 6.92802], [2.73405, 6.78508], [2.78823, 6.76356], [2.78204, 6.70514], [2.7325, 6.64057], [2.74334, 6.57291], [2.70464, 6.50831], [2.70566, 6.38038], [2.74181, 6.13349], [5.87055, 3.78489], [8.34397, 4.30689], [8.60302, 4.87353], [8.78027, 5.1243], [8.92029, 5.58403], [8.83687, 5.68483], [8.88156, 5.78857], [8.84209, 5.82562], [9.51757, 6.43874], [9.70674, 6.51717], [9.77824, 6.79088], [9.86314, 6.77756], [10.15135, 7.03781], [10.21466, 6.88996], [10.53639, 6.93432], [10.57214, 7.16345], [10.59746, 7.14719], [10.60789, 7.06885], [10.83727, 6.9358], [10.8179, 6.83377], [10.94302, 6.69325], [11.09644, 6.68437], [11.09495, 6.51717], [11.42041, 6.53789], [11.42264, 6.5882], [11.51499, 6.60892], [11.57755, 6.74059], [11.55818, 6.86186], [11.63117, 6.9905], [11.87396, 7.09398], [11.84864, 7.26098], [11.93205, 7.47812], [12.01844, 7.52981], [11.99908, 7.67302], [12.20909, 7.97553], [12.19271, 8.10826], [12.24782, 8.17904], [12.26123, 8.43696], [12.4489, 8.52536], [12.44146, 8.6152], [12.68722, 8.65938], [12.71701, 8.7595], [12.79, 8.75361], [12.81085, 8.91992], [12.90022, 9.11411], [12.91958, 9.33905], [12.85628, 9.36698], [13.02385, 9.49334], [13.22642, 9.57266], [13.25472, 9.76795], [13.29941, 9.8296], [13.25025, 9.86042], [13.24132, 9.91031], [13.27409, 9.93232], [13.286, 9.9822], [13.25323, 10.00127], [13.25025, 10.03647], [13.34111, 10.12299], [13.43644, 10.13326], [13.5705, 10.53183], [13.54964, 10.61236], [13.73434, 10.9255], [13.70753, 10.94451], [13.7403, 11.00593], [13.78945, 11.00154], [13.97489, 11.30258], [14.17821, 11.23831], [14.6124, 11.51283], [14.64591, 11.66166], [14.55207, 11.72001], [14.61612, 11.7798], [14.6474, 12.17466], [14.4843, 12.35223], [14.22215, 12.36533], [14.17523, 12.41916], [14.20204, 12.53405], [14.08251, 13.0797], [13.6302, 13.71094], [13.33213, 13.71195], [13.19844, 13.52802], [13.05085, 13.53984], [12.87376, 13.48919], [12.6793, 13.29157], [12.58033, 13.27805], [12.47095, 13.06673], [12.19315, 13.12423], [12.16189, 13.10056], [12.04209, 13.14452], [11.88236, 13.2527], [11.4535, 13.37773], [10.66004, 13.36422], [10.46731, 13.28819], [10.19993, 13.27129], [10.00373, 13.18171], [9.65995, 12.80614], [8.97413, 12.83661], [8.64251, 12.93985], [8.60431, 13.01768], [8.49493, 13.07519], [8.41853, 13.06166], [8.25185, 13.20369], [8.07997, 13.30847], [7.81085, 13.34902], [7.39241, 13.09717], [7.22399, 13.1293], [7.12676, 13.02445], [7.0521, 13.00076], [6.94445, 12.99825], [6.69617, 13.34057], [6.43053, 13.6006], [6.27411, 13.67835], [6.15771, 13.64564]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "NI", + iso1A3: "NIC", + iso1N3: "558", + wikidata: "Q811", + nameEn: "Nicaragua", + groups: ["013", "003", "419", "019", "UN"], + callingCodes: ["505"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-83.13724, 15.00002], [-83.49268, 15.01158], [-83.62101, 14.89448], [-83.89551, 14.76697], [-84.10584, 14.76353], [-84.48373, 14.63249], [-84.70119, 14.68078], [-84.82596, 14.82212], [-84.90082, 14.80489], [-85.1575, 14.53934], [-85.18602, 14.24929], [-85.32149, 14.2562], [-85.45762, 14.11304], [-85.73964, 13.9698], [-85.75477, 13.8499], [-86.03458, 13.99181], [-86.00685, 14.08474], [-86.14801, 14.04317], [-86.35219, 13.77157], [-86.76812, 13.79605], [-86.71267, 13.30348], [-86.87066, 13.30641], [-86.93383, 13.18677], [-86.93197, 13.05313], [-87.03785, 12.98682], [-87.06306, 13.00892], [-87.37107, 12.98646], [-87.55124, 13.12523], [-87.7346, 13.13228], [-88.11443, 12.63306], [-86.14524, 11.09059], [-85.71223, 11.06868], [-85.60529, 11.22607], [-84.92439, 10.9497], [-84.68197, 11.07568], [-83.90838, 10.71161], [-83.66597, 10.79916], [-83.68276, 11.01562], [-82.56142, 11.91792], [-82.06974, 14.49418], [-83.04763, 15.03256], [-83.13724, 15.00002]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "NL", + iso1A3: "NLD", + iso1N3: "528", + wikidata: "Q29999", + nameEn: "Kingdom of the Netherlands" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "NO", + iso1A3: "NOR", + iso1N3: "578", + wikidata: "Q20", + nameEn: "Norway" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "NP", + iso1A3: "NPL", + iso1N3: "524", + wikidata: "Q837", + nameEn: "Nepal", + groups: ["034", "142", "UN"], + driveSide: "left", + callingCodes: ["977"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[88.13378, 27.88015], [87.82681, 27.95248], [87.72718, 27.80938], [87.56996, 27.84517], [87.11696, 27.84104], [87.03757, 27.94835], [86.75582, 28.04182], [86.74181, 28.10638], [86.56265, 28.09569], [86.51609, 27.96623], [86.42736, 27.91122], [86.22966, 27.9786], [86.18607, 28.17364], [86.088, 28.09264], [86.08333, 28.02121], [86.12069, 27.93047], [86.06309, 27.90021], [85.94946, 27.9401], [85.97813, 27.99023], [85.90743, 28.05144], [85.84672, 28.18187], [85.74864, 28.23126], [85.71907, 28.38064], [85.69105, 28.38475], [85.60854, 28.25045], [85.59765, 28.30529], [85.4233, 28.32996], [85.38127, 28.28336], [85.10729, 28.34092], [85.18668, 28.54076], [85.19135, 28.62825], [85.06059, 28.68562], [84.85511, 28.58041], [84.62317, 28.73887], [84.47528, 28.74023], [84.2231, 28.89571], [84.24801, 29.02783], [84.18107, 29.23451], [83.97559, 29.33091], [83.82303, 29.30513], [83.63156, 29.16249], [83.44787, 29.30513], [83.28131, 29.56813], [83.07116, 29.61957], [82.73024, 29.81695], [82.5341, 29.9735], [82.38622, 30.02608], [82.16984, 30.0692], [82.19475, 30.16884], [82.10757, 30.23745], [82.10135, 30.35439], [81.99082, 30.33423], [81.62033, 30.44703], [81.5459, 30.37688], [81.41018, 30.42153], [81.39928, 30.21862], [81.33355, 30.15303], [81.2623, 30.14596], [81.29032, 30.08806], [81.24362, 30.0126], [81.12842, 30.01395], [81.03953, 30.20059], [80.92547, 30.17193], [80.91143, 30.22173], [80.86673, 30.17321], [80.8778, 30.13384], [80.67076, 29.95732], [80.60226, 29.95732], [80.57179, 29.91422], [80.56247, 29.86661], [80.48997, 29.79566], [80.43458, 29.80466], [80.41554, 29.79451], [80.36803, 29.73865], [80.38428, 29.68513], [80.41858, 29.63581], [80.37939, 29.57098], [80.24322, 29.44299], [80.31428, 29.30784], [80.28626, 29.20327], [80.24112, 29.21414], [80.26602, 29.13938], [80.23178, 29.11626], [80.18085, 29.13649], [80.05743, 28.91479], [80.06957, 28.82763], [80.12125, 28.82346], [80.37188, 28.63371], [80.44504, 28.63098], [80.52443, 28.54897], [80.50575, 28.6706], [80.55142, 28.69182], [81.03471, 28.40054], [81.19847, 28.36284], [81.32923, 28.13521], [81.38683, 28.17638], [81.48179, 28.12148], [81.47867, 28.08303], [81.91223, 27.84995], [81.97214, 27.93322], [82.06554, 27.92222], [82.46405, 27.6716], [82.70378, 27.72122], [82.74119, 27.49838], [82.93261, 27.50328], [82.94938, 27.46036], [83.19413, 27.45632], [83.27197, 27.38309], [83.2673, 27.36235], [83.29999, 27.32778], [83.35136, 27.33885], [83.38872, 27.39276], [83.39495, 27.4798], [83.61288, 27.47013], [83.85595, 27.35797], [83.86182, 27.4241], [83.93306, 27.44939], [84.02229, 27.43836], [84.10791, 27.52399], [84.21376, 27.45218], [84.25735, 27.44941], [84.29315, 27.39], [84.62161, 27.33885], [84.69166, 27.21294], [84.64496, 27.04669], [84.793, 26.9968], [84.82913, 27.01989], [84.85754, 26.98984], [84.96687, 26.95599], [84.97186, 26.9149], [85.00536, 26.89523], [85.05592, 26.88991], [85.02635, 26.85381], [85.15883, 26.86966], [85.19291, 26.86909], [85.18046, 26.80519], [85.21159, 26.75933], [85.34302, 26.74954], [85.47752, 26.79292], [85.56471, 26.84133], [85.5757, 26.85955], [85.59461, 26.85161], [85.61621, 26.86721], [85.66239, 26.84822], [85.73483, 26.79613], [85.72315, 26.67471], [85.76907, 26.63076], [85.83126, 26.61134], [85.85126, 26.60866], [85.8492, 26.56667], [86.02729, 26.66756], [86.13596, 26.60651], [86.22513, 26.58863], [86.26235, 26.61886], [86.31564, 26.61925], [86.49726, 26.54218], [86.54258, 26.53819], [86.57073, 26.49825], [86.61313, 26.48658], [86.62686, 26.46891], [86.69124, 26.45169], [86.74025, 26.42386], [86.76797, 26.45892], [86.82898, 26.43919], [86.94543, 26.52076], [86.95912, 26.52076], [87.01559, 26.53228], [87.04691, 26.58685], [87.0707, 26.58571], [87.09147, 26.45039], [87.14751, 26.40542], [87.18863, 26.40558], [87.24682, 26.4143], [87.26587, 26.40592], [87.26568, 26.37294], [87.34568, 26.34787], [87.37314, 26.40815], [87.46566, 26.44058], [87.51571, 26.43106], [87.55274, 26.40596], [87.59175, 26.38342], [87.66803, 26.40294], [87.67893, 26.43501], [87.76004, 26.40711], [87.7918, 26.46737], [87.84193, 26.43663], [87.89085, 26.48565], [87.90115, 26.44923], [88.00895, 26.36029], [88.09414, 26.43732], [88.09963, 26.54195], [88.16452, 26.64111], [88.1659, 26.68177], [88.19107, 26.75516], [88.12302, 26.95324], [88.13422, 26.98705], [88.11719, 26.98758], [87.9887, 27.11045], [88.01587, 27.21388], [88.01646, 27.21612], [88.07277, 27.43007], [88.04008, 27.49223], [88.19107, 27.79285], [88.1973, 27.85067], [88.13378, 27.88015]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "NR", + iso1A3: "NRU", + iso1N3: "520", + wikidata: "Q697", + nameEn: "Nauru", + groups: ["057", "009", "UN"], + driveSide: "left", + callingCodes: ["674"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[166.95155, 0.14829], [166.21778, -0.7977], [167.60042, -0.88259], [166.95155, 0.14829]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "NU", + iso1A3: "NIU", + iso1N3: "570", + wikidata: "Q34020", + nameEn: "Niue", + country: "NZ", + groups: ["061", "009", "UN"], + driveSide: "left", + callingCodes: ["683"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-170.83899, -18.53439], [-170.82274, -20.44429], [-168.63096, -18.60489], [-170.83899, -18.53439]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "NZ", + iso1A3: "NZL", + iso1N3: "554", + wikidata: "Q664", + nameEn: "New Zealand" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "OM", + iso1A3: "OMN", + iso1N3: "512", + wikidata: "Q842", + nameEn: "Oman", + groups: ["145", "142", "UN"], + callingCodes: ["968"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[56.82555, 25.7713], [56.79239, 26.41236], [56.68954, 26.76645], [56.2644, 26.58649], [55.81777, 26.18798], [56.08666, 26.05038], [56.15498, 26.06828], [56.19334, 25.9795], [56.13963, 25.82765], [56.17416, 25.77239], [56.13579, 25.73524], [56.14826, 25.66351], [56.18363, 25.65508], [56.20473, 25.61119], [56.25365, 25.60211], [56.26636, 25.60643], [56.25341, 25.61443], [56.26534, 25.62825], [56.82555, 25.7713]]], [[[56.26062, 25.33108], [56.23362, 25.31253], [56.25008, 25.28843], [56.24465, 25.27505], [56.20838, 25.25668], [56.20872, 25.24104], [56.24341, 25.22867], [56.27628, 25.23404], [56.34438, 25.26653], [56.35172, 25.30681], [56.3111, 25.30107], [56.3005, 25.31815], [56.26062, 25.33108]], [[56.28423, 25.26344], [56.27086, 25.26128], [56.2716, 25.27916], [56.28102, 25.28486], [56.29379, 25.2754], [56.28423, 25.26344]]], [[[61.45114, 22.55394], [56.86325, 25.03856], [56.3227, 24.97284], [56.34873, 24.93205], [56.30269, 24.88334], [56.20568, 24.85063], [56.20062, 24.78565], [56.13684, 24.73699], [56.06128, 24.74457], [56.03535, 24.81161], [55.97836, 24.87673], [55.97467, 24.89639], [56.05106, 24.87461], [56.05715, 24.95727], [55.96316, 25.00857], [55.90849, 24.96771], [55.85094, 24.96858], [55.81116, 24.9116], [55.81348, 24.80102], [55.83408, 24.77858], [55.83271, 24.68567], [55.76461, 24.5287], [55.83271, 24.41521], [55.83395, 24.32776], [55.80747, 24.31069], [55.79145, 24.27914], [55.76781, 24.26209], [55.75939, 24.26114], [55.75382, 24.2466], [55.75257, 24.23466], [55.76558, 24.23227], [55.77658, 24.23476], [55.83367, 24.20193], [55.95472, 24.2172], [56.01799, 24.07426], [55.8308, 24.01633], [55.73301, 24.05994], [55.48677, 23.94946], [55.57358, 23.669], [55.22634, 23.10378], [55.2137, 22.71065], [55.66469, 21.99658], [54.99756, 20.00083], [52.00311, 19.00083], [52.78009, 17.35124], [52.74267, 17.29519], [52.81185, 17.28568], [57.49095, 8.14549], [61.45114, 22.55394]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "PA", + iso1A3: "PAN", + iso1N3: "591", + wikidata: "Q804", + nameEn: "Panama", + groups: ["013", "003", "419", "019", "UN"], + callingCodes: ["507"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-77.32389, 8.81247], [-77.58292, 9.22278], [-78.79327, 9.93766], [-82.51044, 9.65379], [-82.56507, 9.57279], [-82.61345, 9.49881], [-82.66667, 9.49746], [-82.77206, 9.59573], [-82.87919, 9.62645], [-82.84871, 9.4973], [-82.93516, 9.46741], [-82.93516, 9.07687], [-82.72126, 8.97125], [-82.88253, 8.83331], [-82.91377, 8.774], [-82.92068, 8.74832], [-82.8794, 8.6981], [-82.82739, 8.60153], [-82.83975, 8.54755], [-82.83322, 8.52464], [-82.8382, 8.48117], [-82.8679, 8.44042], [-82.93056, 8.43465], [-83.05209, 8.33394], [-82.9388, 8.26634], [-82.88641, 8.10219], [-82.89137, 8.05755], [-82.89978, 8.04083], [-82.94503, 7.93865], [-82.13751, 6.97312], [-78.06168, 7.07793], [-77.89178, 7.22681], [-77.81426, 7.48319], [-77.72157, 7.47612], [-77.72514, 7.72348], [-77.57185, 7.51147], [-77.17257, 7.97422], [-77.45064, 8.49991], [-77.32389, 8.81247]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "PE", + iso1A3: "PER", + iso1N3: "604", + wikidata: "Q419", + nameEn: "Peru", + groups: ["005", "419", "019", "UN"], + callingCodes: ["51"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-74.26675, -0.97229], [-74.42701, -0.50218], [-75.18513, -0.0308], [-75.25764, -0.11943], [-75.40192, -0.17196], [-75.61997, -0.10012], [-75.60169, -0.18708], [-75.53615, -0.19213], [-75.22862, -0.60048], [-75.22862, -0.95588], [-75.3872, -0.9374], [-75.57429, -1.55961], [-76.05203, -2.12179], [-76.6324, -2.58397], [-77.94147, -3.05454], [-78.19369, -3.36431], [-78.14324, -3.47653], [-78.22642, -3.51113], [-78.24589, -3.39907], [-78.34362, -3.38633], [-78.68394, -4.60754], [-78.85149, -4.66795], [-79.01659, -5.01481], [-79.1162, -4.97774], [-79.26248, -4.95167], [-79.59402, -4.46848], [-79.79722, -4.47558], [-80.13945, -4.29786], [-80.39256, -4.48269], [-80.46386, -4.41516], [-80.32114, -4.21323], [-80.45023, -4.20938], [-80.4822, -4.05477], [-80.46386, -4.01342], [-80.13232, -3.90317], [-80.19926, -3.68894], [-80.18741, -3.63994], [-80.19848, -3.59249], [-80.21642, -3.5888], [-80.20535, -3.51667], [-80.22629, -3.501], [-80.23651, -3.48652], [-80.24586, -3.48677], [-80.24123, -3.46124], [-80.20647, -3.431], [-80.30602, -3.39149], [-84.52388, -3.36941], [-85.71054, -21.15413], [-70.59118, -18.35072], [-70.378, -18.3495], [-70.31267, -18.31258], [-70.16394, -18.31737], [-69.96732, -18.25992], [-69.81607, -18.12582], [-69.75305, -17.94605], [-69.82868, -17.72048], [-69.79087, -17.65563], [-69.66483, -17.65083], [-69.46897, -17.4988], [-69.46863, -17.37466], [-69.62883, -17.28142], [-69.16896, -16.72233], [-69.00853, -16.66769], [-69.04027, -16.57214], [-68.98358, -16.42165], [-68.79464, -16.33272], [-68.96238, -16.194], [-69.09986, -16.22693], [-69.20291, -16.16668], [-69.40336, -15.61358], [-69.14856, -15.23478], [-69.36254, -14.94634], [-68.88135, -14.18639], [-69.05265, -13.68546], [-68.8864, -13.40792], [-68.85615, -12.87769], [-68.65044, -12.50689], [-68.98115, -11.8979], [-69.57156, -10.94555], [-69.57835, -10.94051], [-69.90896, -10.92744], [-70.38791, -11.07096], [-70.51395, -10.92249], [-70.64134, -11.0108], [-70.62487, -9.80666], [-70.55429, -9.76692], [-70.58453, -9.58303], [-70.53373, -9.42628], [-71.23394, -9.9668], [-72.14742, -9.98049], [-72.31883, -9.5184], [-72.72216, -9.41397], [-73.21498, -9.40904], [-72.92886, -9.04074], [-73.76576, -7.89884], [-73.65485, -7.77897], [-73.96938, -7.58465], [-73.77011, -7.28944], [-73.73986, -6.87919], [-73.12983, -6.43852], [-73.24579, -6.05764], [-72.83973, -5.14765], [-72.64391, -5.0391], [-71.87003, -4.51661], [-70.96814, -4.36915], [-70.77601, -4.15717], [-70.33236, -4.15214], [-70.19582, -4.3607], [-70.11305, -4.27281], [-70.00888, -4.37833], [-69.94708, -4.2431], [-70.3374, -3.79505], [-70.52393, -3.87553], [-70.71396, -3.7921], [-70.04609, -2.73906], [-70.94377, -2.23142], [-71.75223, -2.15058], [-72.92587, -2.44514], [-73.65312, -1.26222], [-74.26675, -0.97229]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "PF", + iso1A3: "PYF", + iso1N3: "258", + wikidata: "Q30971", + nameEn: "French Polynesia", + country: "FR", + groups: ["Q1451600", "061", "009", "UN"], + callingCodes: ["689"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-135.59706, -4.70473], [-156.48634, -15.52824], [-156.45576, -31.75456], [-133.59543, -28.4709], [-135.59706, -4.70473]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "PG", + iso1A3: "PNG", + iso1N3: "598", + wikidata: "Q691", + nameEn: "Papua New Guinea", + groups: ["054", "009", "UN"], + driveSide: "left", + callingCodes: ["675"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[141.03157, 2.12829], [140.99813, -6.3233], [140.85295, -6.72996], [140.90448, -6.85033], [141.01763, -6.90181], [141.01842, -9.35091], [141.88934, -9.36111], [142.19246, -9.15378], [142.48658, -9.36754], [143.29772, -9.33993], [143.87386, -9.02382], [145.2855, -9.62524], [156.73836, -14.50464], [154.74815, -7.33315], [155.60735, -6.92266], [155.69784, -6.92661], [155.92557, -6.84664], [156.03993, -6.65703], [156.03296, -6.55528], [160.43769, -4.17974], [141.03157, 2.12829]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "PH", + iso1A3: "PHL", + iso1N3: "608", + wikidata: "Q928", + nameEn: "Philippines", + aliases: ["PI", "RP"], + groups: ["035", "142", "UN"], + callingCodes: ["63"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[129.19694, 7.84182], [121.8109, 21.77688], [120.69238, 21.52331], [118.82252, 14.67191], [115.39742, 10.92666], [116.79524, 7.43869], [117.17735, 7.52841], [117.93857, 6.89845], [117.98544, 6.27477], [119.52945, 5.35672], [118.93936, 4.09009], [118.06469, 4.16638], [121.14448, 2.12444], [129.19694, 7.84182]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "PK", + iso1A3: "PAK", + iso1N3: "586", + wikidata: "Q843", + nameEn: "Pakistan", + groups: ["034", "142", "UN"], + driveSide: "left", + callingCodes: ["92"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[75.72737, 36.7529], [75.45562, 36.71971], [75.40481, 36.95382], [75.13839, 37.02622], [74.56453, 37.03023], [74.53739, 36.96224], [74.43389, 37.00977], [74.04856, 36.82648], [73.82685, 36.91421], [72.6323, 36.84601], [72.18135, 36.71838], [71.80267, 36.49924], [71.60491, 36.39429], [71.19505, 36.04134], [71.37969, 35.95865], [71.55273, 35.71483], [71.49917, 35.6267], [71.65435, 35.4479], [71.54294, 35.31037], [71.5541, 35.28776], [71.67495, 35.21262], [71.52938, 35.09023], [71.55273, 35.02615], [71.49917, 35.00478], [71.50329, 34.97328], [71.29472, 34.87728], [71.28356, 34.80882], [71.08718, 34.69034], [71.11602, 34.63047], [71.0089, 34.54568], [71.02401, 34.44835], [71.17662, 34.36769], [71.12815, 34.26619], [71.13078, 34.16503], [71.09453, 34.13524], [71.09307, 34.11961], [71.06933, 34.10564], [71.07345, 34.06242], [70.88119, 33.97933], [70.54336, 33.9463], [69.90203, 34.04194], [69.87307, 33.9689], [69.85671, 33.93719], [70.00503, 33.73528], [70.14236, 33.71701], [70.14785, 33.6553], [70.20141, 33.64387], [70.17062, 33.53535], [70.32775, 33.34496], [70.13686, 33.21064], [70.07369, 33.22557], [70.02563, 33.14282], [69.85259, 33.09451], [69.79766, 33.13247], [69.71526, 33.09911], [69.57656, 33.09911], [69.49004, 33.01509], [69.49854, 32.88843], [69.5436, 32.8768], [69.47082, 32.85834], [69.38018, 32.76601], [69.43649, 32.7302], [69.44747, 32.6678], [69.38155, 32.56601], [69.2868, 32.53938], [69.23599, 32.45946], [69.27932, 32.29119], [69.27032, 32.14141], [69.3225, 31.93186], [69.20577, 31.85957], [69.11514, 31.70782], [69.00939, 31.62249], [68.95995, 31.64822], [68.91078, 31.59687], [68.79997, 31.61665], [68.6956, 31.75687], [68.57475, 31.83158], [68.44222, 31.76446], [68.27605, 31.75863], [68.25614, 31.80357], [68.1655, 31.82691], [68.00071, 31.6564], [67.86887, 31.63536], [67.72056, 31.52304], [67.58323, 31.52772], [67.62374, 31.40473], [67.7748, 31.4188], [67.78854, 31.33203], [67.29964, 31.19586], [67.03323, 31.24519], [67.04147, 31.31561], [66.83273, 31.26867], [66.72561, 31.20526], [66.68166, 31.07597], [66.58175, 30.97532], [66.42645, 30.95309], [66.39194, 30.9408], [66.28413, 30.57001], [66.34869, 30.404], [66.23609, 30.06321], [66.36042, 29.9583], [66.24175, 29.85181], [65.04005, 29.53957], [64.62116, 29.58903], [64.19796, 29.50407], [64.12966, 29.39157], [63.5876, 29.50456], [62.47751, 29.40782], [60.87231, 29.86514], [61.31508, 29.38903], [61.53765, 29.00507], [61.65978, 28.77937], [61.93581, 28.55284], [62.40259, 28.42703], [62.59499, 28.24842], [62.79412, 28.28108], [62.7638, 28.02992], [62.84905, 27.47627], [62.79684, 27.34381], [62.80604, 27.22412], [63.19649, 27.25674], [63.32283, 27.14437], [63.25005, 27.08692], [63.25005, 26.84212], [63.18688, 26.83844], [63.1889, 26.65072], [62.77352, 26.64099], [62.31484, 26.528], [62.21304, 26.26601], [62.05117, 26.31647], [61.89391, 26.26251], [61.83831, 26.07249], [61.83968, 25.7538], [61.683, 25.66638], [61.6433, 25.27541], [61.46682, 24.57869], [68.11329, 23.53945], [68.20763, 23.85849], [68.39339, 23.96838], [68.74643, 23.97027], [68.7416, 24.31904], [68.90914, 24.33156], [68.97781, 24.26021], [69.07806, 24.29777], [69.19341, 24.25646], [69.29778, 24.28712], [69.59579, 24.29777], [69.73335, 24.17007], [70.03428, 24.172], [70.11712, 24.30915], [70.5667, 24.43787], [70.57906, 24.27774], [70.71502, 24.23517], [70.88393, 24.27398], [70.85784, 24.30903], [70.94985, 24.3791], [71.04461, 24.34657], [71.12838, 24.42662], [71.00341, 24.46038], [70.97594, 24.60904], [71.09405, 24.69017], [70.94002, 24.92843], [70.89148, 25.15064], [70.66695, 25.39314], [70.67382, 25.68186], [70.60378, 25.71898], [70.53649, 25.68928], [70.37444, 25.67443], [70.2687, 25.71156], [70.0985, 25.93238], [70.08193, 26.08094], [70.17532, 26.24118], [70.17532, 26.55362], [70.05584, 26.60398], [69.88555, 26.56836], [69.50904, 26.74892], [69.58519, 27.18109], [70.03136, 27.56627], [70.12502, 27.8057], [70.37307, 28.01208], [70.60927, 28.02178], [70.79054, 27.68423], [71.89921, 27.96035], [71.9244, 28.11555], [72.20329, 28.3869], [72.29495, 28.66367], [72.40402, 28.78283], [72.94272, 29.02487], [73.01337, 29.16422], [73.05886, 29.1878], [73.28094, 29.56646], [73.3962, 29.94707], [73.58665, 30.01848], [73.80299, 30.06969], [73.97225, 30.19829], [73.95736, 30.28466], [73.88993, 30.36305], [74.5616, 31.04153], [74.67971, 31.05479], [74.6852, 31.12771], [74.60006, 31.13711], [74.60281, 31.10419], [74.56023, 31.08303], [74.51629, 31.13829], [74.53223, 31.30321], [74.59773, 31.4136], [74.64713, 31.45605], [74.59319, 31.50197], [74.61517, 31.55698], [74.57498, 31.60382], [74.47771, 31.72227], [74.58907, 31.87824], [74.79919, 31.95983], [74.86236, 32.04485], [74.9269, 32.0658], [75.00793, 32.03786], [75.25649, 32.10187], [75.38046, 32.26836], [75.28259, 32.36556], [75.03265, 32.49538], [74.97634, 32.45367], [74.84725, 32.49075], [74.68362, 32.49298], [74.67431, 32.56676], [74.65251, 32.56416], [74.64424, 32.60985], [74.69542, 32.66792], [74.65345, 32.71225], [74.7113, 32.84219], [74.64675, 32.82604], [74.6289, 32.75561], [74.45312, 32.77755], [74.41467, 32.90563], [74.31227, 32.92795], [74.34875, 32.97823], [74.31854, 33.02891], [74.17571, 33.07495], [74.15374, 33.13477], [74.02144, 33.18908], [74.01366, 33.25199], [74.08782, 33.26232], [74.17983, 33.3679], [74.18121, 33.4745], [74.10115, 33.56392], [74.03576, 33.56718], [73.97367, 33.64061], [73.98968, 33.66155], [73.96423, 33.73071], [74.00891, 33.75437], [74.05898, 33.82089], [74.14001, 33.83002], [74.26086, 33.92237], [74.25262, 34.01577], [74.21554, 34.03853], [73.91341, 34.01235], [73.88732, 34.05105], [73.90677, 34.10504], [73.98208, 34.2522], [73.90517, 34.35317], [73.8475, 34.32935], [73.74862, 34.34183], [73.74999, 34.3781], [73.88732, 34.48911], [73.89419, 34.54568], [73.93951, 34.57169], [73.93401, 34.63386], [73.96423, 34.68244], [74.12897, 34.70073], [74.31239, 34.79626], [74.58083, 34.77386], [74.6663, 34.703], [75.01479, 34.64629], [75.38009, 34.55021], [75.75438, 34.51827], [76.04614, 34.67566], [76.15463, 34.6429], [76.47186, 34.78965], [76.67648, 34.76371], [76.74377, 34.84039], [76.74514, 34.92488], [76.87193, 34.96906], [76.99251, 34.93349], [77.11796, 35.05419], [76.93465, 35.39866], [76.85088, 35.39754], [76.75475, 35.52617], [76.77323, 35.66062], [76.50961, 35.8908], [76.33453, 35.84296], [76.14913, 35.82848], [76.15325, 35.9264], [75.93028, 36.13136], [76.00906, 36.17511], [76.0324, 36.41198], [75.92391, 36.56986], [75.72737, 36.7529]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "PL", + iso1A3: "POL", + iso1N3: "616", + wikidata: "Q36", + nameEn: "Poland", + groups: ["EU", "151", "150", "UN"], + callingCodes: ["48"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[18.57853, 55.25302], [14.20811, 54.12784], [14.22634, 53.9291], [14.20647, 53.91671], [14.18544, 53.91258], [14.20823, 53.90776], [14.21323, 53.8664], [14.27249, 53.74464], [14.26782, 53.69866], [14.2836, 53.67721], [14.27133, 53.66613], [14.28477, 53.65955], [14.2853, 53.63392], [14.31904, 53.61581], [14.30416, 53.55499], [14.3273, 53.50587], [14.35209, 53.49506], [14.4215, 53.27724], [14.44133, 53.27427], [14.45125, 53.26241], [14.40662, 53.21098], [14.37853, 53.20405], [14.36696, 53.16444], [14.38679, 53.13669], [14.35044, 53.05829], [14.25954, 53.00264], [14.14056, 52.95786], [14.15873, 52.87715], [14.12256, 52.84311], [14.13806, 52.82392], [14.22071, 52.81175], [14.61073, 52.59847], [14.6289, 52.57136], [14.60081, 52.53116], [14.63056, 52.48993], [14.54423, 52.42568], [14.55228, 52.35264], [14.56378, 52.33838], [14.58149, 52.28007], [14.70139, 52.25038], [14.71319, 52.22144], [14.68344, 52.19612], [14.70616, 52.16927], [14.67683, 52.13936], [14.6917, 52.10283], [14.72971, 52.09167], [14.76026, 52.06624], [14.71339, 52.00337], [14.70488, 51.97679], [14.7139, 51.95643], [14.71836, 51.95606], [14.72163, 51.95188], [14.7177, 51.94048], [14.70601, 51.92944], [14.6933, 51.9044], [14.6588, 51.88359], [14.59089, 51.83302], [14.60493, 51.80473], [14.64625, 51.79472], [14.66386, 51.73282], [14.69065, 51.70842], [14.75392, 51.67445], [14.75759, 51.62318], [14.7727, 51.61263], [14.71125, 51.56209], [14.73047, 51.54606], [14.72652, 51.53902], [14.73219, 51.52922], [14.94749, 51.47155], [14.9652, 51.44793], [14.96899, 51.38367], [14.98008, 51.33449], [15.04288, 51.28387], [15.01242, 51.21285], [15.0047, 51.16874], [14.99311, 51.16249], [14.99414, 51.15813], [15.00083, 51.14974], [14.99646, 51.14365], [14.99079, 51.14284], [14.99689, 51.12205], [14.98229, 51.11354], [14.97938, 51.07742], [14.95529, 51.04552], [14.92942, 50.99744], [14.89252, 50.94999], [14.89681, 50.9422], [14.81664, 50.88148], [14.82803, 50.86966], [14.99852, 50.86817], [15.01088, 50.97984], [14.96419, 50.99108], [15.02433, 51.0242], [15.03895, 51.0123], [15.06218, 51.02269], [15.10152, 51.01095], [15.11937, 50.99021], [15.16744, 51.01959], [15.1743, 50.9833], [15.2361, 50.99886], [15.27043, 50.97724], [15.2773, 50.8907], [15.36656, 50.83956], [15.3803, 50.77187], [15.43798, 50.80833], [15.73186, 50.73885], [15.81683, 50.75666], [15.87331, 50.67188], [15.97219, 50.69799], [16.0175, 50.63009], [15.98317, 50.61528], [16.02437, 50.60046], [16.10265, 50.66405], [16.20839, 50.63096], [16.23174, 50.67101], [16.33611, 50.66579], [16.44597, 50.58041], [16.34572, 50.49575], [16.31413, 50.50274], [16.19526, 50.43291], [16.21585, 50.40627], [16.22821, 50.41054], [16.28118, 50.36891], [16.30289, 50.38292], [16.36495, 50.37679], [16.3622, 50.34875], [16.39379, 50.3207], [16.42674, 50.32509], [16.56407, 50.21009], [16.55446, 50.16613], [16.63137, 50.1142], [16.7014, 50.09659], [16.8456, 50.20834], [16.98018, 50.24172], [17.00353, 50.21449], [17.02825, 50.23118], [16.99803, 50.25753], [17.02138, 50.27772], [16.99803, 50.30316], [16.94448, 50.31281], [16.90877, 50.38642], [16.85933, 50.41093], [16.89229, 50.45117], [17.1224, 50.39494], [17.14498, 50.38117], [17.19579, 50.38817], [17.19991, 50.3654], [17.27681, 50.32246], [17.34273, 50.32947], [17.34548, 50.2628], [17.3702, 50.28123], [17.58889, 50.27837], [17.67764, 50.28977], [17.69292, 50.32859], [17.74648, 50.29966], [17.72176, 50.25665], [17.76296, 50.23382], [17.70528, 50.18812], [17.59404, 50.16437], [17.66683, 50.10275], [17.6888, 50.12037], [17.7506, 50.07896], [17.77669, 50.02253], [17.86886, 49.97452], [18.00191, 50.01723], [18.04585, 50.01194], [18.04585, 50.03311], [18.00396, 50.04954], [18.03212, 50.06574], [18.07898, 50.04535], [18.10628, 50.00223], [18.20241, 49.99958], [18.21752, 49.97309], [18.27107, 49.96779], [18.27794, 49.93863], [18.31914, 49.91565], [18.33278, 49.92415], [18.33562, 49.94747], [18.41604, 49.93498], [18.53423, 49.89906], [18.54495, 49.9079], [18.54299, 49.92537], [18.57697, 49.91565], [18.57045, 49.87849], [18.60341, 49.86256], [18.57183, 49.83334], [18.61278, 49.7618], [18.61368, 49.75426], [18.62645, 49.75002], [18.62943, 49.74603], [18.62676, 49.71983], [18.69817, 49.70473], [18.72838, 49.68163], [18.80479, 49.6815], [18.84786, 49.5446], [18.84521, 49.51672], [18.94536, 49.52143], [18.97283, 49.49914], [18.9742, 49.39557], [19.18019, 49.41165], [19.25435, 49.53391], [19.36009, 49.53747], [19.37795, 49.574], [19.45348, 49.61583], [19.52626, 49.57311], [19.53313, 49.52856], [19.57845, 49.46077], [19.64162, 49.45184], [19.6375, 49.40897], [19.72127, 49.39288], [19.78581, 49.41701], [19.82237, 49.27806], [19.75286, 49.20751], [19.86409, 49.19316], [19.90529, 49.23532], [19.98494, 49.22904], [20.08238, 49.1813], [20.13738, 49.31685], [20.21977, 49.35265], [20.31453, 49.34817], [20.31728, 49.39914], [20.39939, 49.3896], [20.46422, 49.41612], [20.5631, 49.375], [20.61666, 49.41791], [20.72274, 49.41813], [20.77971, 49.35383], [20.9229, 49.29626], [20.98733, 49.30774], [21.09799, 49.37176], [21.041, 49.41791], [21.12477, 49.43666], [21.19756, 49.4054], [21.27858, 49.45988], [21.43376, 49.41433], [21.62328, 49.4447], [21.77983, 49.35443], [21.82927, 49.39467], [21.96385, 49.3437], [22.04427, 49.22136], [22.56155, 49.08865], [22.89122, 49.00725], [22.86336, 49.10513], [22.72009, 49.20288], [22.748, 49.32759], [22.69444, 49.49378], [22.64534, 49.53094], [22.78304, 49.65543], [22.80261, 49.69098], [22.83179, 49.69875], [22.99329, 49.84249], [23.28221, 50.0957], [23.67635, 50.33385], [23.71382, 50.38248], [23.79445, 50.40481], [23.99563, 50.41289], [24.03668, 50.44507], [24.07048, 50.5071], [24.0996, 50.60752], [24.0595, 50.71625], [23.95925, 50.79271], [23.99254, 50.83847], [24.0952, 50.83262], [24.14524, 50.86128], [24.04576, 50.90196], [23.92217, 51.00836], [23.90376, 51.07697], [23.80678, 51.18405], [23.63858, 51.32182], [23.69905, 51.40871], [23.62751, 51.50512], [23.56236, 51.53673], [23.57053, 51.55938], [23.53198, 51.74298], [23.62691, 51.78208], [23.61523, 51.92066], [23.68733, 51.9906], [23.64066, 52.07626], [23.61, 52.11264], [23.54314, 52.12148], [23.47859, 52.18215], [23.20071, 52.22848], [23.18196, 52.28812], [23.34141, 52.44845], [23.45112, 52.53774], [23.58296, 52.59868], [23.73615, 52.6149], [23.93763, 52.71332], [23.91805, 52.94016], [23.94689, 52.95919], [23.92184, 53.02079], [23.87548, 53.0831], [23.91393, 53.16469], [23.85657, 53.22923], [23.81995, 53.24131], [23.62004, 53.60942], [23.51284, 53.95052], [23.48261, 53.98855], [23.52702, 54.04622], [23.49196, 54.14764], [23.45223, 54.17775], [23.42418, 54.17911], [23.39525, 54.21672], [23.3494, 54.25155], [23.24656, 54.25701], [23.15938, 54.29894], [23.15526, 54.31076], [23.13905, 54.31567], [23.104, 54.29794], [23.04323, 54.31567], [23.05726, 54.34565], [22.99649, 54.35927], [23.00584, 54.38514], [22.83756, 54.40827], [22.79705, 54.36264], [21.41123, 54.32395], [20.63871, 54.3706], [19.8038, 54.44203], [19.64312, 54.45423], [18.57853, 55.25302]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "PM", + iso1A3: "SPM", + iso1N3: "666", + wikidata: "Q34617", + nameEn: "Saint Pierre and Miquelon", + country: "FR", + groups: ["Q1451600", "021", "003", "019", "UN"], + callingCodes: ["508"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-56.72993, 46.65575], [-55.90758, 46.6223], [-56.27503, 47.39728], [-56.72993, 46.65575]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "PN", + iso1A3: "PCN", + iso1N3: "612", + wikidata: "Q35672", + nameEn: "Pitcairn Islands", + country: "GB", + groups: ["BOTS", "061", "009", "UN"], + driveSide: "left", + callingCodes: ["64"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-133.59543, -28.4709], [-122.0366, -24.55017], [-133.61511, -21.93325], [-133.59543, -28.4709]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "PR", + iso1A3: "PRI", + iso1N3: "630", + wikidata: "Q1183", + nameEn: "Puerto Rico", + aliases: ["US-PR"], + country: "US", + groups: ["Q1352230", "029", "003", "419", "019", "UN"], + roadSpeedUnit: "mph", + callingCodes: ["1 787", "1 939"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-65.27974, 17.56928], [-65.02435, 18.73231], [-67.99519, 18.97186], [-68.23894, 17.84663], [-65.27974, 17.56928]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "PS", + iso1A3: "PSE", + iso1N3: "275", + wikidata: "Q219060", + nameEn: "Palestine" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "PT", + iso1A3: "PRT", + iso1N3: "620", + wikidata: "Q45", + nameEn: "Portugal" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "PW", + iso1A3: "PLW", + iso1N3: "585", + wikidata: "Q695", + nameEn: "Palau", + groups: ["057", "009", "UN"], + roadSpeedUnit: "mph", + callingCodes: ["680"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[128.97621, 3.08804], [136.39296, 1.54187], [136.04605, 12.45908], [128.97621, 3.08804]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "PY", + iso1A3: "PRY", + iso1N3: "600", + wikidata: "Q733", + nameEn: "Paraguay", + groups: ["005", "419", "019", "UN"], + callingCodes: ["595"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-58.16225, -20.16193], [-58.23216, -19.80058], [-59.06965, -19.29148], [-60.00638, -19.2981], [-61.73723, -19.63958], [-61.93912, -20.10053], [-62.26883, -20.55311], [-62.2757, -21.06657], [-62.64455, -22.25091], [-62.51761, -22.37684], [-62.22768, -22.55807], [-61.9756, -23.0507], [-61.0782, -23.62932], [-60.99754, -23.80934], [-60.28163, -24.04436], [-60.03367, -24.00701], [-59.45482, -24.34787], [-59.33886, -24.49935], [-58.33055, -24.97099], [-58.25492, -24.92528], [-57.80821, -25.13863], [-57.57431, -25.47269], [-57.87176, -25.93604], [-58.1188, -26.16704], [-58.3198, -26.83443], [-58.65321, -27.14028], [-58.59549, -27.29973], [-58.04205, -27.2387], [-56.85337, -27.5165], [-56.18313, -27.29851], [-55.89195, -27.3467], [-55.74475, -27.44485], [-55.59094, -27.32444], [-55.62322, -27.1941], [-55.39611, -26.97679], [-55.25243, -26.93808], [-55.16948, -26.96068], [-55.06351, -26.80195], [-55.00584, -26.78754], [-54.80868, -26.55669], [-54.70732, -26.45099], [-54.69333, -26.37705], [-54.67359, -25.98607], [-54.60664, -25.9691], [-54.62063, -25.91213], [-54.59398, -25.59224], [-54.59509, -25.53696], [-54.60196, -25.48397], [-54.62033, -25.46026], [-54.4423, -25.13381], [-54.28207, -24.07305], [-54.32807, -24.01865], [-54.6238, -23.83078], [-55.02691, -23.97317], [-55.0518, -23.98666], [-55.12292, -23.99669], [-55.41784, -23.9657], [-55.44117, -23.9185], [-55.43585, -23.87157], [-55.5555, -23.28237], [-55.52288, -23.2595], [-55.5446, -23.22811], [-55.63849, -22.95122], [-55.62493, -22.62765], [-55.68742, -22.58407], [-55.6986, -22.56268], [-55.72366, -22.5519], [-55.741, -22.52018], [-55.74941, -22.46436], [-55.8331, -22.29008], [-56.23206, -22.25347], [-56.45893, -22.08072], [-56.5212, -22.11556], [-56.6508, -22.28387], [-57.98625, -22.09157], [-57.94642, -21.73799], [-57.88239, -21.6868], [-57.93492, -21.65505], [-57.84536, -20.93155], [-58.16225, -20.16193]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "QA", + iso1A3: "QAT", + iso1N3: "634", + wikidata: "Q846", + nameEn: "Qatar", + groups: ["145", "142", "UN"], + callingCodes: ["974"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[50.92992, 24.54396], [51.09638, 24.46907], [51.29972, 24.50747], [51.39468, 24.62785], [51.58834, 24.66608], [51.83108, 24.71675], [51.83682, 26.70231], [50.93865, 26.30758], [50.81266, 25.88946], [50.86149, 25.6965], [50.7801, 25.595], [50.80824, 25.54641], [50.57069, 25.57887], [50.8133, 24.74049], [50.92992, 24.54396]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "RE", + iso1A3: "REU", + iso1N3: "638", + wikidata: "Q17070", + nameEn: "R\xE9union", + country: "FR", + groups: ["Q3320166", "EU", "014", "202", "002", "UN"], + callingCodes: ["262"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[53.37984, -21.23941], [56.73473, -21.9174], [56.62373, -20.2711], [53.37984, -21.23941]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "RO", + iso1A3: "ROU", + iso1N3: "642", + wikidata: "Q218", + nameEn: "Romania", + groups: ["EU", "151", "150", "UN"], + callingCodes: ["40"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[27.15622, 47.98538], [27.02985, 48.09083], [27.04118, 48.12522], [26.96119, 48.13003], [26.98042, 48.15752], [26.94265, 48.1969], [26.87708, 48.19919], [26.81161, 48.25049], [26.62823, 48.25804], [26.55202, 48.22445], [26.33504, 48.18418], [26.17711, 47.99246], [26.05901, 47.9897], [25.77723, 47.93919], [25.63878, 47.94924], [25.23778, 47.89403], [25.11144, 47.75203], [24.88896, 47.7234], [24.81893, 47.82031], [24.70632, 47.84428], [24.61994, 47.95062], [24.43578, 47.97131], [24.34926, 47.9244], [24.22566, 47.90231], [24.11281, 47.91487], [24.06466, 47.95317], [24.02999, 47.95087], [24.00801, 47.968], [23.98553, 47.96076], [23.96337, 47.96672], [23.94192, 47.94868], [23.89352, 47.94512], [23.8602, 47.9329], [23.80904, 47.98142], [23.75188, 47.99705], [23.66262, 47.98786], [23.63894, 48.00293], [23.5653, 48.00499], [23.52803, 48.01818], [23.4979, 47.96858], [23.33577, 48.0237], [23.27397, 48.08245], [23.15999, 48.12188], [23.1133, 48.08061], [23.08858, 48.00716], [23.0158, 47.99338], [22.92241, 48.02002], [22.94301, 47.96672], [22.89849, 47.95851], [22.77991, 47.87211], [22.76617, 47.8417], [22.67247, 47.7871], [22.46559, 47.76583], [22.41979, 47.7391], [22.31816, 47.76126], [22.00917, 47.50492], [22.03389, 47.42508], [22.01055, 47.37767], [21.94463, 47.38046], [21.78395, 47.11104], [21.648, 47.03902], [21.68645, 46.99595], [21.59581, 46.91628], [21.59307, 46.86935], [21.52028, 46.84118], [21.48935, 46.7577], [21.5151, 46.72147], [21.43926, 46.65109], [21.33214, 46.63035], [21.26929, 46.4993], [21.28061, 46.44941], [21.16872, 46.30118], [21.06572, 46.24897], [20.86797, 46.28884], [20.74574, 46.25467], [20.76085, 46.21002], [20.63863, 46.12728], [20.49718, 46.18721], [20.45377, 46.14405], [20.35573, 46.16629], [20.28324, 46.1438], [20.26068, 46.12332], [20.35862, 45.99356], [20.54818, 45.89939], [20.65645, 45.82801], [20.70069, 45.7493], [20.77416, 45.75601], [20.78446, 45.78522], [20.82364, 45.77738], [20.80361, 45.65875], [20.76798, 45.60969], [20.83321, 45.53567], [20.77217, 45.49788], [20.86026, 45.47295], [20.87948, 45.42743], [21.09894, 45.30144], [21.17612, 45.32566], [21.20392, 45.2677], [21.29398, 45.24148], [21.48278, 45.19557], [21.51299, 45.15345], [21.4505, 45.04294], [21.35855, 45.01941], [21.54938, 44.9327], [21.56328, 44.89502], [21.48202, 44.87199], [21.44013, 44.87613], [21.35643, 44.86364], [21.38802, 44.78133], [21.55007, 44.77304], [21.60019, 44.75208], [21.61942, 44.67059], [21.67504, 44.67107], [21.71692, 44.65349], [21.7795, 44.66165], [21.99364, 44.63395], [22.08016, 44.49844], [22.13234, 44.47444], [22.18315, 44.48179], [22.30844, 44.6619], [22.45301, 44.7194], [22.61917, 44.61489], [22.69196, 44.61587], [22.76749, 44.54446], [22.70981, 44.51852], [22.61368, 44.55719], [22.56493, 44.53419], [22.54021, 44.47836], [22.45436, 44.47258], [22.56012, 44.30712], [22.68166, 44.28206], [22.67173, 44.21564], [23.04988, 44.07694], [23.01674, 44.01946], [22.87873, 43.9844], [22.83753, 43.88055], [22.85314, 43.84452], [23.05288, 43.79494], [23.26772, 43.84843], [23.4507, 43.84936], [23.61687, 43.79289], [23.73978, 43.80627], [24.18149, 43.68218], [24.35364, 43.70211], [24.50264, 43.76314], [24.62281, 43.74082], [24.73542, 43.68523], [24.96682, 43.72693], [25.10718, 43.6831], [25.17144, 43.70261], [25.39528, 43.61866], [25.72792, 43.69263], [25.94911, 43.85745], [26.05584, 43.90925], [26.10115, 43.96908], [26.38764, 44.04356], [26.62712, 44.05698], [26.95141, 44.13555], [27.26845, 44.12602], [27.39757, 44.0141], [27.60834, 44.01206], [27.64542, 44.04958], [27.73468, 43.95326], [27.92008, 44.00761], [27.99558, 43.84193], [28.23293, 43.76], [29.24336, 43.70874], [30.04414, 45.08461], [29.69272, 45.19227], [29.65428, 45.25629], [29.68175, 45.26885], [29.59798, 45.38857], [29.42632, 45.44545], [29.24779, 45.43388], [28.96077, 45.33164], [28.94292, 45.28045], [28.81383, 45.3384], [28.78911, 45.24179], [28.71358, 45.22631], [28.5735, 45.24759], [28.34554, 45.32102], [28.28504, 45.43907], [28.21139, 45.46895], [28.18741, 45.47358], [28.08927, 45.6051], [28.16568, 45.6421], [28.13111, 45.92819], [28.08612, 46.01105], [28.13684, 46.18099], [28.10937, 46.22852], [28.19864, 46.31869], [28.18902, 46.35283], [28.25769, 46.43334], [28.22281, 46.50481], [28.24808, 46.64305], [28.12173, 46.82283], [28.09095, 46.97621], [27.81892, 47.1381], [27.73172, 47.29248], [27.68706, 47.28962], [27.60263, 47.32507], [27.55731, 47.46637], [27.47942, 47.48113], [27.3979, 47.59473], [27.32202, 47.64009], [27.25519, 47.71366], [27.29069, 47.73722], [27.1618, 47.92391], [27.15622, 47.98538]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "RS", + iso1A3: "SRB", + iso1N3: "688", + wikidata: "Q403", + nameEn: "Serbia", + groups: ["039", "150", "UN"], + callingCodes: ["381"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[19.66007, 46.19005], [19.56113, 46.16824], [19.52473, 46.1171], [19.28826, 45.99694], [19.14543, 45.9998], [19.10388, 46.04015], [19.0791, 45.96458], [19.01284, 45.96529], [18.99712, 45.93537], [18.81394, 45.91329], [18.85783, 45.85493], [18.90305, 45.71863], [18.96691, 45.66731], [18.88776, 45.57253], [18.94562, 45.53712], [19.07471, 45.53086], [19.08364, 45.48804], [18.99918, 45.49333], [18.97446, 45.37528], [19.10774, 45.29547], [19.28208, 45.23813], [19.41941, 45.23475], [19.43589, 45.17137], [19.19144, 45.17863], [19.14063, 45.12972], [19.07952, 45.14668], [19.1011, 45.01191], [19.05205, 44.97692], [19.15573, 44.95409], [19.06853, 44.89915], [19.02871, 44.92541], [18.98957, 44.90645], [19.01994, 44.85493], [19.18183, 44.92055], [19.36722, 44.88164], [19.32543, 44.74058], [19.26388, 44.65412], [19.16699, 44.52197], [19.13369, 44.52521], [19.12278, 44.50132], [19.14837, 44.45253], [19.14681, 44.41463], [19.11785, 44.40313], [19.10749, 44.39421], [19.10704, 44.38249], [19.10365, 44.37795], [19.10298, 44.36924], [19.11865, 44.36712], [19.1083, 44.3558], [19.11547, 44.34218], [19.13556, 44.338], [19.13332, 44.31492], [19.16741, 44.28648], [19.18328, 44.28383], [19.20508, 44.2917], [19.23306, 44.26097], [19.26945, 44.26957], [19.32464, 44.27185], [19.34773, 44.23244], [19.3588, 44.18353], [19.40927, 44.16722], [19.43905, 44.13088], [19.47338, 44.15034], [19.48386, 44.14332], [19.47321, 44.1193], [19.51167, 44.08158], [19.55999, 44.06894], [19.57467, 44.04716], [19.61991, 44.05254], [19.61836, 44.01464], [19.56498, 43.99922], [19.52515, 43.95573], [19.38439, 43.96611], [19.24363, 44.01502], [19.23465, 43.98764], [19.3986, 43.79668], [19.5176, 43.71403], [19.50455, 43.58385], [19.42696, 43.57987], [19.41941, 43.54056], [19.36653, 43.60921], [19.33426, 43.58833], [19.2553, 43.5938], [19.24774, 43.53061], [19.22807, 43.5264], [19.22229, 43.47926], [19.44315, 43.38846], [19.48171, 43.32644], [19.52962, 43.31623], [19.54598, 43.25158], [19.62661, 43.2286], [19.64063, 43.19027], [19.76918, 43.16044], [19.79255, 43.11951], [19.92576, 43.08539], [19.96549, 43.11098], [19.98887, 43.0538], [20.04729, 43.02732], [20.05431, 42.99571], [20.12325, 42.96237], [20.14896, 42.99058], [20.16415, 42.97177], [20.34528, 42.90676], [20.35692, 42.8335], [20.40594, 42.84853], [20.43734, 42.83157], [20.53484, 42.8885], [20.48692, 42.93208], [20.59929, 43.01067], [20.64557, 43.00826], [20.69515, 43.09641], [20.59929, 43.20492], [20.68688, 43.21335], [20.73811, 43.25068], [20.82145, 43.26769], [20.88685, 43.21697], [20.83727, 43.17842], [20.96287, 43.12416], [21.00749, 43.13984], [21.05378, 43.10707], [21.08952, 43.13471], [21.14465, 43.11089], [21.16734, 42.99694], [21.2041, 43.02277], [21.23877, 43.00848], [21.23534, 42.95523], [21.2719, 42.8994], [21.32974, 42.90424], [21.36941, 42.87397], [21.44047, 42.87276], [21.39045, 42.74888], [21.47498, 42.74695], [21.59154, 42.72643], [21.58755, 42.70418], [21.6626, 42.67813], [21.75025, 42.70125], [21.79413, 42.65923], [21.75672, 42.62695], [21.7327, 42.55041], [21.70522, 42.54176], [21.7035, 42.51899], [21.62556, 42.45106], [21.64209, 42.41081], [21.62887, 42.37664], [21.59029, 42.38042], [21.57021, 42.3647], [21.53467, 42.36809], [21.5264, 42.33634], [21.56772, 42.30946], [21.58992, 42.25915], [21.70111, 42.23789], [21.77176, 42.2648], [21.84654, 42.3247], [21.91595, 42.30392], [21.94405, 42.34669], [22.02908, 42.29848], [22.16384, 42.32103], [22.29605, 42.37477], [22.29275, 42.34913], [22.34773, 42.31725], [22.45919, 42.33822], [22.47498, 42.3915], [22.51961, 42.3991], [22.55669, 42.50144], [22.43983, 42.56851], [22.4997, 42.74144], [22.43309, 42.82057], [22.54302, 42.87774], [22.74826, 42.88701], [22.78397, 42.98253], [22.89521, 43.03625], [22.98104, 43.11199], [23.00806, 43.19279], [22.89727, 43.22417], [22.82036, 43.33665], [22.53397, 43.47225], [22.47582, 43.6558], [22.41043, 43.69566], [22.35558, 43.81281], [22.41449, 44.00514], [22.61688, 44.06534], [22.61711, 44.16938], [22.67173, 44.21564], [22.68166, 44.28206], [22.56012, 44.30712], [22.45436, 44.47258], [22.54021, 44.47836], [22.56493, 44.53419], [22.61368, 44.55719], [22.70981, 44.51852], [22.76749, 44.54446], [22.69196, 44.61587], [22.61917, 44.61489], [22.45301, 44.7194], [22.30844, 44.6619], [22.18315, 44.48179], [22.13234, 44.47444], [22.08016, 44.49844], [21.99364, 44.63395], [21.7795, 44.66165], [21.71692, 44.65349], [21.67504, 44.67107], [21.61942, 44.67059], [21.60019, 44.75208], [21.55007, 44.77304], [21.38802, 44.78133], [21.35643, 44.86364], [21.44013, 44.87613], [21.48202, 44.87199], [21.56328, 44.89502], [21.54938, 44.9327], [21.35855, 45.01941], [21.4505, 45.04294], [21.51299, 45.15345], [21.48278, 45.19557], [21.29398, 45.24148], [21.20392, 45.2677], [21.17612, 45.32566], [21.09894, 45.30144], [20.87948, 45.42743], [20.86026, 45.47295], [20.77217, 45.49788], [20.83321, 45.53567], [20.76798, 45.60969], [20.80361, 45.65875], [20.82364, 45.77738], [20.78446, 45.78522], [20.77416, 45.75601], [20.70069, 45.7493], [20.65645, 45.82801], [20.54818, 45.89939], [20.35862, 45.99356], [20.26068, 46.12332], [20.09713, 46.17315], [20.03533, 46.14509], [20.01816, 46.17696], [19.93508, 46.17553], [19.81491, 46.1313], [19.66007, 46.19005]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "RU", + iso1A3: "RUS", + iso1N3: "643", + wikidata: "Q159", + nameEn: "Russia" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "RW", + iso1A3: "RWA", + iso1N3: "646", + wikidata: "Q1037", + nameEn: "Rwanda", + groups: ["014", "202", "002", "UN"], + callingCodes: ["250"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[30.47194, -1.0555], [30.35212, -1.06896], [30.16369, -1.34303], [29.912, -1.48269], [29.82657, -1.31187], [29.59061, -1.39016], [29.53062, -1.40499], [29.45038, -1.5054], [29.36322, -1.50887], [29.24323, -1.66826], [29.24458, -1.69663], [29.11847, -1.90576], [29.17562, -2.12278], [29.105, -2.27043], [29.00051, -2.29001], [28.95642, -2.37321], [28.89601, -2.37321], [28.86826, -2.41888], [28.86846, -2.44866], [28.89132, -2.47557], [28.89342, -2.49017], [28.88846, -2.50493], [28.87497, -2.50887], [28.86209, -2.5231], [28.86193, -2.53185], [28.87943, -2.55165], [28.89288, -2.55848], [28.90226, -2.62385], [28.89793, -2.66111], [28.94346, -2.69124], [29.00357, -2.70596], [29.04081, -2.7416], [29.0562, -2.58632], [29.32234, -2.6483], [29.36805, -2.82933], [29.88237, -2.75105], [29.95911, -2.33348], [30.14034, -2.43626], [30.42933, -2.31064], [30.54501, -2.41404], [30.83915, -2.35795], [30.89303, -2.08223], [30.80802, -1.91477], [30.84079, -1.64652], [30.71974, -1.43244], [30.57123, -1.33264], [30.50889, -1.16412], [30.45116, -1.10641], [30.47194, -1.0555]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "SA", + iso1A3: "SAU", + iso1N3: "682", + wikidata: "Q851", + nameEn: "Saudi Arabia", + groups: ["145", "142", "UN"], + callingCodes: ["966"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[40.01521, 32.05667], [39.29903, 32.23259], [38.99233, 31.99721], [36.99791, 31.50081], [37.99354, 30.49998], [37.66395, 30.33245], [37.4971, 29.99949], [36.75083, 29.86903], [36.50005, 29.49696], [36.07081, 29.18469], [34.8812, 29.36878], [34.4454, 27.91479], [37.8565, 22.00903], [39.63762, 18.37348], [40.99158, 15.81743], [42.15205, 16.40211], [42.76801, 16.40371], [42.94625, 16.39721], [42.94351, 16.49467], [42.97215, 16.51093], [43.11601, 16.53166], [43.15274, 16.67248], [43.22066, 16.65179], [43.21325, 16.74416], [43.25857, 16.75304], [43.26303, 16.79479], [43.24801, 16.80613], [43.22956, 16.80613], [43.22012, 16.83932], [43.18338, 16.84852], [43.1398, 16.90696], [43.19328, 16.94703], [43.1813, 16.98438], [43.18233, 17.02673], [43.23967, 17.03428], [43.17787, 17.14717], [43.20156, 17.25901], [43.32653, 17.31179], [43.22533, 17.38343], [43.29185, 17.53224], [43.43005, 17.56148], [43.70631, 17.35762], [44.50126, 17.47475], [46.31018, 17.20464], [46.76494, 17.29151], [47.00571, 16.94765], [47.48245, 17.10808], [47.58351, 17.50366], [48.19996, 18.20584], [49.04884, 18.59899], [52.00311, 19.00083], [54.99756, 20.00083], [55.66469, 21.99658], [55.2137, 22.71065], [55.13599, 22.63334], [52.56622, 22.94341], [51.59617, 24.12041], [51.58871, 24.27256], [51.41644, 24.39615], [51.58834, 24.66608], [51.39468, 24.62785], [51.29972, 24.50747], [51.09638, 24.46907], [50.92992, 24.54396], [50.8133, 24.74049], [50.57069, 25.57887], [50.302, 25.87592], [50.26923, 26.08243], [50.38162, 26.53976], [50.71771, 26.73086], [50.37726, 27.89227], [49.98877, 27.87827], [49.00421, 28.81495], [48.42991, 28.53628], [47.70561, 28.5221], [47.59863, 28.66798], [47.58376, 28.83382], [47.46202, 29.0014], [46.5527, 29.10283], [46.42415, 29.05947], [44.72255, 29.19736], [42.97796, 30.48295], [42.97601, 30.72204], [40.01521, 32.05667]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "SB", + iso1A3: "SLB", + iso1N3: "090", + wikidata: "Q685", + nameEn: "Solomon Islands", + groups: ["054", "009", "UN"], + driveSide: "left", + callingCodes: ["677"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[172.71443, -12.01327], [160.43769, -4.17974], [156.03296, -6.55528], [156.03993, -6.65703], [155.92557, -6.84664], [155.69784, -6.92661], [155.60735, -6.92266], [154.74815, -7.33315], [156.73836, -14.50464], [172.71443, -12.01327]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "SC", + iso1A3: "SYC", + iso1N3: "690", + wikidata: "Q1042", + nameEn: "Seychelles", + groups: ["014", "202", "002", "UN"], + driveSide: "left", + callingCodes: ["248"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[43.75112, -10.38913], [54.83239, -10.93575], [66.3222, 5.65313], [43.75112, -10.38913]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "SD", + iso1A3: "SDN", + iso1N3: "729", + wikidata: "Q1049", + nameEn: "Sudan", + groups: ["015", "002", "UN"], + callingCodes: ["249"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[37.8565, 22.00903], [34.0765, 22.00501], [33.99686, 21.76784], [33.57251, 21.72406], [33.17563, 22.00405], [24.99885, 21.99535], [24.99794, 19.99661], [23.99715, 20.00038], [23.99539, 19.49944], [23.99997, 15.69575], [23.62785, 15.7804], [23.38812, 15.69649], [23.10792, 15.71297], [22.93201, 15.55107], [22.92579, 15.47007], [22.99584, 15.40105], [22.99584, 15.22989], [22.66115, 14.86308], [22.70474, 14.69149], [22.38562, 14.58907], [22.44944, 14.24986], [22.55997, 14.23024], [22.5553, 14.11704], [22.22995, 13.96754], [22.08674, 13.77863], [22.29689, 13.3731], [22.1599, 13.19281], [22.02914, 13.13976], [21.94819, 13.05637], [21.81432, 12.81362], [21.89371, 12.68001], [21.98711, 12.63292], [22.15679, 12.66634], [22.22684, 12.74682], [22.46345, 12.61925], [22.38873, 12.45514], [22.50548, 12.16769], [22.48369, 12.02766], [22.64092, 12.07485], [22.54907, 11.64372], [22.7997, 11.40424], [22.93124, 11.41645], [22.97249, 11.21955], [22.87758, 10.91915], [23.02221, 10.69235], [23.3128, 10.45214], [23.67164, 9.86923], [23.69155, 9.67566], [24.09319, 9.66572], [24.12744, 9.73784], [24.49389, 9.79962], [24.84653, 9.80643], [24.97739, 9.9081], [25.05688, 10.06776], [25.0918, 10.33718], [25.78141, 10.42599], [25.93163, 10.38159], [25.93241, 10.17941], [26.21338, 9.91545], [26.35815, 9.57946], [26.70685, 9.48735], [27.14427, 9.62858], [27.90704, 9.61323], [28.99983, 9.67155], [29.06988, 9.74826], [29.53844, 9.75133], [29.54, 10.07949], [29.94629, 10.29245], [30.00389, 10.28633], [30.53005, 9.95992], [30.82893, 9.71451], [30.84605, 9.7498], [31.28504, 9.75287], [31.77539, 10.28939], [31.99177, 10.65065], [32.46967, 11.04662], [32.39358, 11.18207], [32.39578, 11.70208], [32.10079, 11.95203], [32.73921, 11.95203], [32.73921, 12.22757], [33.25876, 12.22111], [33.13988, 11.43248], [33.26977, 10.83632], [33.24645, 10.77913], [33.52294, 10.64382], [33.66604, 10.44254], [33.80913, 10.32994], [33.90159, 10.17179], [33.96984, 10.15446], [33.99185, 9.99623], [33.96323, 9.80972], [33.9082, 9.762], [33.87958, 9.49937], [34.10229, 9.50238], [34.08717, 9.55243], [34.13186, 9.7492], [34.20484, 9.9033], [34.22718, 10.02506], [34.32102, 10.11599], [34.34783, 10.23914], [34.2823, 10.53508], [34.4372, 10.781], [34.59062, 10.89072], [34.77383, 10.74588], [34.77532, 10.69027], [34.86618, 10.74588], [34.86916, 10.78832], [34.97491, 10.86147], [34.97789, 10.91559], [34.93172, 10.95946], [35.01215, 11.19626], [34.95704, 11.24448], [35.09556, 11.56278], [35.05832, 11.71158], [35.11492, 11.85156], [35.24302, 11.91132], [35.70476, 12.67101], [36.01458, 12.72478], [36.14268, 12.70879], [36.16651, 12.88019], [36.13374, 12.92665], [36.24545, 13.36759], [36.38993, 13.56459], [36.48824, 13.83954], [36.44653, 13.95666], [36.54376, 14.25597], [36.44337, 15.14963], [36.54276, 15.23478], [36.69761, 15.75323], [36.76371, 15.80831], [36.92193, 16.23451], [36.99777, 17.07172], [37.42694, 17.04041], [37.50967, 17.32199], [38.13362, 17.53906], [38.37133, 17.66269], [38.45916, 17.87167], [38.57727, 17.98125], [39.63762, 18.37348], [37.8565, 22.00903]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "SE", + iso1A3: "SWE", + iso1N3: "752", + wikidata: "Q34", + nameEn: "Sweden", + groups: ["EU", "154", "150", "UN"], + callingCodes: ["46"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[24.15791, 65.85385], [23.90497, 66.15802], [23.71339, 66.21299], [23.64982, 66.30603], [23.67591, 66.3862], [23.63776, 66.43568], [23.85959, 66.56434], [23.89488, 66.772], [23.98059, 66.79585], [23.98563, 66.84149], [23.56214, 67.17038], [23.58735, 67.20752], [23.54701, 67.25435], [23.75372, 67.29914], [23.75372, 67.43688], [23.39577, 67.46974], [23.54701, 67.59306], [23.45627, 67.85297], [23.65793, 67.9497], [23.40081, 68.05545], [23.26469, 68.15134], [23.15377, 68.14759], [23.10336, 68.26551], [22.73028, 68.40881], [22.00429, 68.50692], [21.03001, 68.88969], [20.90649, 68.89696], [20.85104, 68.93142], [20.91658, 68.96764], [20.78802, 69.03087], [20.55258, 69.06069], [20.0695, 69.04469], [20.28444, 68.93283], [20.33435, 68.80174], [20.22027, 68.67246], [19.95647, 68.55546], [20.22027, 68.48759], [19.93508, 68.35911], [18.97255, 68.52416], [18.63032, 68.50849], [18.39503, 68.58672], [18.1241, 68.53721], [18.13836, 68.20874], [17.90787, 67.96537], [17.30416, 68.11591], [16.7409, 67.91037], [16.38441, 67.52923], [16.12774, 67.52106], [16.09922, 67.4364], [16.39154, 67.21653], [16.35589, 67.06419], [15.37197, 66.48217], [15.49318, 66.28509], [15.05113, 66.15572], [14.53778, 66.12399], [14.50926, 65.31786], [13.64276, 64.58402], [14.11117, 64.46674], [14.16051, 64.18725], [13.98222, 64.00953], [13.23411, 64.09087], [12.74105, 64.02171], [12.14928, 63.59373], [12.19919, 63.47935], [11.98529, 63.27487], [12.19919, 63.00104], [12.07085, 62.6297], [12.29187, 62.25699], [12.14746, 61.7147], [12.40595, 61.57226], [12.57707, 61.56547], [12.86939, 61.35427], [12.69115, 61.06584], [12.2277, 61.02442], [12.59133, 60.50559], [12.52003, 60.13846], [12.36317, 59.99259], [12.15641, 59.8926], [11.87121, 59.86039], [11.92112, 59.69531], [11.69297, 59.59442], [11.8213, 59.24985], [11.65732, 58.90177], [11.45199, 58.89604], [11.4601, 58.99022], [11.34459, 59.11672], [11.15367, 59.07862], [11.08911, 58.98745], [10.64958, 58.89391], [10.40861, 58.38489], [12.16597, 56.60205], [12.07466, 56.29488], [12.65312, 56.04345], [12.6372, 55.91371], [12.88472, 55.63369], [12.60345, 55.42675], [12.84405, 55.13257], [14.28399, 55.1553], [14.89259, 55.5623], [15.79951, 55.54655], [19.64795, 57.06466], [19.84909, 57.57876], [20.5104, 59.15546], [19.08191, 60.19152], [19.23413, 60.61414], [20.15877, 63.06556], [24.14112, 65.39731], [24.15107, 65.81427], [24.14798, 65.83466], [24.15791, 65.85385]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "SG", + iso1A3: "SGP", + iso1N3: "702", + wikidata: "Q334", + nameEn: "Singapore", + groups: ["035", "142", "UN"], + driveSide: "left", + callingCodes: ["65"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[104.00131, 1.42405], [103.93384, 1.42926], [103.89565, 1.42841], [103.86383, 1.46288], [103.81181, 1.47953], [103.76395, 1.45183], [103.74161, 1.4502], [103.7219, 1.46108], [103.67468, 1.43166], [103.62738, 1.35255], [103.56591, 1.19719], [103.66049, 1.18825], [103.74084, 1.12902], [104.03085, 1.26954], [104.12282, 1.27714], [104.08072, 1.35998], [104.09162, 1.39694], [104.08871, 1.42015], [104.07348, 1.43322], [104.04622, 1.44691], [104.02277, 1.4438], [104.00131, 1.42405]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "SH", + iso1A3: "SHN", + iso1N3: "654", + wikidata: "Q192184", + nameEn: "Saint Helena, Ascension and Tristan da Cunha", + country: "GB" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "SI", + iso1A3: "SVN", + iso1N3: "705", + wikidata: "Q215", + nameEn: "Slovenia", + groups: ["EU", "039", "150", "UN"], + callingCodes: ["386"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[16.50139, 46.56684], [16.39217, 46.63673], [16.38594, 46.6549], [16.41863, 46.66238], [16.42641, 46.69228], [16.37816, 46.69975], [16.30966, 46.7787], [16.31303, 46.79838], [16.3408, 46.80641], [16.34547, 46.83836], [16.2941, 46.87137], [16.2365, 46.87775], [16.21892, 46.86961], [16.15711, 46.85434], [16.14365, 46.8547], [16.10983, 46.867], [16.05786, 46.83927], [15.99054, 46.82772], [15.99126, 46.78199], [15.98432, 46.74991], [15.99769, 46.7266], [16.02808, 46.71094], [16.04347, 46.68694], [16.04036, 46.6549], [15.99988, 46.67947], [15.98512, 46.68463], [15.94864, 46.68769], [15.87691, 46.7211], [15.8162, 46.71897], [15.78518, 46.70712], [15.76771, 46.69863], [15.73823, 46.70011], [15.72279, 46.69548], [15.69523, 46.69823], [15.67411, 46.70735], [15.6543, 46.70616], [15.6543, 46.69228], [15.6365, 46.6894], [15.63255, 46.68069], [15.62317, 46.67947], [15.59826, 46.68908], [15.54533, 46.66985], [15.55333, 46.64988], [15.54431, 46.6312], [15.46906, 46.61321], [15.45514, 46.63697], [15.41235, 46.65556], [15.23711, 46.63994], [15.14215, 46.66131], [15.01451, 46.641], [14.98024, 46.6009], [14.96002, 46.63459], [14.92283, 46.60848], [14.87129, 46.61], [14.86419, 46.59411], [14.83549, 46.56614], [14.81836, 46.51046], [14.72185, 46.49974], [14.66892, 46.44936], [14.5942, 46.43434], [14.56463, 46.37208], [14.52176, 46.42617], [14.45877, 46.41717], [14.42608, 46.44614], [14.314, 46.43327], [14.28326, 46.44315], [14.15989, 46.43327], [14.12097, 46.47724], [14.04002, 46.49117], [14.00422, 46.48474], [13.89837, 46.52331], [13.7148, 46.5222], [13.68684, 46.43881], [13.59777, 46.44137], [13.5763, 46.42613], [13.5763, 46.40915], [13.47019, 46.3621], [13.43418, 46.35992], [13.44808, 46.33507], [13.37671, 46.29668], [13.42218, 46.20758], [13.47587, 46.22725], [13.56114, 46.2054], [13.56682, 46.18703], [13.64451, 46.18966], [13.66472, 46.17392], [13.64053, 46.13587], [13.57072, 46.09022], [13.50104, 46.05986], [13.49568, 46.04839], [13.50998, 46.04498], [13.49702, 46.01832], [13.47474, 46.00546], [13.50104, 45.98078], [13.52963, 45.96588], [13.56759, 45.96991], [13.58903, 45.99009], [13.62074, 45.98388], [13.63458, 45.98947], [13.64307, 45.98326], [13.6329, 45.94894], [13.63815, 45.93607], [13.61931, 45.91782], [13.60857, 45.89907], [13.59565, 45.89446], [13.58644, 45.88173], [13.57563, 45.8425], [13.58858, 45.83503], [13.59784, 45.8072], [13.66986, 45.79955], [13.8235, 45.7176], [13.83332, 45.70855], [13.83422, 45.68703], [13.87933, 45.65207], [13.9191, 45.6322], [13.8695, 45.60835], [13.86771, 45.59898], [13.84106, 45.58185], [13.78445, 45.5825], [13.74587, 45.59811], [13.7198, 45.59352], [13.6076, 45.64761], [13.45644, 45.59464], [13.56979, 45.4895], [13.62902, 45.45898], [13.67398, 45.4436], [13.7785, 45.46787], [13.81742, 45.43729], [13.88124, 45.42637], [13.90771, 45.45149], [13.97309, 45.45258], [13.99488, 45.47551], [13.96063, 45.50825], [14.00578, 45.52352], [14.07116, 45.48752], [14.20348, 45.46896], [14.22371, 45.50388], [14.24239, 45.50607], [14.26611, 45.48239], [14.27681, 45.4902], [14.32487, 45.47142], [14.36693, 45.48642], [14.49769, 45.54424], [14.5008, 45.60852], [14.53816, 45.6205], [14.57397, 45.67165], [14.60977, 45.66403], [14.59576, 45.62812], [14.69694, 45.57366], [14.68605, 45.53006], [14.71718, 45.53442], [14.80124, 45.49515], [14.81992, 45.45913], [14.90554, 45.47769], [14.92266, 45.52788], [15.02385, 45.48533], [15.05187, 45.49079], [15.16862, 45.42309], [15.27758, 45.46678], [15.33051, 45.45258], [15.38188, 45.48752], [15.30249, 45.53224], [15.29837, 45.5841], [15.27747, 45.60504], [15.31027, 45.6303], [15.34695, 45.63382], [15.34214, 45.64702], [15.38952, 45.63682], [15.4057, 45.64727], [15.34919, 45.71623], [15.30872, 45.69014], [15.25423, 45.72275], [15.40836, 45.79491], [15.47531, 45.79802], [15.47325, 45.8253], [15.52234, 45.82195], [15.57952, 45.84953], [15.64185, 45.82915], [15.66662, 45.84085], [15.70411, 45.8465], [15.68232, 45.86819], [15.68383, 45.88867], [15.67967, 45.90455], [15.70636, 45.92116], [15.70327, 46.00015], [15.71246, 46.01196], [15.72977, 46.04682], [15.62317, 46.09103], [15.6083, 46.11992], [15.59909, 46.14761], [15.64904, 46.19229], [15.6434, 46.21396], [15.67395, 46.22478], [15.75436, 46.21969], [15.75479, 46.20336], [15.78817, 46.21719], [15.79284, 46.25811], [15.97965, 46.30652], [16.07616, 46.3463], [16.07314, 46.36458], [16.05065, 46.3833], [16.05281, 46.39141], [16.14859, 46.40547], [16.18824, 46.38282], [16.30233, 46.37837], [16.30162, 46.40437], [16.27329, 46.41467], [16.27398, 46.42875], [16.25124, 46.48067], [16.23961, 46.49653], [16.26759, 46.50566], [16.26733, 46.51505], [16.29793, 46.5121], [16.37193, 46.55008], [16.38771, 46.53608], [16.44036, 46.5171], [16.5007, 46.49644], [16.52604, 46.47831], [16.59527, 46.47524], [16.52604, 46.5051], [16.52885, 46.53303], [16.50139, 46.56684]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "SJ", + iso1A3: "SJM", + iso1N3: "744", + wikidata: "Q842829", + nameEn: "Svalbard and Jan Mayen", + country: "NO" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "SK", + iso1A3: "SVK", + iso1N3: "703", + wikidata: "Q214", + nameEn: "Slovakia", + groups: ["EU", "151", "150", "UN"], + callingCodes: ["421"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[19.82237, 49.27806], [19.78581, 49.41701], [19.72127, 49.39288], [19.6375, 49.40897], [19.64162, 49.45184], [19.57845, 49.46077], [19.53313, 49.52856], [19.52626, 49.57311], [19.45348, 49.61583], [19.37795, 49.574], [19.36009, 49.53747], [19.25435, 49.53391], [19.18019, 49.41165], [18.9742, 49.39557], [18.97283, 49.49914], [18.94536, 49.52143], [18.84521, 49.51672], [18.74761, 49.492], [18.67757, 49.50895], [18.6144, 49.49824], [18.57183, 49.51162], [18.53063, 49.49022], [18.54848, 49.47059], [18.44686, 49.39467], [18.4084, 49.40003], [18.4139, 49.36517], [18.36446, 49.3267], [18.18456, 49.28909], [18.15022, 49.24518], [18.1104, 49.08624], [18.06885, 49.03157], [17.91814, 49.01784], [17.87831, 48.92679], [17.77944, 48.92318], [17.73126, 48.87885], [17.7094, 48.86721], [17.5295, 48.81117], [17.45671, 48.85004], [17.3853, 48.80936], [17.29054, 48.85546], [17.19355, 48.87602], [17.11202, 48.82925], [17.00215, 48.70887], [16.93955, 48.60371], [16.94611, 48.53614], [16.85204, 48.44968], [16.8497, 48.38321], [16.83588, 48.3844], [16.83317, 48.38138], [16.84243, 48.35258], [16.90903, 48.32519], [16.89461, 48.31332], [16.97701, 48.17385], [17.02919, 48.13996], [17.05735, 48.14179], [17.09168, 48.09366], [17.07039, 48.0317], [17.16001, 48.00636], [17.23699, 48.02094], [17.71215, 47.7548], [18.02938, 47.75665], [18.29305, 47.73541], [18.56496, 47.76588], [18.66521, 47.76772], [18.74074, 47.8157], [18.8506, 47.82308], [18.76821, 47.87469], [18.76134, 47.97499], [18.82176, 48.04206], [19.01952, 48.07052], [19.23924, 48.0595], [19.28182, 48.08336], [19.47957, 48.09437], [19.52489, 48.19791], [19.63338, 48.25006], [19.92452, 48.1283], [20.24312, 48.2784], [20.29943, 48.26104], [20.5215, 48.53336], [20.83248, 48.5824], [21.11516, 48.49546], [21.44063, 48.58456], [21.6068, 48.50365], [21.67134, 48.3989], [21.72525, 48.34628], [21.8279, 48.33321], [21.83339, 48.36242], [22.14689, 48.4005], [22.16023, 48.56548], [22.21379, 48.6218], [22.34151, 48.68893], [22.42934, 48.92857], [22.48296, 48.99172], [22.54338, 49.01424], [22.56155, 49.08865], [22.04427, 49.22136], [21.96385, 49.3437], [21.82927, 49.39467], [21.77983, 49.35443], [21.62328, 49.4447], [21.43376, 49.41433], [21.27858, 49.45988], [21.19756, 49.4054], [21.12477, 49.43666], [21.041, 49.41791], [21.09799, 49.37176], [20.98733, 49.30774], [20.9229, 49.29626], [20.77971, 49.35383], [20.72274, 49.41813], [20.61666, 49.41791], [20.5631, 49.375], [20.46422, 49.41612], [20.39939, 49.3896], [20.31728, 49.39914], [20.31453, 49.34817], [20.21977, 49.35265], [20.13738, 49.31685], [20.08238, 49.1813], [19.98494, 49.22904], [19.90529, 49.23532], [19.86409, 49.19316], [19.75286, 49.20751], [19.82237, 49.27806]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "SL", + iso1A3: "SLE", + iso1N3: "694", + wikidata: "Q1044", + nameEn: "Sierra Leone", + groups: ["011", "202", "002", "UN"], + callingCodes: ["232"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-10.27575, 8.48711], [-10.37257, 8.48941], [-10.54891, 8.31174], [-10.63934, 8.35326], [-10.70565, 8.29235], [-10.61422, 8.5314], [-10.47707, 8.67669], [-10.56197, 8.81225], [-10.5783, 9.06386], [-10.74484, 9.07998], [-10.6534, 9.29919], [-11.2118, 10.00098], [-11.89624, 9.99763], [-11.91023, 9.93927], [-12.12634, 9.87203], [-12.24262, 9.92386], [-12.47254, 9.86834], [-12.76788, 9.3133], [-12.94095, 9.26335], [-13.08953, 9.0409], [-13.18586, 9.0925], [-13.29911, 9.04245], [-14.36218, 8.64107], [-12.15048, 6.15992], [-11.50429, 6.92704], [-11.4027, 6.97746], [-11.29417, 7.21576], [-10.60422, 7.7739], [-10.60492, 8.04072], [-10.57523, 8.04829], [-10.51554, 8.1393], [-10.45023, 8.15627], [-10.35227, 8.15223], [-10.29839, 8.21283], [-10.31635, 8.28554], [-10.30084, 8.30008], [-10.27575, 8.48711]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "SM", + iso1A3: "SMR", + iso1N3: "674", + wikidata: "Q238", + nameEn: "San Marino", + groups: ["039", "150", "UN"], + callingCodes: ["378"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[12.45648, 43.89369], [12.48771, 43.89706], [12.49429, 43.90973], [12.49247, 43.91774], [12.49724, 43.92248], [12.50269, 43.92363], [12.50496, 43.93017], [12.51553, 43.94096], [12.51427, 43.94897], [12.50655, 43.95796], [12.50875, 43.96198], [12.50622, 43.97131], [12.51109, 43.97201], [12.51064, 43.98165], [12.5154, 43.98508], [12.51463, 43.99122], [12.50678, 43.99113], [12.49406, 43.98492], [12.47853, 43.98052], [12.46205, 43.97463], [12.44684, 43.96597], [12.43662, 43.95698], [12.42005, 43.9578], [12.41414, 43.95273], [12.40415, 43.95485], [12.40506, 43.94325], [12.41165, 43.93769], [12.41551, 43.92984], [12.40733, 43.92379], [12.41233, 43.90956], [12.40935, 43.9024], [12.41641, 43.89991], [12.44184, 43.90498], [12.45648, 43.89369]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "SN", + iso1A3: "SEN", + iso1N3: "686", + wikidata: "Q1041", + nameEn: "Senegal", + groups: ["011", "202", "002", "UN"], + callingCodes: ["221"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-14.32144, 16.61495], [-15.00557, 16.64997], [-15.6509, 16.50315], [-16.27016, 16.51565], [-16.4429, 16.20605], [-16.44814, 16.09753], [-16.48967, 16.0496], [-16.50854, 16.09032], [-17.15288, 16.07139], [-18.35085, 14.63444], [-17.43598, 13.59273], [-15.47902, 13.58758], [-15.36504, 13.79313], [-14.93719, 13.80173], [-14.34721, 13.46578], [-13.8955, 13.59126], [-13.79409, 13.34472], [-14.36795, 13.23033], [-15.14917, 13.57989], [-15.26908, 13.37768], [-15.80478, 13.34832], [-15.80355, 13.16729], [-16.69343, 13.16791], [-16.74676, 13.06025], [-17.43966, 13.04579], [-17.4623, 11.92379], [-16.70562, 12.34803], [-16.38191, 12.36449], [-16.20591, 12.46157], [-15.67302, 12.42974], [-15.17582, 12.6847], [-13.70523, 12.68013], [-13.05296, 12.64003], [-13.06603, 12.49342], [-12.87336, 12.51892], [-12.35415, 12.32758], [-11.91331, 12.42008], [-11.46267, 12.44559], [-11.37536, 12.40788], [-11.39935, 12.97808], [-11.63025, 13.39174], [-11.83345, 13.33333], [-12.06897, 13.71049], [-11.93043, 13.84505], [-12.23936, 14.76324], [-13.11029, 15.52116], [-13.43135, 16.09022], [-13.80075, 16.13961], [-14.32144, 16.61495]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "SO", + iso1A3: "SOM", + iso1N3: "706", + wikidata: "Q1045", + nameEn: "Somalia", + groups: ["014", "202", "002", "UN"], + callingCodes: ["252"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[51.12877, 12.56479], [43.90659, 12.3823], [42.95776, 10.98533], [42.69452, 10.62672], [42.87643, 10.18441], [43.0937, 9.90579], [43.23518, 9.84605], [43.32613, 9.59205], [44.19222, 8.93028], [46.99339, 7.9989], [47.92477, 8.00111], [47.97917, 8.00124], [44.98104, 4.91821], [44.02436, 4.9451], [43.40263, 4.79289], [43.04177, 4.57923], [42.97746, 4.44032], [42.84526, 4.28357], [42.55853, 4.20518], [42.07619, 4.17667], [41.89488, 3.97375], [41.31368, 3.14314], [40.98767, 2.82959], [41.00099, -0.83068], [41.56, -1.59812], [41.56362, -1.66375], [41.75542, -1.85308], [57.49095, 8.14549], [51.12877, 12.56479]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "SR", + iso1A3: "SUR", + iso1N3: "740", + wikidata: "Q730", + nameEn: "Suriname", + groups: ["005", "419", "019", "UN"], + driveSide: "left", + callingCodes: ["597"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-54.26916, 5.26909], [-54.01877, 5.52789], [-54.01074, 5.68785], [-53.7094, 6.2264], [-56.84822, 6.73257], [-57.31629, 5.33714], [-57.22536, 5.15605], [-57.37442, 5.0208], [-57.8699, 4.89394], [-58.0307, 3.95513], [-57.35891, 3.32121], [-56.70519, 2.02964], [-56.55439, 2.02003], [-56.47045, 1.95135], [-55.99278, 1.83137], [-55.89863, 1.89861], [-55.92159, 2.05236], [-56.13054, 2.27723], [-55.96292, 2.53188], [-55.71493, 2.40342], [-55.01919, 2.564], [-54.6084, 2.32856], [-54.42864, 2.42442], [-54.28534, 2.67798], [-53.9849, 3.58697], [-53.98914, 3.627], [-54.05128, 3.63557], [-54.19367, 3.84387], [-54.38444, 4.13222], [-54.4717, 4.91964], [-54.26916, 5.26909]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "SS", + iso1A3: "SSD", + iso1N3: "728", + wikidata: "Q958", + nameEn: "South Sudan", + groups: ["014", "202", "002", "UN"], + callingCodes: ["211"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[34.10229, 9.50238], [33.87958, 9.49937], [33.9082, 9.762], [33.96323, 9.80972], [33.99185, 9.99623], [33.96984, 10.15446], [33.90159, 10.17179], [33.80913, 10.32994], [33.66604, 10.44254], [33.52294, 10.64382], [33.24645, 10.77913], [33.26977, 10.83632], [33.13988, 11.43248], [33.25876, 12.22111], [32.73921, 12.22757], [32.73921, 11.95203], [32.10079, 11.95203], [32.39578, 11.70208], [32.39358, 11.18207], [32.46967, 11.04662], [31.99177, 10.65065], [31.77539, 10.28939], [31.28504, 9.75287], [30.84605, 9.7498], [30.82893, 9.71451], [30.53005, 9.95992], [30.00389, 10.28633], [29.94629, 10.29245], [29.54, 10.07949], [29.53844, 9.75133], [29.06988, 9.74826], [28.99983, 9.67155], [27.90704, 9.61323], [27.14427, 9.62858], [26.70685, 9.48735], [26.35815, 9.57946], [26.21338, 9.91545], [25.93241, 10.17941], [25.93163, 10.38159], [25.78141, 10.42599], [25.0918, 10.33718], [25.05688, 10.06776], [24.97739, 9.9081], [24.84653, 9.80643], [24.49389, 9.79962], [24.12744, 9.73784], [24.09319, 9.66572], [23.69155, 9.67566], [23.62179, 9.53823], [23.64981, 9.44303], [23.64358, 9.28637], [23.56263, 9.19418], [23.4848, 9.16959], [23.44744, 8.99128], [23.59065, 8.99743], [23.51905, 8.71749], [24.25691, 8.69288], [24.13238, 8.36959], [24.35965, 8.26177], [24.85156, 8.16933], [24.98855, 7.96588], [25.25319, 7.8487], [25.29214, 7.66675], [25.20649, 7.61115], [25.20337, 7.50312], [25.35281, 7.42595], [25.37461, 7.33024], [25.90076, 7.09549], [26.38022, 6.63493], [26.32729, 6.36272], [26.58259, 6.1987], [26.51721, 6.09655], [27.22705, 5.71254], [27.22705, 5.62889], [27.28621, 5.56382], [27.23017, 5.37167], [27.26886, 5.25876], [27.44012, 5.07349], [27.56656, 4.89375], [27.65462, 4.89375], [27.76469, 4.79284], [27.79551, 4.59976], [28.20719, 4.35614], [28.6651, 4.42638], [28.8126, 4.48784], [29.03054, 4.48784], [29.22207, 4.34297], [29.43341, 4.50101], [29.49726, 4.7007], [29.82087, 4.56246], [29.79666, 4.37809], [30.06964, 4.13221], [30.1621, 4.10586], [30.22374, 3.93896], [30.27658, 3.95653], [30.47691, 3.83353], [30.55396, 3.84451], [30.57378, 3.74567], [30.56277, 3.62703], [30.78512, 3.67097], [30.80713, 3.60506], [30.85997, 3.5743], [30.85153, 3.48867], [30.97601, 3.693], [31.16666, 3.79853], [31.29476, 3.8015], [31.50478, 3.67814], [31.50776, 3.63652], [31.72075, 3.74354], [31.81459, 3.82083], [31.86821, 3.78664], [31.96205, 3.6499], [31.95907, 3.57408], [32.05187, 3.589], [32.08491, 3.56287], [32.08866, 3.53543], [32.19888, 3.50867], [32.20782, 3.6053], [32.41337, 3.748], [32.72021, 3.77327], [32.89746, 3.81339], [33.02852, 3.89296], [33.18356, 3.77812], [33.51264, 3.75068], [33.9873, 4.23316], [34.47601, 4.72162], [35.34151, 5.02364], [35.30992, 4.90402], [35.47843, 4.91872], [35.42366, 4.76969], [35.51424, 4.61643], [35.9419, 4.61933], [35.82118, 4.77382], [35.81968, 5.10757], [35.8576, 5.33413], [35.50792, 5.42431], [35.29938, 5.34042], [35.31188, 5.50106], [35.13058, 5.62118], [35.12611, 5.68937], [35.00546, 5.89387], [34.96227, 6.26415], [35.01738, 6.46991], [34.87736, 6.60161], [34.77459, 6.5957], [34.65096, 6.72589], [34.53776, 6.74808], [34.53925, 6.82794], [34.47669, 6.91076], [34.35753, 6.91963], [34.19369, 7.04382], [34.19369, 7.12807], [34.01495, 7.25664], [34.03878, 7.27437], [34.02984, 7.36449], [33.87642, 7.5491], [33.71407, 7.65983], [33.44745, 7.7543], [33.32531, 7.71297], [33.24637, 7.77939], [33.04944, 7.78989], [33.0006, 7.90333], [33.08401, 8.05822], [33.18083, 8.13047], [33.1853, 8.29264], [33.19721, 8.40317], [33.3119, 8.45474], [33.54575, 8.47094], [33.66938, 8.44442], [33.71407, 8.3678], [33.87195, 8.41938], [33.89579, 8.4842], [34.01346, 8.50041], [34.14453, 8.60204], [34.14304, 9.04654], [34.10229, 9.50238]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "ST", + iso1A3: "STP", + iso1N3: "678", + wikidata: "Q1039", + nameEn: "S\xE3o Tom\xE9 and Principe", + groups: ["017", "202", "002", "UN"], + callingCodes: ["239"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[4.34149, 1.91417], [6.6507, -0.28606], [7.9035, 1.92304], [4.34149, 1.91417]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "SV", + iso1A3: "SLV", + iso1N3: "222", + wikidata: "Q792", + nameEn: "El Salvador", + groups: ["013", "003", "419", "019", "UN"], + callingCodes: ["503"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-89.34776, 14.43013], [-89.39028, 14.44561], [-89.57441, 14.41637], [-89.58814, 14.33165], [-89.50614, 14.26084], [-89.52397, 14.22628], [-89.61844, 14.21937], [-89.70756, 14.1537], [-89.75569, 14.07073], [-89.73251, 14.04133], [-89.76103, 14.02923], [-89.81807, 14.07073], [-89.88937, 14.0396], [-90.10505, 13.85104], [-90.11344, 13.73679], [-90.55276, 12.8866], [-88.11443, 12.63306], [-87.7346, 13.13228], [-87.55124, 13.12523], [-87.69751, 13.25228], [-87.73714, 13.32715], [-87.80177, 13.35689], [-87.84675, 13.41078], [-87.83467, 13.44655], [-87.77354, 13.45767], [-87.73841, 13.44169], [-87.72115, 13.46083], [-87.71657, 13.50577], [-87.78148, 13.52906], [-87.73106, 13.75443], [-87.68821, 13.80829], [-87.7966, 13.91353], [-88.00331, 13.86948], [-88.07641, 13.98447], [-88.23018, 13.99915], [-88.25791, 13.91108], [-88.48982, 13.86458], [-88.49738, 13.97224], [-88.70661, 14.04317], [-88.73182, 14.10919], [-88.815, 14.11652], [-88.85785, 14.17763], [-88.94608, 14.20207], [-89.04187, 14.33644], [-89.34776, 14.43013]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "SX", + iso1A3: "SXM", + iso1N3: "534", + wikidata: "Q26273", + nameEn: "Sint Maarten", + aliases: ["NL-SX"], + country: "NL", + groups: ["Q1451600", "029", "003", "419", "019", "UN"], + callingCodes: ["1 721"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-63.33064, 17.9615], [-63.1055, 17.86651], [-62.93924, 18.02904], [-63.02323, 18.05757], [-63.04039, 18.05619], [-63.0579, 18.06614], [-63.07759, 18.04943], [-63.09686, 18.04608], [-63.11042, 18.05339], [-63.13502, 18.05445], [-63.33064, 17.9615]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "SY", + iso1A3: "SYR", + iso1N3: "760", + wikidata: "Q858", + nameEn: "Syria", + groups: ["145", "142", "UN"], + callingCodes: ["963"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[42.23683, 37.2863], [42.21548, 37.28026], [42.20454, 37.28715], [42.22381, 37.30238], [42.22257, 37.31395], [42.2112, 37.32491], [42.19301, 37.31323], [42.18225, 37.28569], [42.00894, 37.17209], [41.515, 37.08084], [41.21937, 37.07665], [40.90856, 37.13147], [40.69136, 37.0996], [39.81589, 36.75538], [39.21538, 36.66834], [39.03217, 36.70911], [38.74042, 36.70629], [38.55908, 36.84429], [38.38859, 36.90064], [38.21064, 36.91842], [37.81974, 36.76055], [37.68048, 36.75065], [37.49103, 36.66904], [37.47253, 36.63243], [37.21988, 36.6736], [37.16177, 36.66069], [37.10894, 36.6704], [37.08279, 36.63495], [37.02088, 36.66422], [37.01647, 36.69512], [37.04619, 36.71101], [37.04399, 36.73483], [36.99886, 36.74012], [36.99557, 36.75997], [36.66727, 36.82901], [36.61581, 36.74629], [36.62681, 36.71189], [36.57398, 36.65186], [36.58829, 36.58295], [36.54206, 36.49539], [36.6081, 36.33772], [36.65653, 36.33861], [36.68672, 36.23677], [36.6125, 36.22592], [36.50463, 36.2419], [36.4617, 36.20461], [36.39206, 36.22088], [36.37474, 36.01163], [36.33956, 35.98687], [36.30099, 36.00985], [36.28338, 36.00273], [36.29769, 35.96086], [36.27678, 35.94839], [36.25366, 35.96264], [36.19973, 35.95195], [36.17441, 35.92076], [36.1623, 35.80925], [36.14029, 35.81015], [36.13919, 35.83692], [36.11827, 35.85923], [35.99829, 35.88242], [36.01844, 35.92403], [36.00514, 35.94113], [35.98499, 35.94107], [35.931, 35.92109], [35.51152, 36.10954], [35.48515, 34.70851], [35.97386, 34.63322], [35.98718, 34.64977], [36.29165, 34.62991], [36.32399, 34.69334], [36.35135, 34.68516], [36.35384, 34.65447], [36.42941, 34.62505], [36.46003, 34.6378], [36.45299, 34.59438], [36.41429, 34.61175], [36.39846, 34.55672], [36.3369, 34.52629], [36.34745, 34.5002], [36.4442, 34.50165], [36.46179, 34.46541], [36.55853, 34.41609], [36.53039, 34.3798], [36.56556, 34.31881], [36.60778, 34.31009], [36.58667, 34.27667], [36.59195, 34.2316], [36.62537, 34.20251], [36.5128, 34.09916], [36.50576, 34.05982], [36.41078, 34.05253], [36.28589, 33.91981], [36.38263, 33.86579], [36.3967, 33.83365], [36.14517, 33.85118], [36.06778, 33.82927], [35.9341, 33.6596], [36.05723, 33.57904], [35.94465, 33.52774], [35.94816, 33.47886], [35.88668, 33.43183], [35.82577, 33.40479], [35.81324, 33.36354], [35.77477, 33.33609], [35.813, 33.3172], [35.77513, 33.27342], [35.81295, 33.24841], [35.81647, 33.2028], [35.83846, 33.19397], [35.84285, 33.16673], [35.81911, 33.1336], [35.81911, 33.11077], [35.84802, 33.1031], [35.87188, 32.98028], [35.89298, 32.9456], [35.87012, 32.91976], [35.84021, 32.8725], [35.83758, 32.82817], [35.78745, 32.77938], [35.75983, 32.74803], [35.88405, 32.71321], [35.93307, 32.71966], [35.96633, 32.66237], [36.02239, 32.65911], [36.08074, 32.51463], [36.20379, 32.52751], [36.20875, 32.49529], [36.23948, 32.50108], [36.40959, 32.37908], [36.83946, 32.31293], [38.79171, 33.37328], [40.64314, 34.31604], [40.97676, 34.39788], [41.12388, 34.65742], [41.2345, 34.80049], [41.21654, 35.1508], [41.26569, 35.42708], [41.38184, 35.62502], [41.37027, 35.84095], [41.2564, 36.06012], [41.28864, 36.35368], [41.40058, 36.52502], [41.81736, 36.58782], [42.36697, 37.0627], [42.35724, 37.10998], [42.32313, 37.17814], [42.34735, 37.22548], [42.2824, 37.2798], [42.26039, 37.27017], [42.23683, 37.2863]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "SZ", + iso1A3: "SWZ", + iso1N3: "748", + wikidata: "Q1050", + nameEn: "Eswatini", + aliases: ["Swaziland"], + groups: ["018", "202", "002", "UN"], + driveSide: "left", + callingCodes: ["268"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[31.86881, -25.99973], [31.4175, -25.71886], [31.31237, -25.7431], [31.13073, -25.91558], [30.95819, -26.26303], [30.78927, -26.48271], [30.81101, -26.84722], [30.88826, -26.79622], [30.97757, -26.92706], [30.96088, -27.0245], [31.15027, -27.20151], [31.49834, -27.31549], [31.97592, -27.31675], [31.97463, -27.11057], [32.00893, -26.8096], [32.09664, -26.80721], [32.13315, -26.84345], [32.13409, -26.5317], [32.07352, -26.40185], [32.10435, -26.15656], [32.08599, -26.00978], [32.00916, -25.999], [31.974, -25.95387], [31.86881, -25.99973]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "TA", + iso1A3: "TAA", + wikidata: "Q220982", + nameEn: "Tristan da Cunha", + aliases: ["SH-TA"], + country: "GB", + groups: ["SH", "BOTS", "011", "202", "002", "UN"], + isoStatus: "excRes", + driveSide: "left", + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["290 8", "44 20"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-13.38232, -34.07258], [-16.67337, -41.9188], [-5.88482, -41.4829], [-13.38232, -34.07258]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "TC", + iso1A3: "TCA", + iso1N3: "796", + wikidata: "Q18221", + nameEn: "Turks and Caicos Islands", + country: "GB", + groups: ["BOTS", "029", "003", "419", "019", "UN"], + driveSide: "left", + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["1 649"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-71.70065, 25.7637], [-72.98446, 20.4801], [-69.80718, 21.35956], [-71.70065, 25.7637]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "TD", + iso1A3: "TCD", + iso1N3: "148", + wikidata: "Q657", + nameEn: "Chad", + groups: ["017", "202", "002", "UN"], + callingCodes: ["235"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[23.99539, 19.49944], [15.99566, 23.49639], [14.99751, 23.00539], [15.19692, 21.99339], [15.20213, 21.49365], [15.28332, 21.44557], [15.62515, 20.95395], [15.57248, 20.92138], [15.55382, 20.86507], [15.56004, 20.79488], [15.59841, 20.74039], [15.6721, 20.70069], [15.99632, 20.35364], [15.75098, 19.93002], [15.6032, 18.77402], [15.50373, 16.89649], [14.37425, 15.72591], [13.86301, 15.04043], [13.78991, 14.87519], [13.809, 14.72915], [13.67878, 14.64013], [13.68573, 14.55276], [13.48259, 14.46704], [13.47559, 14.40881], [13.6302, 13.71094], [14.08251, 13.0797], [14.46881, 13.08259], [14.56101, 12.91036], [14.55058, 12.78256], [14.83314, 12.62963], [14.90827, 12.3269], [14.89019, 12.16593], [14.96952, 12.0925], [15.00146, 12.1223], [15.0349, 12.10698], [15.05786, 12.0608], [15.04808, 11.8731], [15.11579, 11.79313], [15.06595, 11.71126], [15.13149, 11.5537], [15.0585, 11.40481], [15.10021, 11.04101], [15.04957, 11.02347], [15.09127, 10.87431], [15.06737, 10.80921], [15.15532, 10.62846], [15.14936, 10.53915], [15.23724, 10.47764], [15.30874, 10.31063], [15.50535, 10.1098], [15.68761, 9.99344], [15.41408, 9.92876], [15.24618, 9.99246], [15.14043, 9.99246], [15.05999, 9.94845], [14.95722, 9.97926], [14.80082, 9.93818], [14.4673, 10.00264], [14.20411, 10.00055], [14.1317, 9.82413], [14.01793, 9.73169], [13.97544, 9.6365], [14.37094, 9.2954], [14.35707, 9.19611], [14.83566, 8.80557], [15.09484, 8.65982], [15.20426, 8.50892], [15.50743, 7.79302], [15.59272, 7.7696], [15.56964, 7.58936], [15.49743, 7.52179], [15.73118, 7.52006], [15.79942, 7.44149], [16.40703, 7.68809], [16.41583, 7.77971], [16.58315, 7.88657], [16.59415, 7.76444], [16.658, 7.75353], [16.6668, 7.67281], [16.8143, 7.53971], [17.67288, 7.98905], [17.93926, 7.95853], [18.02731, 8.01085], [18.6085, 8.05009], [18.64153, 8.08714], [18.62612, 8.14163], [18.67455, 8.22226], [18.79783, 8.25929], [19.11044, 8.68172], [18.86388, 8.87971], [19.06421, 9.00367], [20.36748, 9.11019], [20.82979, 9.44696], [21.26348, 9.97642], [21.34934, 9.95907], [21.52766, 10.2105], [21.63553, 10.217], [21.71479, 10.29932], [21.72139, 10.64136], [22.45889, 11.00246], [22.87758, 10.91915], [22.97249, 11.21955], [22.93124, 11.41645], [22.7997, 11.40424], [22.54907, 11.64372], [22.64092, 12.07485], [22.48369, 12.02766], [22.50548, 12.16769], [22.38873, 12.45514], [22.46345, 12.61925], [22.22684, 12.74682], [22.15679, 12.66634], [21.98711, 12.63292], [21.89371, 12.68001], [21.81432, 12.81362], [21.94819, 13.05637], [22.02914, 13.13976], [22.1599, 13.19281], [22.29689, 13.3731], [22.08674, 13.77863], [22.22995, 13.96754], [22.5553, 14.11704], [22.55997, 14.23024], [22.44944, 14.24986], [22.38562, 14.58907], [22.70474, 14.69149], [22.66115, 14.86308], [22.99584, 15.22989], [22.99584, 15.40105], [22.92579, 15.47007], [22.93201, 15.55107], [23.10792, 15.71297], [23.38812, 15.69649], [23.62785, 15.7804], [23.99997, 15.69575], [23.99539, 19.49944]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "TF", + iso1A3: "ATF", + iso1N3: "260", + wikidata: "Q129003", + nameEn: "French Southern Territories", + country: "FR" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "TG", + iso1A3: "TGO", + iso1N3: "768", + wikidata: "Q945", + nameEn: "Togo", + groups: ["011", "202", "002", "UN"], + callingCodes: ["228"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[0.50388, 11.01011], [-0.13493, 11.14075], [-0.14462, 11.10811], [-0.05733, 11.08628], [-0.0275, 11.11202], [-514e-5, 11.10763], [342e-5, 11.08317], [0.02395, 11.06229], [0.03355, 10.9807], [-63e-4, 10.96417], [-908e-5, 10.91644], [-0.02685, 10.8783], [-0.0228, 10.81916], [-0.07183, 10.76794], [-0.07327, 10.71845], [-0.09141, 10.7147], [-0.05945, 10.63458], [0.12886, 10.53149], [0.18846, 10.4096], [0.29453, 10.41546], [0.33028, 10.30408], [0.39584, 10.31112], [0.35293, 10.09412], [0.41371, 10.06361], [0.41252, 10.02018], [0.36366, 10.03309], [0.32075, 9.72781], [0.34816, 9.71607], [0.34816, 9.66907], [0.32313, 9.6491], [0.28261, 9.69022], [0.26712, 9.66437], [0.29334, 9.59387], [0.36008, 9.6256], [0.38153, 9.58682], [0.23851, 9.57389], [0.2409, 9.52335], [0.30406, 9.521], [0.31241, 9.50337], [0.2254, 9.47869], [0.25758, 9.42696], [0.33148, 9.44812], [0.36485, 9.49749], [0.49118, 9.48339], [0.56388, 9.40697], [0.45424, 9.04581], [0.52455, 8.87746], [0.37319, 8.75262], [0.47211, 8.59945], [0.64731, 8.48866], [0.73432, 8.29529], [0.63897, 8.25873], [0.5913, 8.19622], [0.61156, 8.18324], [0.6056, 8.13959], [0.58891, 8.12779], [0.62943, 7.85751], [0.58295, 7.62368], [0.51979, 7.58706], [0.52455, 7.45354], [0.57223, 7.39326], [0.62943, 7.41099], [0.65327, 7.31643], [0.59606, 7.01252], [0.52217, 6.9723], [0.52098, 6.94391], [0.56508, 6.92971], [0.52853, 6.82921], [0.57406, 6.80348], [0.58176, 6.76049], [0.6497, 6.73682], [0.63659, 6.63857], [0.74862, 6.56517], [0.71048, 6.53083], [0.89283, 6.33779], [0.99652, 6.33779], [1.03108, 6.24064], [1.05969, 6.22998], [1.09187, 6.17074], [1.19966, 6.17069], [1.19771, 6.11522], [1.27574, 5.93551], [1.67336, 6.02702], [1.62913, 6.24075], [1.79826, 6.28221], [1.76906, 6.43189], [1.58105, 6.68619], [1.61812, 6.74843], [1.55877, 6.99737], [1.64249, 6.99562], [1.61838, 9.0527], [1.5649, 9.16941], [1.41746, 9.3226], [1.33675, 9.54765], [1.36624, 9.5951], [1.35507, 9.99525], [0.77666, 10.37665], [0.80358, 10.71459], [0.8804, 10.803], [0.91245, 10.99597], [0.66104, 10.99964], [0.4958, 10.93269], [0.50521, 10.98035], [0.48852, 10.98561], [0.50388, 11.01011]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "TH", + iso1A3: "THA", + iso1N3: "764", + wikidata: "Q869", + nameEn: "Thailand", + groups: ["035", "142", "UN"], + driveSide: "left", + callingCodes: ["66"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[100.08404, 20.36626], [99.95721, 20.46301], [99.91616, 20.44986], [99.90499, 20.4487], [99.89692, 20.44789], [99.89301, 20.44311], [99.89168, 20.44548], [99.88451, 20.44596], [99.88211, 20.44488], [99.86383, 20.44371], [99.81096, 20.33687], [99.68255, 20.32077], [99.46008, 20.39673], [99.46077, 20.36198], [99.5569, 20.20676], [99.52943, 20.14811], [99.416, 20.08614], [99.20328, 20.12877], [99.0735, 20.10298], [98.98679, 19.7419], [98.83661, 19.80931], [98.56065, 19.67807], [98.51182, 19.71303], [98.24884, 19.67876], [98.13829, 19.78541], [98.03314, 19.80941], [98.04364, 19.65755], [97.84715, 19.55782], [97.88423, 19.5041], [97.78769, 19.39429], [97.84186, 19.29526], [97.78606, 19.26769], [97.84024, 19.22217], [97.83479, 19.09972], [97.73797, 19.04261], [97.73654, 18.9812], [97.66487, 18.9371], [97.73836, 18.88478], [97.76752, 18.58097], [97.5258, 18.4939], [97.36444, 18.57138], [97.34522, 18.54596], [97.50383, 18.26844], [97.56219, 18.33885], [97.64116, 18.29778], [97.60841, 18.23846], [97.73723, 17.97912], [97.66794, 17.88005], [97.76407, 17.71595], [97.91829, 17.54504], [98.11185, 17.36829], [98.10439, 17.33847], [98.34566, 17.04822], [98.39441, 17.06266], [98.52624, 16.89979], [98.49603, 16.8446], [98.53833, 16.81934], [98.46994, 16.73613], [98.50253, 16.7139], [98.49713, 16.69022], [98.51043, 16.70107], [98.51579, 16.69433], [98.51472, 16.68521], [98.51833, 16.676], [98.51113, 16.64503], [98.5695, 16.62826], [98.57912, 16.55983], [98.63817, 16.47424], [98.68074, 16.27068], [98.84485, 16.42354], [98.92656, 16.36425], [98.8376, 16.11706], [98.69585, 16.13353], [98.57019, 16.04578], [98.59853, 15.87197], [98.541, 15.65406], [98.58598, 15.46821], [98.56027, 15.33471], [98.4866, 15.39154], [98.39351, 15.34177], [98.41906, 15.27103], [98.40522, 15.25268], [98.30446, 15.30667], [98.22, 15.21327], [98.18821, 15.13125], [98.24874, 14.83013], [98.56762, 14.37701], [98.97356, 14.04868], [99.16695, 13.72621], [99.20617, 13.20575], [99.12225, 13.19847], [99.10646, 13.05804], [99.18748, 12.9898], [99.18905, 12.84799], [99.29254, 12.68921], [99.409, 12.60603], [99.47519, 12.1353], [99.56445, 12.14805], [99.53424, 12.02317], [99.64891, 11.82699], [99.64108, 11.78948], [99.5672, 11.62732], [99.47598, 11.62434], [99.39485, 11.3925], [99.31573, 11.32081], [99.32756, 11.28545], [99.06938, 10.94857], [99.02337, 10.97217], [98.99701, 10.92962], [99.0069, 10.85485], [98.86819, 10.78336], [98.78511, 10.68351], [98.77275, 10.62548], [98.81944, 10.52761], [98.7391, 10.31488], [98.55174, 9.92804], [98.52291, 9.92389], [98.47298, 9.95782], [98.33094, 9.91973], [98.12555, 9.44056], [97.63455, 9.60854], [97.19814, 8.18901], [99.31854, 5.99868], [99.50117, 6.44501], [99.91873, 6.50233], [100.0756, 6.4045], [100.12, 6.42105], [100.19511, 6.72559], [100.29651, 6.68439], [100.30828, 6.66462], [100.31618, 6.66781], [100.31884, 6.66423], [100.32671, 6.66526], [100.32607, 6.65933], [100.31929, 6.65413], [100.35413, 6.54932], [100.41152, 6.52299], [100.41791, 6.5189], [100.42351, 6.51762], [100.43027, 6.52389], [100.66986, 6.45086], [100.74361, 6.50811], [100.74822, 6.46231], [100.81045, 6.45086], [100.85884, 6.24929], [101.10313, 6.25617], [101.12618, 6.19431], [101.06165, 6.14161], [101.12388, 6.11411], [101.087, 5.9193], [101.02708, 5.91013], [100.98815, 5.79464], [101.14062, 5.61613], [101.25755, 5.71065], [101.25524, 5.78633], [101.58019, 5.93534], [101.69773, 5.75881], [101.75074, 5.79091], [101.80144, 5.74505], [101.89188, 5.8386], [101.91776, 5.84269], [101.92819, 5.85511], [101.94712, 5.98421], [101.9714, 6.00575], [101.97114, 6.01992], [101.99209, 6.04075], [102.01835, 6.05407], [102.09182, 6.14161], [102.07732, 6.193], [102.08127, 6.22679], [102.09086, 6.23546], [102.46318, 7.22462], [102.47649, 9.66162], [102.52395, 11.25257], [102.91449, 11.65512], [102.90973, 11.75613], [102.83957, 11.8519], [102.78427, 11.98746], [102.77026, 12.06815], [102.70176, 12.1686], [102.73134, 12.37091], [102.78116, 12.40284], [102.7796, 12.43781], [102.57567, 12.65358], [102.51963, 12.66117], [102.4994, 12.71736], [102.53053, 12.77506], [102.49335, 12.92711], [102.48694, 12.97537], [102.52275, 12.99813], [102.46011, 13.08057], [102.43422, 13.09061], [102.36146, 13.26006], [102.36001, 13.31142], [102.34611, 13.35618], [102.35692, 13.38274], [102.35563, 13.47307], [102.361, 13.50551], [102.33828, 13.55613], [102.36859, 13.57488], [102.44601, 13.5637], [102.5358, 13.56933], [102.57573, 13.60461], [102.62483, 13.60883], [102.58635, 13.6286], [102.5481, 13.6589], [102.56848, 13.69366], [102.72727, 13.77806], [102.77864, 13.93374], [102.91251, 14.01531], [102.93275, 14.19044], [103.16469, 14.33075], [103.39353, 14.35639], [103.53518, 14.42575], [103.71109, 14.4348], [103.70175, 14.38052], [103.93836, 14.3398], [104.27616, 14.39861], [104.55014, 14.36091], [104.69335, 14.42726], [104.97667, 14.38806], [105.02804, 14.23722], [105.08408, 14.20402], [105.14012, 14.23873], [105.17748, 14.34432], [105.20894, 14.34967], [105.43783, 14.43865], [105.53864, 14.55731], [105.5121, 14.80802], [105.61162, 15.00037], [105.46661, 15.13132], [105.58043, 15.32724], [105.50662, 15.32054], [105.4692, 15.33709], [105.47635, 15.3796], [105.58191, 15.41031], [105.60446, 15.53301], [105.61756, 15.68792], [105.46573, 15.74742], [105.42285, 15.76971], [105.37959, 15.84074], [105.34115, 15.92737], [105.38508, 15.987], [105.42001, 16.00657], [105.06204, 16.09792], [105.00262, 16.25627], [104.88057, 16.37311], [104.73349, 16.565], [104.76099, 16.69302], [104.7397, 16.81005], [104.76442, 16.84752], [104.7373, 16.91125], [104.73712, 17.01404], [104.80716, 17.19025], [104.80061, 17.39367], [104.69867, 17.53038], [104.45404, 17.66788], [104.35432, 17.82871], [104.2757, 17.86139], [104.21776, 17.99335], [104.10927, 18.10826], [104.06533, 18.21656], [103.97725, 18.33631], [103.93916, 18.33914], [103.85642, 18.28666], [103.82449, 18.33979], [103.699, 18.34125], [103.60957, 18.40528], [103.47773, 18.42841], [103.41044, 18.4486], [103.30977, 18.4341], [103.24779, 18.37807], [103.23818, 18.34875], [103.29757, 18.30475], [103.17093, 18.2618], [103.14994, 18.23172], [103.1493, 18.17799], [103.07343, 18.12351], [103.07823, 18.03833], [103.0566, 18.00144], [103.01998, 17.97095], [102.9912, 17.9949], [102.95812, 18.0054], [102.86323, 17.97531], [102.81988, 17.94233], [102.79044, 17.93612], [102.75954, 17.89561], [102.68538, 17.86653], [102.67543, 17.84529], [102.69946, 17.81686], [102.68194, 17.80151], [102.59485, 17.83537], [102.5896, 17.84889], [102.61432, 17.92273], [102.60971, 17.95411], [102.59234, 17.96127], [102.45523, 17.97106], [102.11359, 18.21532], [101.88485, 18.02474], [101.78087, 18.07559], [101.72294, 17.92867], [101.44667, 17.7392], [101.15108, 17.47586], [100.96541, 17.57926], [101.02185, 17.87637], [101.1793, 18.0544], [101.19118, 18.2125], [101.15108, 18.25624], [101.18227, 18.34367], [101.06047, 18.43247], [101.27585, 18.68875], [101.22832, 18.73377], [101.25803, 18.89545], [101.35606, 19.04716], [101.261, 19.12717], [101.24911, 19.33334], [101.20604, 19.35296], [101.21347, 19.46223], [101.26991, 19.48324], [101.26545, 19.59242], [101.08928, 19.59748], [100.90302, 19.61901], [100.77231, 19.48324], [100.64606, 19.55884], [100.58219, 19.49164], [100.49604, 19.53504], [100.398, 19.75047], [100.5094, 19.87904], [100.58808, 20.15791], [100.55218, 20.17741], [100.51052, 20.14928], [100.47567, 20.19133], [100.4537, 20.19971], [100.44992, 20.23644], [100.41473, 20.25625], [100.37439, 20.35156], [100.33383, 20.4028], [100.25769, 20.3992], [100.22076, 20.31598], [100.16668, 20.2986], [100.1712, 20.24324], [100.11785, 20.24787], [100.09337, 20.26293], [100.09999, 20.31614], [100.08404, 20.36626]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "TJ", + iso1A3: "TJK", + iso1N3: "762", + wikidata: "Q863", + nameEn: "Tajikistan", + groups: ["143", "142", "UN"], + callingCodes: ["992"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[70.45251, 41.04438], [70.38028, 41.02014], [70.36655, 40.90296], [69.69434, 40.62615], [69.59441, 40.70181], [69.53021, 40.77621], [69.38327, 40.7918], [69.32834, 40.70233], [69.3455, 40.57988], [69.2643, 40.57506], [69.21063, 40.54469], [69.27066, 40.49274], [69.28525, 40.41894], [69.30774, 40.36102], [69.33794, 40.34819], [69.32833, 40.29794], [69.30808, 40.2821], [69.24817, 40.30357], [69.25229, 40.26362], [69.30104, 40.24502], [69.30448, 40.18774], [69.2074, 40.21488], [69.15659, 40.2162], [69.04544, 40.22904], [68.85832, 40.20885], [68.84357, 40.18604], [68.79276, 40.17555], [68.77902, 40.20492], [68.5332, 40.14826], [68.52771, 40.11676], [68.62796, 40.07789], [69.01523, 40.15771], [69.01935, 40.11466], [68.96579, 40.06949], [68.84906, 40.04952], [68.93695, 39.91167], [68.88889, 39.87163], [68.63071, 39.85265], [68.61972, 39.68905], [68.54166, 39.53929], [68.12053, 39.56317], [67.70992, 39.66156], [67.62889, 39.60234], [67.44899, 39.57799], [67.46547, 39.53564], [67.39681, 39.52505], [67.46822, 39.46146], [67.45998, 39.315], [67.36522, 39.31287], [67.33226, 39.23739], [67.67833, 39.14479], [67.68915, 39.00775], [68.09704, 39.02589], [68.19743, 38.85985], [68.06948, 38.82115], [68.12877, 38.73677], [68.05598, 38.71641], [68.0807, 38.64136], [68.05873, 38.56087], [68.11366, 38.47169], [68.06274, 38.39435], [68.13289, 38.40822], [68.40343, 38.19484], [68.27159, 37.91477], [68.12635, 37.93], [67.81566, 37.43107], [67.8474, 37.31594], [67.78329, 37.1834], [67.7803, 37.08978], [67.87917, 37.0591], [68.02194, 36.91923], [68.18542, 37.02074], [68.27605, 37.00977], [68.29253, 37.10621], [68.41201, 37.10402], [68.41888, 37.13906], [68.61851, 37.19815], [68.6798, 37.27906], [68.81438, 37.23862], [68.80889, 37.32494], [68.91189, 37.26704], [68.88168, 37.33368], [68.96407, 37.32603], [69.03274, 37.25174], [69.25152, 37.09426], [69.39529, 37.16752], [69.45022, 37.23315], [69.36645, 37.40462], [69.44954, 37.4869], [69.51888, 37.5844], [69.80041, 37.5746], [69.84435, 37.60616], [69.93362, 37.61378], [69.95971, 37.5659], [70.15015, 37.52519], [70.28243, 37.66706], [70.27694, 37.81258], [70.1863, 37.84296], [70.17206, 37.93276], [70.4898, 38.12546], [70.54673, 38.24541], [70.60407, 38.28046], [70.61526, 38.34774], [70.64966, 38.34999], [70.69189, 38.37031], [70.6761, 38.39144], [70.67438, 38.40597], [70.69807, 38.41861], [70.72485, 38.4131], [70.75455, 38.4252], [70.77132, 38.45548], [70.78581, 38.45502], [70.78702, 38.45031], [70.79766, 38.44944], [70.80521, 38.44447], [70.81697, 38.44507], [70.82538, 38.45394], [70.84376, 38.44688], [70.88719, 38.46826], [70.92728, 38.43021], [70.98693, 38.48862], [71.03545, 38.44779], [71.0556, 38.40176], [71.09542, 38.42517], [71.10592, 38.42077], [71.10957, 38.40671], [71.1451, 38.40106], [71.21291, 38.32797], [71.33114, 38.30339], [71.33869, 38.27335], [71.37803, 38.25641], [71.36444, 38.15358], [71.29878, 38.04429], [71.28922, 38.01272], [71.27622, 37.99946], [71.27278, 37.96496], [71.24969, 37.93031], [71.2809, 37.91995], [71.296, 37.93403], [71.32871, 37.88564], [71.51565, 37.95349], [71.58843, 37.92425], [71.59255, 37.79956], [71.55752, 37.78677], [71.54324, 37.77104], [71.53053, 37.76534], [71.55234, 37.73209], [71.54186, 37.69691], [71.51972, 37.61945], [71.5065, 37.60912], [71.49693, 37.53527], [71.50616, 37.50733], [71.5256, 37.47971], [71.49612, 37.4279], [71.47685, 37.40281], [71.4862, 37.33405], [71.49821, 37.31975], [71.50674, 37.31502], [71.48536, 37.26017], [71.4824, 37.24921], [71.48339, 37.23937], [71.47386, 37.2269], [71.4555, 37.21418], [71.4494, 37.18137], [71.44127, 37.11856], [71.43097, 37.05855], [71.45578, 37.03094], [71.46923, 36.99925], [71.48481, 36.93218], [71.51502, 36.89128], [71.57195, 36.74943], [71.67083, 36.67346], [71.83229, 36.68084], [72.31676, 36.98115], [72.54095, 37.00007], [72.66381, 37.02014], [72.79693, 37.22222], [73.06884, 37.31729], [73.29633, 37.46495], [73.77197, 37.4417], [73.76647, 37.33913], [73.61129, 37.27469], [73.64974, 37.23643], [73.82552, 37.22659], [73.8564, 37.26158], [74.20308, 37.34208], [74.23339, 37.41116], [74.41055, 37.3948], [74.56161, 37.37734], [74.68383, 37.3948], [74.8294, 37.3435], [74.88887, 37.23275], [75.12328, 37.31839], [75.09719, 37.37297], [75.15899, 37.41443], [75.06011, 37.52779], [74.94338, 37.55501], [74.8912, 37.67576], [75.00935, 37.77486], [74.92416, 37.83428], [74.9063, 38.03033], [74.82665, 38.07359], [74.80331, 38.19889], [74.69894, 38.22155], [74.69619, 38.42947], [74.51217, 38.47034], [74.17022, 38.65504], [73.97933, 38.52945], [73.79806, 38.61106], [73.80656, 38.66449], [73.7033, 38.84782], [73.7445, 38.93867], [73.82964, 38.91517], [73.81728, 39.04007], [73.75823, 39.023], [73.60638, 39.24534], [73.54572, 39.27567], [73.55396, 39.3543], [73.5004, 39.38402], [73.59241, 39.40843], [73.59831, 39.46425], [73.45096, 39.46677], [73.31912, 39.38615], [73.18454, 39.35536], [72.85934, 39.35116], [72.62027, 39.39696], [72.33173, 39.33093], [72.23834, 39.17248], [72.17242, 39.2661], [72.09689, 39.26823], [72.04059, 39.36704], [71.90601, 39.27674], [71.79202, 39.27355], [71.7522, 39.32031], [71.80164, 39.40631], [71.76816, 39.45456], [71.62688, 39.44056], [71.5517, 39.45722], [71.55856, 39.57588], [71.49814, 39.61397], [71.08752, 39.50704], [71.06418, 39.41586], [70.7854, 39.38933], [70.64087, 39.58792], [70.44757, 39.60128], [70.2869, 39.53141], [70.11111, 39.58223], [69.87491, 39.53882], [69.68677, 39.59281], [69.3594, 39.52516], [69.26938, 39.8127], [69.35649, 40.01994], [69.43134, 39.98431], [69.43557, 39.92877], [69.53615, 39.93991], [69.5057, 40.03277], [69.53855, 40.0887], [69.53794, 40.11833], [69.55555, 40.12296], [69.57615, 40.10524], [69.64704, 40.12165], [69.67001, 40.10639], [70.01283, 40.23288], [70.58297, 40.00891], [70.57384, 39.99394], [70.47557, 39.93216], [70.55033, 39.96619], [70.58912, 39.95211], [70.65946, 39.9878], [70.65827, 40.0981], [70.7928, 40.12797], [70.80495, 40.16813], [70.9818, 40.22392], [70.8607, 40.217], [70.62342, 40.17396], [70.56394, 40.26421], [70.57149, 40.3442], [70.37511, 40.38605], [70.32626, 40.45174], [70.49871, 40.52503], [70.80009, 40.72825], [70.45251, 41.04438]]], [[[70.68112, 40.90612], [70.6158, 40.97661], [70.56077, 41.00642], [70.54223, 40.98787], [70.57501, 40.98941], [70.6721, 40.90555], [70.68112, 40.90612]]], [[[70.74189, 39.86319], [70.53651, 39.89155], [70.52631, 39.86989], [70.54998, 39.85137], [70.59667, 39.83542], [70.63105, 39.77923], [70.74189, 39.86319]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "TK", + iso1A3: "TKL", + iso1N3: "772", + wikidata: "Q36823", + nameEn: "Tokelau", + country: "NZ", + groups: ["061", "009", "UN"], + driveSide: "left", + callingCodes: ["690"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-168.251, -9.44289], [-174.18635, -7.80441], [-174.17993, -10.13616], [-168.251, -9.44289]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "TL", + iso1A3: "TLS", + iso1N3: "626", + wikidata: "Q574", + nameEn: "East Timor", + aliases: ["Timor-Leste", "TP"], + groups: ["035", "142", "UN"], + driveSide: "left", + callingCodes: ["670"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[124.46701, -9.13002], [124.94011, -8.85617], [124.97742, -9.08128], [125.11764, -8.96359], [125.18632, -9.03142], [125.18907, -9.16434], [125.09434, -9.19669], [125.04044, -9.17093], [124.97892, -9.19281], [125.09025, -9.46406], [125.68138, -9.85176], [127.55165, -9.05052], [127.42116, -8.22471], [125.87691, -8.31789], [125.58506, -7.95311], [124.92337, -8.75859], [124.33472, -9.11416], [124.04628, -9.22671], [124.04286, -9.34243], [124.10539, -9.41206], [124.14517, -9.42324], [124.21247, -9.36904], [124.28115, -9.42189], [124.28115, -9.50453], [124.3535, -9.48493], [124.35258, -9.43002], [124.38554, -9.3582], [124.45971, -9.30263], [124.46701, -9.13002]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "TM", + iso1A3: "TKM", + iso1N3: "795", + wikidata: "Q874", + nameEn: "Turkmenistan", + groups: ["143", "142", "UN"], + callingCodes: ["993"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[60.5078, 41.21694], [60.06581, 41.4363], [60.18117, 41.60082], [60.06032, 41.76287], [60.08504, 41.80997], [60.33223, 41.75058], [59.95046, 41.97966], [60.0356, 42.01028], [60.04659, 42.08982], [59.96419, 42.1428], [60.00539, 42.212], [59.94633, 42.27655], [59.4341, 42.29738], [59.2955, 42.37064], [59.17317, 42.52248], [58.93422, 42.5407], [58.6266, 42.79314], [58.57991, 42.64988], [58.27504, 42.69632], [58.14321, 42.62159], [58.29427, 42.56497], [58.51674, 42.30348], [58.40688, 42.29535], [58.3492, 42.43335], [57.99214, 42.50021], [57.90975, 42.4374], [57.92897, 42.24047], [57.84932, 42.18555], [57.6296, 42.16519], [57.30275, 42.14076], [57.03633, 41.92043], [56.96218, 41.80383], [57.03359, 41.41777], [57.13796, 41.36625], [57.03423, 41.25435], [56.00314, 41.32584], [55.45471, 41.25609], [54.95182, 41.92424], [54.20635, 42.38477], [52.97575, 42.1308], [52.47884, 41.78034], [52.26048, 41.69249], [51.7708, 40.29239], [53.89734, 37.3464], [54.24565, 37.32047], [54.36211, 37.34912], [54.58664, 37.45809], [54.67247, 37.43532], [54.77822, 37.51597], [54.81804, 37.61285], [54.77684, 37.62264], [54.851, 37.75739], [55.13412, 37.94705], [55.44152, 38.08564], [55.76561, 38.12238], [55.97847, 38.08024], [56.33278, 38.08132], [56.32454, 38.18502], [56.43303, 38.26054], [56.62255, 38.24005], [56.73928, 38.27887], [57.03453, 38.18717], [57.21169, 38.28965], [57.37236, 38.09321], [57.35042, 37.98546], [57.79534, 37.89299], [58.21399, 37.77281], [58.22999, 37.6856], [58.39959, 37.63134], [58.47786, 37.6433], [58.5479, 37.70526], [58.6921, 37.64548], [58.9338, 37.67374], [59.22905, 37.51161], [59.33507, 37.53146], [59.39797, 37.47892], [59.39385, 37.34257], [59.55178, 37.13594], [59.74678, 37.12499], [60.00768, 37.04102], [60.34767, 36.63214], [61.14516, 36.64644], [61.18187, 36.55348], [61.1393, 36.38782], [61.22719, 36.12759], [61.12007, 35.95992], [61.22444, 35.92879], [61.26152, 35.80749], [61.22719, 35.67038], [61.27371, 35.61482], [61.58742, 35.43803], [61.77693, 35.41341], [61.97743, 35.4604], [62.05709, 35.43803], [62.15871, 35.33278], [62.29191, 35.25964], [62.29878, 35.13312], [62.48006, 35.28796], [62.62288, 35.22067], [62.74098, 35.25432], [62.90853, 35.37086], [63.0898, 35.43131], [63.12276, 35.53196], [63.10079, 35.63024], [63.23262, 35.67487], [63.10318, 35.81782], [63.12276, 35.86208], [63.29579, 35.85985], [63.53475, 35.90881], [63.56496, 35.95106], [63.98519, 36.03773], [64.05385, 36.10433], [64.43288, 36.24401], [64.57295, 36.34362], [64.62514, 36.44311], [64.61141, 36.6351], [64.97945, 37.21913], [65.51778, 37.23881], [65.64263, 37.34388], [65.64137, 37.45061], [65.72274, 37.55438], [66.30993, 37.32409], [66.55743, 37.35409], [66.52303, 37.39827], [66.65761, 37.45497], [66.52852, 37.58568], [66.53676, 37.80084], [66.67684, 37.96776], [66.56697, 38.0435], [66.41042, 38.02403], [66.24013, 38.16238], [65.83913, 38.25733], [65.55873, 38.29052], [64.32576, 38.98691], [64.19086, 38.95561], [63.70778, 39.22349], [63.6913, 39.27666], [62.43337, 39.98528], [62.34273, 40.43206], [62.11751, 40.58242], [61.87856, 41.12257], [61.4446, 41.29407], [61.39732, 41.19873], [61.33199, 41.14946], [61.22212, 41.14946], [61.03261, 41.25691], [60.5078, 41.21694]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "TN", + iso1A3: "TUN", + iso1N3: "788", + wikidata: "Q948", + nameEn: "Tunisia", + groups: ["015", "002", "UN"], + callingCodes: ["216"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[11.2718, 37.6713], [7.89009, 38.19924], [8.59123, 37.14286], [8.64044, 36.9401], [8.62972, 36.86499], [8.67706, 36.8364], [8.57613, 36.78062], [8.46537, 36.7706], [8.47609, 36.66607], [8.16167, 36.48817], [8.18936, 36.44939], [8.40731, 36.42208], [8.2626, 35.91733], [8.26472, 35.73669], [8.35371, 35.66373], [8.36086, 35.47774], [8.30329, 35.29884], [8.47318, 35.23376], [8.3555, 35.10007], [8.30727, 34.95378], [8.25189, 34.92009], [8.29655, 34.72798], [8.20482, 34.57575], [7.86264, 34.3987], [7.81242, 34.21841], [7.74207, 34.16492], [7.66174, 34.20167], [7.52851, 34.06493], [7.54088, 33.7726], [7.73687, 33.42114], [7.83028, 33.18851], [8.11433, 33.10175], [8.1179, 33.05086], [8.31895, 32.83483], [8.35999, 32.50101], [9.07483, 32.07865], [9.55544, 30.23971], [9.76848, 30.34366], [9.88152, 30.34074], [10.29516, 30.90337], [10.12239, 31.42098], [10.31364, 31.72648], [10.48497, 31.72956], [10.62788, 31.96629], [10.7315, 31.97235], [11.04234, 32.2145], [11.53898, 32.4138], [11.57828, 32.48013], [11.46037, 32.6307], [11.51549, 33.09826], [11.55852, 33.1409], [11.58941, 33.36891], [11.2718, 37.6713]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "TO", + iso1A3: "TON", + iso1N3: "776", + wikidata: "Q678", + nameEn: "Tonga", + groups: ["061", "009", "UN"], + driveSide: "left", + callingCodes: ["676"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-176.74538, -22.89767], [-180, -22.90585], [-180, -24.21376], [-173.10761, -24.19665], [-173.13438, -14.94228], [-176.76826, -14.95183], [-176.74538, -22.89767]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "TR", + iso1A3: "TUR", + iso1N3: "792", + wikidata: "Q43", + nameEn: "Turkey", + groups: ["145", "142", "UN"], + callingCodes: ["90"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[41.54366, 41.52185], [40.89217, 41.72528], [34.8305, 42.4581], [28.32297, 41.98371], [28.02971, 41.98066], [27.91479, 41.97902], [27.83492, 41.99709], [27.81235, 41.94803], [27.69949, 41.97515], [27.55191, 41.90928], [27.52379, 41.93756], [27.45478, 41.96591], [27.27411, 42.10409], [27.22376, 42.10152], [27.19251, 42.06028], [27.08486, 42.08735], [27.03277, 42.0809], [26.95638, 42.00741], [26.79143, 41.97386], [26.62996, 41.97644], [26.56051, 41.92995], [26.57961, 41.90024], [26.53968, 41.82653], [26.36952, 41.82265], [26.33589, 41.76802], [26.32952, 41.73637], [26.35957, 41.71149], [26.47958, 41.67037], [26.5209, 41.62592], [26.59196, 41.60491], [26.59742, 41.48058], [26.61767, 41.42281], [26.62997, 41.34613], [26.5837, 41.32131], [26.5209, 41.33993], [26.39861, 41.25053], [26.32259, 41.24929], [26.31928, 41.07386], [26.3606, 41.02027], [26.33297, 40.98388], [26.35894, 40.94292], [26.32259, 40.94042], [26.28623, 40.93005], [26.29441, 40.89119], [26.26169, 40.9168], [26.20856, 40.86048], [26.21351, 40.83298], [26.15685, 40.80709], [26.12854, 40.77339], [26.12495, 40.74283], [26.08638, 40.73214], [26.0754, 40.72772], [26.03489, 40.73051], [25.94795, 40.72797], [26.04292, 40.3958], [25.61285, 40.17161], [25.94257, 39.39358], [26.43357, 39.43096], [26.70773, 39.0312], [26.61814, 38.81372], [26.21136, 38.65436], [26.32173, 38.48731], [26.24183, 38.44695], [26.21136, 38.17558], [27.05537, 37.9131], [27.16428, 37.72343], [26.99377, 37.69034], [26.95583, 37.64989], [27.14757, 37.32], [27.20312, 36.94571], [27.45627, 36.9008], [27.24613, 36.71622], [27.46117, 36.53789], [27.89482, 36.69898], [27.95037, 36.46155], [28.23708, 36.56812], [29.30783, 36.01033], [29.48192, 36.18377], [29.61002, 36.1731], [29.61805, 36.14179], [29.69611, 36.10365], [29.73302, 35.92555], [32.82353, 35.70297], [35.51152, 36.10954], [35.931, 35.92109], [35.98499, 35.94107], [36.00514, 35.94113], [36.01844, 35.92403], [35.99829, 35.88242], [36.11827, 35.85923], [36.13919, 35.83692], [36.14029, 35.81015], [36.1623, 35.80925], [36.17441, 35.92076], [36.19973, 35.95195], [36.25366, 35.96264], [36.27678, 35.94839], [36.29769, 35.96086], [36.28338, 36.00273], [36.30099, 36.00985], [36.33956, 35.98687], [36.37474, 36.01163], [36.39206, 36.22088], [36.4617, 36.20461], [36.50463, 36.2419], [36.6125, 36.22592], [36.68672, 36.23677], [36.65653, 36.33861], [36.6081, 36.33772], [36.54206, 36.49539], [36.58829, 36.58295], [36.57398, 36.65186], [36.62681, 36.71189], [36.61581, 36.74629], [36.66727, 36.82901], [36.99557, 36.75997], [36.99886, 36.74012], [37.04399, 36.73483], [37.04619, 36.71101], [37.01647, 36.69512], [37.02088, 36.66422], [37.08279, 36.63495], [37.10894, 36.6704], [37.16177, 36.66069], [37.21988, 36.6736], [37.47253, 36.63243], [37.49103, 36.66904], [37.68048, 36.75065], [37.81974, 36.76055], [38.21064, 36.91842], [38.38859, 36.90064], [38.55908, 36.84429], [38.74042, 36.70629], [39.03217, 36.70911], [39.21538, 36.66834], [39.81589, 36.75538], [40.69136, 37.0996], [40.90856, 37.13147], [41.21937, 37.07665], [41.515, 37.08084], [42.00894, 37.17209], [42.18225, 37.28569], [42.19301, 37.31323], [42.2112, 37.32491], [42.22257, 37.31395], [42.22381, 37.30238], [42.20454, 37.28715], [42.21548, 37.28026], [42.23683, 37.2863], [42.26039, 37.27017], [42.2824, 37.2798], [42.34735, 37.22548], [42.32313, 37.17814], [42.35724, 37.10998], [42.56725, 37.14878], [42.78887, 37.38615], [42.93705, 37.32015], [43.11403, 37.37436], [43.30083, 37.30629], [43.33508, 37.33105], [43.50787, 37.24436], [43.56702, 37.25675], [43.63085, 37.21957], [43.7009, 37.23692], [43.8052, 37.22825], [43.82699, 37.19477], [43.84878, 37.22205], [43.90949, 37.22453], [44.02002, 37.33229], [44.13521, 37.32486], [44.2613, 37.25055], [44.27998, 37.16501], [44.22239, 37.15756], [44.18503, 37.09551], [44.25975, 36.98119], [44.30645, 36.97373], [44.35937, 37.02843], [44.35315, 37.04955], [44.38117, 37.05825], [44.42631, 37.05825], [44.63179, 37.19229], [44.76698, 37.16162], [44.78319, 37.1431], [44.7868, 37.16644], [44.75986, 37.21549], [44.81021, 37.2915], [44.58449, 37.45018], [44.61401, 37.60165], [44.56887, 37.6429], [44.62096, 37.71985], [44.55498, 37.783], [44.45948, 37.77065], [44.3883, 37.85433], [44.22509, 37.88859], [44.42476, 38.25763], [44.50115, 38.33939], [44.44386, 38.38295], [44.38309, 38.36117], [44.3119, 38.37887], [44.3207, 38.49799], [44.32058, 38.62752], [44.28065, 38.6465], [44.26155, 38.71427], [44.30322, 38.81581], [44.18863, 38.93881], [44.20946, 39.13975], [44.1043, 39.19842], [44.03667, 39.39223], [44.22452, 39.4169], [44.29818, 39.378], [44.37921, 39.4131], [44.42832, 39.4131], [44.41849, 39.56659], [44.48111, 39.61579], [44.47298, 39.68788], [44.6137, 39.78393], [44.65422, 39.72163], [44.71806, 39.71124], [44.81043, 39.62677], [44.80977, 39.65768], [44.75779, 39.7148], [44.61845, 39.8281], [44.46635, 39.97733], [44.26973, 40.04866], [44.1778, 40.02845], [44.1057, 40.03555], [43.92307, 40.01787], [43.65688, 40.11199], [43.65221, 40.14889], [43.71136, 40.16673], [43.59928, 40.34019], [43.60862, 40.43267], [43.54791, 40.47413], [43.63664, 40.54159], [43.7425, 40.66805], [43.74872, 40.7365], [43.67712, 40.84846], [43.67712, 40.93084], [43.58683, 40.98961], [43.47319, 41.02251], [43.44984, 41.0988], [43.4717, 41.12611], [43.44973, 41.17666], [43.36118, 41.2028], [43.23096, 41.17536], [43.1945, 41.25242], [43.13373, 41.25503], [43.21707, 41.30331], [43.02956, 41.37891], [42.8785, 41.50516], [42.84899, 41.47265], [42.78995, 41.50126], [42.84471, 41.58912], [42.72794, 41.59714], [42.59202, 41.58183], [42.51772, 41.43606], [42.26387, 41.49346], [41.95134, 41.52466], [41.81939, 41.43621], [41.7124, 41.47417], [41.7148, 41.4932], [41.54366, 41.52185]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "TT", + iso1A3: "TTO", + iso1N3: "780", + wikidata: "Q754", + nameEn: "Trinidad and Tobago", + groups: ["029", "003", "419", "019", "UN"], + driveSide: "left", + callingCodes: ["1 868"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-61.62505, 11.18974], [-62.08693, 10.04435], [-60.89962, 9.81445], [-60.07172, 11.77667], [-61.62505, 11.18974]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "TV", + iso1A3: "TUV", + iso1N3: "798", + wikidata: "Q672", + nameEn: "Tuvalu", + groups: ["061", "009", "UN"], + driveSide: "left", + callingCodes: ["688"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[174, -5], [174, -11.5], [179.99999, -11.5], [179.99999, -5], [174, -5]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "TW", + iso1A3: "TWN", + iso1N3: "158", + wikidata: "Q865", + nameEn: "Taiwan", + aliases: ["RC"], + groups: ["030", "142"], + callingCodes: ["886"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[121.8109, 21.77688], [122.26612, 25.98197], [120.49232, 25.22863], [118.56434, 24.49266], [118.42453, 24.54644], [118.35291, 24.51645], [118.28244, 24.51231], [118.11703, 24.39734], [120.69238, 21.52331], [121.8109, 21.77688]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "TZ", + iso1A3: "TZA", + iso1N3: "834", + wikidata: "Q924", + nameEn: "Tanzania", + groups: ["014", "202", "002", "UN"], + driveSide: "left", + callingCodes: ["255"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[30.80408, -0.99911], [30.76635, -0.9852], [30.70631, -1.01175], [30.64166, -1.06601], [30.47194, -1.0555], [30.45116, -1.10641], [30.50889, -1.16412], [30.57123, -1.33264], [30.71974, -1.43244], [30.84079, -1.64652], [30.80802, -1.91477], [30.89303, -2.08223], [30.83915, -2.35795], [30.54501, -2.41404], [30.41789, -2.66266], [30.52747, -2.65841], [30.40662, -2.86151], [30.4987, -2.9573], [30.57926, -2.89791], [30.6675, -2.98987], [30.83823, -2.97837], [30.84165, -3.25152], [30.45915, -3.56532], [30.22042, -4.01738], [30.03323, -4.26631], [29.88172, -4.35743], [29.82885, -4.36153], [29.77289, -4.41733], [29.75109, -4.45836], [29.63827, -4.44681], [29.43673, -4.44845], [29.52552, -6.2731], [30.2567, -7.14121], [30.79243, -8.27382], [31.00796, -8.58615], [31.37533, -8.60769], [31.57147, -8.70619], [31.57147, -8.81388], [31.71158, -8.91386], [31.81587, -8.88618], [31.94663, -8.93846], [31.94196, -9.02303], [31.98866, -9.07069], [32.08206, -9.04609], [32.16146, -9.05993], [32.25486, -9.13371], [32.43543, -9.11988], [32.49147, -9.14754], [32.53661, -9.24281], [32.75611, -9.28583], [32.76233, -9.31963], [32.95389, -9.40138], [32.99397, -9.36712], [33.14925, -9.49322], [33.31581, -9.48554], [33.48052, -9.62442], [33.76677, -9.58516], [33.93298, -9.71647], [33.9638, -9.62206], [33.95829, -9.54066], [34.03865, -9.49398], [34.54499, -10.0678], [34.51911, -10.12279], [34.57581, -10.56271], [34.65946, -10.6828], [34.67047, -10.93796], [34.61161, -11.01611], [34.63305, -11.11731], [34.79375, -11.32245], [34.91153, -11.39799], [34.96296, -11.57354], [35.63599, -11.55927], [35.82767, -11.41081], [36.19094, -11.57593], [36.19094, -11.70008], [36.62068, -11.72884], [36.80309, -11.56836], [37.3936, -11.68949], [37.76614, -11.53352], [37.8388, -11.3123], [37.93618, -11.26228], [38.21598, -11.27289], [38.47258, -11.4199], [38.88996, -11.16978], [39.24395, -11.17433], [39.58249, -10.96043], [40.00295, -10.80255], [40.44265, -10.4618], [40.74206, -10.25691], [40.14328, -4.64201], [39.62121, -4.68136], [39.44306, -4.93877], [39.21631, -4.67835], [37.81321, -3.69179], [37.75036, -3.54243], [37.63099, -3.50723], [37.5903, -3.42735], [37.71745, -3.304], [37.67199, -3.06222], [34.0824, -1.02264], [34.03084, -1.05101], [34.02286, -1.00779], [33.93107, -0.99298], [30.80408, -0.99911]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "UA", + iso1A3: "UKR", + iso1N3: "804", + wikidata: "Q212", + nameEn: "Ukraine", + groups: ["151", "150", "UN"], + callingCodes: ["380"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[33.57318, 46.10317], [33.61467, 46.13561], [33.63854, 46.14147], [33.61517, 46.22615], [33.646, 46.23028], [33.74047, 46.18555], [33.79715, 46.20482], [33.85234, 46.19863], [33.91549, 46.15938], [34.05272, 46.10838], [34.07311, 46.11769], [34.12929, 46.10494], [34.181, 46.06804], [34.25111, 46.0532], [34.33912, 46.06114], [34.41221, 46.00245], [34.44155, 45.95995], [34.48729, 45.94267], [34.52011, 45.95097], [34.55889, 45.99347], [34.60861, 45.99347], [34.66679, 45.97136], [34.75479, 45.90705], [34.80153, 45.90047], [34.79905, 45.81009], [34.96015, 45.75634], [35.23066, 45.79231], [37.62608, 46.82615], [38.12112, 46.86078], [38.3384, 46.98085], [38.22955, 47.12069], [38.23049, 47.2324], [38.32112, 47.2585], [38.33074, 47.30508], [38.22225, 47.30788], [38.28954, 47.39255], [38.28679, 47.53552], [38.35062, 47.61631], [38.76379, 47.69346], [38.79628, 47.81109], [38.87979, 47.87719], [39.73935, 47.82876], [39.82213, 47.96396], [39.77544, 48.04206], [39.88256, 48.04482], [39.83724, 48.06501], [39.94847, 48.22811], [40.00752, 48.22445], [39.99241, 48.31768], [39.97325, 48.31399], [39.9693, 48.29904], [39.95248, 48.29972], [39.91465, 48.26743], [39.90041, 48.3049], [39.84273, 48.30947], [39.84136, 48.33321], [39.94847, 48.35055], [39.88794, 48.44226], [39.86196, 48.46633], [39.84548, 48.57821], [39.79764, 48.58668], [39.67226, 48.59368], [39.71765, 48.68673], [39.73104, 48.7325], [39.79466, 48.83739], [39.97182, 48.79398], [40.08168, 48.87443], [40.03636, 48.91957], [39.98967, 48.86901], [39.78368, 48.91596], [39.74874, 48.98675], [39.72649, 48.9754], [39.71353, 48.98959], [39.6683, 48.99454], [39.6836, 49.05121], [39.93437, 49.05709], [40.01988, 49.1761], [40.22176, 49.25683], [40.18331, 49.34996], [40.14912, 49.37681], [40.1141, 49.38798], [40.03087, 49.45452], [40.03636, 49.52321], [40.16683, 49.56865], [40.13249, 49.61672], [39.84548, 49.56064], [39.65047, 49.61761], [39.59142, 49.73758], [39.44496, 49.76067], [39.27968, 49.75976], [39.1808, 49.88911], [38.9391, 49.79524], [38.90477, 49.86787], [38.73311, 49.90238], [38.68677, 50.00904], [38.65688, 49.97176], [38.35408, 50.00664], [38.32524, 50.08866], [38.18517, 50.08161], [38.21675, 49.98104], [38.02999, 49.90592], [38.02999, 49.94482], [37.90776, 50.04194], [37.79515, 50.08425], [37.75807, 50.07896], [37.61113, 50.21976], [37.62879, 50.24481], [37.62486, 50.29966], [37.47243, 50.36277], [37.48204, 50.46079], [37.08468, 50.34935], [36.91762, 50.34963], [36.69377, 50.26982], [36.64571, 50.218], [36.56655, 50.2413], [36.58371, 50.28563], [36.47817, 50.31457], [36.30101, 50.29088], [36.20763, 50.3943], [36.06893, 50.45205], [35.8926, 50.43829], [35.80388, 50.41356], [35.73659, 50.35489], [35.61711, 50.35707], [35.58003, 50.45117], [35.47463, 50.49247], [35.39464, 50.64751], [35.48116, 50.66405], [35.47704, 50.77274], [35.41367, 50.80227], [35.39307, 50.92145], [35.32598, 50.94524], [35.40837, 51.04119], [35.31774, 51.08434], [35.20375, 51.04723], [35.12685, 51.16191], [35.14058, 51.23162], [34.97304, 51.2342], [34.82472, 51.17483], [34.6874, 51.18], [34.6613, 51.25053], [34.38802, 51.2746], [34.31661, 51.23936], [34.23009, 51.26429], [34.33446, 51.363], [34.22048, 51.4187], [34.30562, 51.5205], [34.17599, 51.63253], [34.07765, 51.67065], [34.42922, 51.72852], [34.41136, 51.82793], [34.09413, 52.00835], [34.11199, 52.14087], [34.05239, 52.20132], [33.78789, 52.37204], [33.55718, 52.30324], [33.48027, 52.31499], [33.51323, 52.35779], [33.18913, 52.3754], [32.89937, 52.2461], [32.85405, 52.27888], [32.69475, 52.25535], [32.54781, 52.32423], [32.3528, 52.32842], [32.38988, 52.24946], [32.33083, 52.23685], [32.34044, 52.1434], [32.2777, 52.10266], [32.23331, 52.08085], [32.08813, 52.03319], [31.92159, 52.05144], [31.96141, 52.08015], [31.85018, 52.11305], [31.81722, 52.09955], [31.7822, 52.11406], [31.38326, 52.12991], [31.25142, 52.04131], [31.13332, 52.1004], [30.95589, 52.07775], [30.90897, 52.00699], [30.76443, 51.89739], [30.68804, 51.82806], [30.51946, 51.59649], [30.64992, 51.35014], [30.56203, 51.25655], [30.36153, 51.33984], [30.34642, 51.42555], [30.17888, 51.51025], [29.77376, 51.4461], [29.7408, 51.53417], [29.54372, 51.48372], [29.49773, 51.39814], [29.42357, 51.4187], [29.32881, 51.37843], [29.25191, 51.49828], [29.25603, 51.57089], [29.20659, 51.56918], [29.16402, 51.64679], [29.1187, 51.65872], [28.99098, 51.56833], [28.95528, 51.59222], [28.81795, 51.55552], [28.76027, 51.48802], [28.78224, 51.45294], [28.75615, 51.41442], [28.73143, 51.46236], [28.69161, 51.44695], [28.64429, 51.5664], [28.47051, 51.59734], [28.37592, 51.54505], [28.23452, 51.66988], [28.10658, 51.57857], [27.95827, 51.56065], [27.91844, 51.61952], [27.85253, 51.62293], [27.76052, 51.47604], [27.67125, 51.50854], [27.71932, 51.60672], [27.55727, 51.63486], [27.51058, 51.5854], [27.47212, 51.61184], [27.24828, 51.60161], [27.26613, 51.65957], [27.20948, 51.66713], [27.20602, 51.77291], [26.99422, 51.76933], [26.9489, 51.73788], [26.80043, 51.75777], [26.69759, 51.82284], [26.46962, 51.80501], [26.39367, 51.87315], [26.19084, 51.86781], [26.00408, 51.92967], [25.83217, 51.92587], [25.80574, 51.94556], [25.73673, 51.91973], [25.46163, 51.92205], [25.20228, 51.97143], [24.98784, 51.91273], [24.37123, 51.88222], [24.29021, 51.80841], [24.3163, 51.75063], [24.13075, 51.66979], [23.99907, 51.58369], [23.8741, 51.59734], [23.91118, 51.63316], [23.7766, 51.66809], [23.60906, 51.62122], [23.6736, 51.50255], [23.62751, 51.50512], [23.69905, 51.40871], [23.63858, 51.32182], [23.80678, 51.18405], [23.90376, 51.07697], [23.92217, 51.00836], [24.04576, 50.90196], [24.14524, 50.86128], [24.0952, 50.83262], [23.99254, 50.83847], [23.95925, 50.79271], [24.0595, 50.71625], [24.0996, 50.60752], [24.07048, 50.5071], [24.03668, 50.44507], [23.99563, 50.41289], [23.79445, 50.40481], [23.71382, 50.38248], [23.67635, 50.33385], [23.28221, 50.0957], [22.99329, 49.84249], [22.83179, 49.69875], [22.80261, 49.69098], [22.78304, 49.65543], [22.64534, 49.53094], [22.69444, 49.49378], [22.748, 49.32759], [22.72009, 49.20288], [22.86336, 49.10513], [22.89122, 49.00725], [22.56155, 49.08865], [22.54338, 49.01424], [22.48296, 48.99172], [22.42934, 48.92857], [22.34151, 48.68893], [22.21379, 48.6218], [22.16023, 48.56548], [22.14689, 48.4005], [22.2083, 48.42534], [22.38133, 48.23726], [22.49806, 48.25189], [22.59007, 48.15121], [22.58733, 48.10813], [22.66835, 48.09162], [22.73427, 48.12005], [22.81804, 48.11363], [22.87847, 48.04665], [22.84276, 47.98602], [22.89849, 47.95851], [22.94301, 47.96672], [22.92241, 48.02002], [23.0158, 47.99338], [23.08858, 48.00716], [23.1133, 48.08061], [23.15999, 48.12188], [23.27397, 48.08245], [23.33577, 48.0237], [23.4979, 47.96858], [23.52803, 48.01818], [23.5653, 48.00499], [23.63894, 48.00293], [23.66262, 47.98786], [23.75188, 47.99705], [23.80904, 47.98142], [23.8602, 47.9329], [23.89352, 47.94512], [23.94192, 47.94868], [23.96337, 47.96672], [23.98553, 47.96076], [24.00801, 47.968], [24.02999, 47.95087], [24.06466, 47.95317], [24.11281, 47.91487], [24.22566, 47.90231], [24.34926, 47.9244], [24.43578, 47.97131], [24.61994, 47.95062], [24.70632, 47.84428], [24.81893, 47.82031], [24.88896, 47.7234], [25.11144, 47.75203], [25.23778, 47.89403], [25.63878, 47.94924], [25.77723, 47.93919], [26.05901, 47.9897], [26.17711, 47.99246], [26.33504, 48.18418], [26.55202, 48.22445], [26.62823, 48.25804], [26.6839, 48.35828], [26.79239, 48.29071], [26.82809, 48.31629], [26.71274, 48.40388], [26.85556, 48.41095], [26.93384, 48.36558], [27.03821, 48.37653], [27.0231, 48.42485], [27.08078, 48.43214], [27.13434, 48.37288], [27.27855, 48.37534], [27.32159, 48.4434], [27.37604, 48.44398], [27.37741, 48.41026], [27.44333, 48.41209], [27.46942, 48.454], [27.5889, 48.49224], [27.59027, 48.46311], [27.6658, 48.44034], [27.74422, 48.45926], [27.79225, 48.44244], [27.81902, 48.41874], [27.87533, 48.4037], [27.88391, 48.36699], [27.95883, 48.32368], [28.04527, 48.32661], [28.09873, 48.3124], [28.07504, 48.23494], [28.17666, 48.25963], [28.19314, 48.20749], [28.2856, 48.23202], [28.32508, 48.23384], [28.35519, 48.24957], [28.36996, 48.20543], [28.34912, 48.1787], [28.30586, 48.1597], [28.30609, 48.14018], [28.34009, 48.13147], [28.38712, 48.17567], [28.43701, 48.15832], [28.42454, 48.12047], [28.48428, 48.0737], [28.53921, 48.17453], [28.69896, 48.13106], [28.85232, 48.12506], [28.8414, 48.03392], [28.9306, 47.96255], [29.1723, 47.99013], [29.19839, 47.89261], [29.27804, 47.88893], [29.20663, 47.80367], [29.27255, 47.79953], [29.22242, 47.73607], [29.22414, 47.60012], [29.11743, 47.55001], [29.18603, 47.43387], [29.3261, 47.44664], [29.39889, 47.30179], [29.47854, 47.30366], [29.48678, 47.36043], [29.5733, 47.36508], [29.59665, 47.25521], [29.54996, 47.24962], [29.57696, 47.13581], [29.49732, 47.12878], [29.53044, 47.07851], [29.61038, 47.09932], [29.62137, 47.05069], [29.57056, 46.94766], [29.72986, 46.92234], [29.75458, 46.8604], [29.87405, 46.88199], [29.98814, 46.82358], [29.94522, 46.80055], [29.9743, 46.75325], [29.94409, 46.56002], [29.88916, 46.54302], [30.02511, 46.45132], [30.16794, 46.40967], [30.09103, 46.38694], [29.94114, 46.40114], [29.88329, 46.35851], [29.74496, 46.45605], [29.66359, 46.4215], [29.6763, 46.36041], [29.5939, 46.35472], [29.49914, 46.45889], [29.35357, 46.49505], [29.24886, 46.37912], [29.23547, 46.55435], [29.02409, 46.49582], [29.01241, 46.46177], [28.9306, 46.45699], [29.004, 46.31495], [28.98478, 46.31803], [28.94953, 46.25852], [29.06656, 46.19716], [28.94643, 46.09176], [29.00613, 46.04962], [28.98004, 46.00385], [28.74383, 45.96664], [28.78503, 45.83475], [28.69852, 45.81753], [28.70401, 45.78019], [28.52823, 45.73803], [28.47879, 45.66994], [28.51587, 45.6613], [28.54196, 45.58062], [28.49252, 45.56716], [28.51449, 45.49982], [28.43072, 45.48538], [28.41836, 45.51715], [28.30201, 45.54744], [28.21139, 45.46895], [28.28504, 45.43907], [28.34554, 45.32102], [28.5735, 45.24759], [28.71358, 45.22631], [28.78911, 45.24179], [28.81383, 45.3384], [28.94292, 45.28045], [28.96077, 45.33164], [29.24779, 45.43388], [29.42632, 45.44545], [29.59798, 45.38857], [29.68175, 45.26885], [29.65428, 45.25629], [29.69272, 45.19227], [30.04414, 45.08461], [31.62627, 45.50633], [33.54017, 46.0123], [33.59087, 46.06013], [33.57318, 46.10317]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "UG", + iso1A3: "UGA", + iso1N3: "800", + wikidata: "Q1036", + nameEn: "Uganda", + groups: ["014", "202", "002", "UN"], + driveSide: "left", + callingCodes: ["256"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[33.93107, -0.99298], [33.9264, -0.54188], [33.98449, -0.13079], [33.90936, 0.10581], [34.10067, 0.36372], [34.08727, 0.44713], [34.11408, 0.48884], [34.13493, 0.58118], [34.20196, 0.62289], [34.27345, 0.63182], [34.31516, 0.75693], [34.40041, 0.80266], [34.43349, 0.85254], [34.52369, 1.10692], [34.57427, 1.09868], [34.58029, 1.14712], [34.67562, 1.21265], [34.80223, 1.22754], [34.82606, 1.26626], [34.82606, 1.30944], [34.7918, 1.36752], [34.87819, 1.5596], [34.92734, 1.56109], [34.9899, 1.6668], [34.98692, 1.97348], [34.90947, 2.42447], [34.95267, 2.47209], [34.77244, 2.70272], [34.78137, 2.76223], [34.73967, 2.85447], [34.65774, 2.8753], [34.60114, 2.93034], [34.56242, 3.11478], [34.45815, 3.18319], [34.40006, 3.37949], [34.41794, 3.44342], [34.39112, 3.48802], [34.44922, 3.51627], [34.45815, 3.67385], [34.15429, 3.80464], [34.06046, 4.15235], [33.9873, 4.23316], [33.51264, 3.75068], [33.18356, 3.77812], [33.02852, 3.89296], [32.89746, 3.81339], [32.72021, 3.77327], [32.41337, 3.748], [32.20782, 3.6053], [32.19888, 3.50867], [32.08866, 3.53543], [32.08491, 3.56287], [32.05187, 3.589], [31.95907, 3.57408], [31.96205, 3.6499], [31.86821, 3.78664], [31.81459, 3.82083], [31.72075, 3.74354], [31.50776, 3.63652], [31.50478, 3.67814], [31.29476, 3.8015], [31.16666, 3.79853], [30.97601, 3.693], [30.85153, 3.48867], [30.94081, 3.50847], [30.93486, 3.40737], [30.84251, 3.26908], [30.77101, 3.04897], [30.8574, 2.9508], [30.8857, 2.83923], [30.75612, 2.5863], [30.74271, 2.43601], [30.83059, 2.42559], [30.91102, 2.33332], [30.96911, 2.41071], [31.06593, 2.35862], [31.07934, 2.30207], [31.12104, 2.27676], [31.1985, 2.29462], [31.20148, 2.2217], [31.28042, 2.17853], [31.30127, 2.11006], [30.48503, 1.21675], [30.24671, 1.14974], [30.22139, 0.99635], [30.1484, 0.89805], [29.98307, 0.84295], [29.95477, 0.64486], [29.97413, 0.52124], [29.87284, 0.39166], [29.81922, 0.16824], [29.77454, 0.16675], [29.7224, 0.07291], [29.72687, -0.08051], [29.65091, -0.46777], [29.67474, -0.47969], [29.67176, -0.55714], [29.62708, -0.71055], [29.63006, -0.8997], [29.58388, -0.89821], [29.59061, -1.39016], [29.82657, -1.31187], [29.912, -1.48269], [30.16369, -1.34303], [30.35212, -1.06896], [30.47194, -1.0555], [30.64166, -1.06601], [30.70631, -1.01175], [30.76635, -0.9852], [30.80408, -0.99911], [33.93107, -0.99298]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "UM", + iso1A3: "UMI", + iso1N3: "581", + wikidata: "Q16645", + nameEn: "United States Minor Outlying Islands", + country: "US" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "UN", + wikidata: "Q1065", + nameEn: "United Nations", + level: "unitedNations", + isoStatus: "excRes" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "US", + iso1A3: "USA", + iso1N3: "840", + wikidata: "Q30", + nameEn: "United States of America" + }, + geometry: null + }, { + type: "Feature", + properties: { + iso1A2: "UY", + iso1A3: "URY", + iso1N3: "858", + wikidata: "Q77", + nameEn: "Uruguay", + groups: ["005", "419", "019", "UN"], + callingCodes: ["598"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-57.65132, -30.19229], [-57.61478, -30.25165], [-57.64859, -30.35095], [-57.89115, -30.49572], [-57.8024, -30.77193], [-57.89476, -30.95994], [-57.86729, -31.06352], [-57.9908, -31.34924], [-57.98127, -31.3872], [-58.07569, -31.44916], [-58.0023, -31.53084], [-58.00076, -31.65016], [-58.20252, -31.86966], [-58.10036, -32.25338], [-58.22362, -32.52416], [-58.1224, -32.98842], [-58.40475, -33.11777], [-58.44442, -33.84033], [-58.34425, -34.15035], [-57.83001, -34.69099], [-54.78916, -36.21945], [-52.83257, -34.01481], [-53.37138, -33.74313], [-53.39593, -33.75169], [-53.44031, -33.69344], [-53.52794, -33.68908], [-53.53459, -33.16843], [-53.1111, -32.71147], [-53.37671, -32.57005], [-53.39572, -32.58596], [-53.76024, -32.0751], [-54.17384, -31.86168], [-55.50821, -30.91349], [-55.50841, -30.9027], [-55.51862, -30.89828], [-55.52712, -30.89997], [-55.53276, -30.90218], [-55.53431, -30.89714], [-55.54572, -30.89051], [-55.55218, -30.88193], [-55.55373, -30.8732], [-55.5634, -30.8686], [-55.58866, -30.84117], [-55.87388, -31.05053], [-56.4619, -30.38457], [-56.4795, -30.3899], [-56.49267, -30.39471], [-56.90236, -30.02578], [-57.22502, -30.26121], [-57.65132, -30.19229]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "UZ", + iso1A3: "UZB", + iso1N3: "860", + wikidata: "Q265", + nameEn: "Uzbekistan", + groups: ["143", "142", "UN"], + callingCodes: ["998"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[65.85194, 42.85481], [65.53277, 43.31856], [65.18666, 43.48835], [64.96464, 43.74748], [64.53885, 43.56941], [63.34656, 43.64003], [62.01711, 43.51008], [61.01475, 44.41383], [58.59711, 45.58671], [55.97842, 44.99622], [55.97832, 44.99622], [55.97822, 44.99617], [55.97811, 44.99617], [55.97801, 44.99612], [55.97801, 44.99607], [55.97791, 44.99607], [55.9778, 44.99607], [55.9777, 44.99601], [55.9777, 44.99596], [55.9776, 44.99591], [55.97749, 44.99591], [55.97739, 44.99591], [55.97739, 44.99586], [55.97729, 44.99586], [55.97718, 44.99581], [55.97708, 44.99576], [55.97698, 44.9957], [55.97698, 44.99565], [55.97687, 44.9956], [55.97677, 44.9956], [55.97677, 44.99555], [55.97677, 44.9955], [55.97667, 44.99545], [55.97656, 44.99539], [55.97646, 44.99534], [55.97646, 44.99529], [55.97636, 44.99524], [55.97636, 44.99519], [55.97625, 44.99514], [55.97615, 44.99508], [55.97615, 44.99503], [55.97615, 44.99498], [55.97615, 44.99493], [55.97615, 44.99483], [55.97615, 44.99477], [55.97605, 44.99477], [55.97605, 44.99467], [55.97605, 44.99462], [55.97605, 44.99457], [55.97605, 44.99452], [55.97594, 44.99446], [55.97584, 44.99441], [55.97584, 44.99436], [55.97584, 44.99431], [55.97584, 44.99426], [55.97584, 44.99421], [55.97584, 44.99415], [55.97584, 44.99405], [55.97584, 44.994], [55.97584, 44.9939], [55.97584, 44.99384], [55.97584, 44.99374], [55.97584, 44.99369], [55.97584, 44.99359], [55.97584, 44.99353], [55.97584, 44.99348], [55.97584, 44.99343], [55.97584, 44.99338], [55.97584, 44.99328], [55.97584, 44.99322], [56.00314, 41.32584], [57.03423, 41.25435], [57.13796, 41.36625], [57.03359, 41.41777], [56.96218, 41.80383], [57.03633, 41.92043], [57.30275, 42.14076], [57.6296, 42.16519], [57.84932, 42.18555], [57.92897, 42.24047], [57.90975, 42.4374], [57.99214, 42.50021], [58.3492, 42.43335], [58.40688, 42.29535], [58.51674, 42.30348], [58.29427, 42.56497], [58.14321, 42.62159], [58.27504, 42.69632], [58.57991, 42.64988], [58.6266, 42.79314], [58.93422, 42.5407], [59.17317, 42.52248], [59.2955, 42.37064], [59.4341, 42.29738], [59.94633, 42.27655], [60.00539, 42.212], [59.96419, 42.1428], [60.04659, 42.08982], [60.0356, 42.01028], [59.95046, 41.97966], [60.33223, 41.75058], [60.08504, 41.80997], [60.06032, 41.76287], [60.18117, 41.60082], [60.06581, 41.4363], [60.5078, 41.21694], [61.03261, 41.25691], [61.22212, 41.14946], [61.33199, 41.14946], [61.39732, 41.19873], [61.4446, 41.29407], [61.87856, 41.12257], [62.11751, 40.58242], [62.34273, 40.43206], [62.43337, 39.98528], [63.6913, 39.27666], [63.70778, 39.22349], [64.19086, 38.95561], [64.32576, 38.98691], [65.55873, 38.29052], [65.83913, 38.25733], [66.24013, 38.16238], [66.41042, 38.02403], [66.56697, 38.0435], [66.67684, 37.96776], [66.53676, 37.80084], [66.52852, 37.58568], [66.65761, 37.45497], [66.52303, 37.39827], [66.55743, 37.35409], [66.64699, 37.32958], [66.95598, 37.40162], [67.08232, 37.35469], [67.13039, 37.27168], [67.2224, 37.24545], [67.2581, 37.17216], [67.51868, 37.26102], [67.78329, 37.1834], [67.8474, 37.31594], [67.81566, 37.43107], [68.12635, 37.93], [68.27159, 37.91477], [68.40343, 38.19484], [68.13289, 38.40822], [68.06274, 38.39435], [68.11366, 38.47169], [68.05873, 38.56087], [68.0807, 38.64136], [68.05598, 38.71641], [68.12877, 38.73677], [68.06948, 38.82115], [68.19743, 38.85985], [68.09704, 39.02589], [67.68915, 39.00775], [67.67833, 39.14479], [67.33226, 39.23739], [67.36522, 39.31287], [67.45998, 39.315], [67.46822, 39.46146], [67.39681, 39.52505], [67.46547, 39.53564], [67.44899, 39.57799], [67.62889, 39.60234], [67.70992, 39.66156], [68.12053, 39.56317], [68.54166, 39.53929], [68.61972, 39.68905], [68.63071, 39.85265], [68.88889, 39.87163], [68.93695, 39.91167], [68.84906, 40.04952], [68.96579, 40.06949], [69.01935, 40.11466], [69.01523, 40.15771], [68.62796, 40.07789], [68.52771, 40.11676], [68.5332, 40.14826], [68.77902, 40.20492], [68.79276, 40.17555], [68.84357, 40.18604], [68.85832, 40.20885], [69.04544, 40.22904], [69.15659, 40.2162], [69.2074, 40.21488], [69.30448, 40.18774], [69.30104, 40.24502], [69.25229, 40.26362], [69.24817, 40.30357], [69.30808, 40.2821], [69.32833, 40.29794], [69.33794, 40.34819], [69.30774, 40.36102], [69.28525, 40.41894], [69.27066, 40.49274], [69.21063, 40.54469], [69.2643, 40.57506], [69.3455, 40.57988], [69.32834, 40.70233], [69.38327, 40.7918], [69.53021, 40.77621], [69.59441, 40.70181], [69.69434, 40.62615], [70.36655, 40.90296], [70.38028, 41.02014], [70.45251, 41.04438], [70.80009, 40.72825], [70.49871, 40.52503], [70.32626, 40.45174], [70.37511, 40.38605], [70.57149, 40.3442], [70.56394, 40.26421], [70.62342, 40.17396], [70.8607, 40.217], [70.9818, 40.22392], [70.95789, 40.28761], [71.05901, 40.28765], [71.13042, 40.34106], [71.36663, 40.31593], [71.4246, 40.28619], [71.51215, 40.26943], [71.51549, 40.22986], [71.61725, 40.20615], [71.61931, 40.26775], [71.68386, 40.26984], [71.70569, 40.20391], [71.69621, 40.18492], [71.71719, 40.17886], [71.73054, 40.14818], [71.82646, 40.21872], [71.85002, 40.25647], [72.05464, 40.27586], [71.96401, 40.31907], [72.18648, 40.49893], [72.24368, 40.46091], [72.40346, 40.4007], [72.44191, 40.48222], [72.41513, 40.50856], [72.38384, 40.51535], [72.41714, 40.55736], [72.34406, 40.60144], [72.40517, 40.61917], [72.47795, 40.5532], [72.66713, 40.5219], [72.66713, 40.59076], [72.69579, 40.59778], [72.73995, 40.58409], [72.74768, 40.58051], [72.74862, 40.57131], [72.75982, 40.57273], [72.74894, 40.59592], [72.74866, 40.60873], [72.80137, 40.67856], [72.84754, 40.67229], [72.85372, 40.7116], [72.8722, 40.71111], [72.93296, 40.73089], [72.99133, 40.76457], [73.0612, 40.76678], [73.13412, 40.79122], [73.13267, 40.83512], [73.01869, 40.84681], [72.94454, 40.8094], [72.84291, 40.85512], [72.68157, 40.84942], [72.59136, 40.86947], [72.55109, 40.96046], [72.48742, 40.97136], [72.45206, 41.03018], [72.38511, 41.02785], [72.36138, 41.04384], [72.34757, 41.06104], [72.34026, 41.04539], [72.324, 41.03381], [72.18339, 40.99571], [72.17594, 41.02377], [72.21061, 41.05607], [72.1792, 41.10621], [72.14864, 41.13363], [72.17594, 41.15522], [72.16433, 41.16483], [72.10745, 41.15483], [72.07249, 41.11739], [71.85964, 41.19081], [71.91457, 41.2982], [71.83914, 41.3546], [71.76625, 41.4466], [71.71132, 41.43012], [71.73054, 41.54713], [71.65914, 41.49599], [71.6787, 41.42111], [71.57227, 41.29175], [71.46688, 41.31883], [71.43814, 41.19644], [71.46148, 41.13958], [71.40198, 41.09436], [71.34877, 41.16807], [71.27187, 41.11015], [71.25813, 41.18796], [71.11806, 41.15359], [71.02193, 41.19494], [70.9615, 41.16393], [70.86263, 41.23833], [70.77885, 41.24813], [70.78572, 41.36419], [70.67586, 41.47953], [70.48909, 41.40335], [70.17682, 41.5455], [70.69777, 41.92554], [71.28719, 42.18033], [71.13263, 42.28356], [70.94483, 42.26238], [69.49545, 41.545], [69.45751, 41.56863], [69.39485, 41.51518], [69.45081, 41.46246], [69.37468, 41.46555], [69.35554, 41.47211], [69.29778, 41.43673], [69.25059, 41.46693], [69.23332, 41.45847], [69.22671, 41.46298], [69.20439, 41.45391], [69.18528, 41.45175], [69.17701, 41.43769], [69.15137, 41.43078], [69.05006, 41.36183], [69.01308, 41.22804], [68.7217, 41.05025], [68.73945, 40.96989], [68.65662, 40.93861], [68.62221, 41.03019], [68.49983, 40.99669], [68.58444, 40.91447], [68.63, 40.59358], [68.49983, 40.56437], [67.96736, 40.83798], [68.1271, 41.0324], [68.08273, 41.08148], [67.98511, 41.02794], [67.9644, 41.14611], [66.69129, 41.1311], [66.53302, 41.87388], [66.00546, 41.94455], [66.09482, 42.93426], [65.85194, 42.85481]], [[70.68112, 40.90612], [70.6721, 40.90555], [70.57501, 40.98941], [70.54223, 40.98787], [70.56077, 41.00642], [70.6158, 40.97661], [70.68112, 40.90612]]], [[[71.21139, 40.03369], [71.12218, 40.03052], [71.06305, 40.1771], [71.00236, 40.18154], [71.01035, 40.05481], [71.11037, 40.01984], [71.11668, 39.99291], [71.09063, 39.99], [71.10501, 39.95568], [71.04979, 39.89808], [71.10531, 39.91354], [71.16101, 39.88423], [71.23067, 39.93581], [71.1427, 39.95026], [71.21139, 40.03369]]], [[[71.86463, 39.98598], [71.78838, 40.01404], [71.71511, 39.96348], [71.7504, 39.93701], [71.84316, 39.95582], [71.86463, 39.98598]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "VA", + iso1A3: "VAT", + iso1N3: "336", + wikidata: "Q237", + nameEn: "Vatican City", + aliases: ["Holy See"], + groups: ["039", "150"], + callingCodes: ["379", "39 06"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[12.45181, 41.90056], [12.45446, 41.90028], [12.45435, 41.90143], [12.45626, 41.90172], [12.45691, 41.90125], [12.4577, 41.90115], [12.45834, 41.90174], [12.45826, 41.90281], [12.45755, 41.9033], [12.45762, 41.9058], [12.45561, 41.90629], [12.45543, 41.90738], [12.45091, 41.90625], [12.44984, 41.90545], [12.44815, 41.90326], [12.44582, 41.90194], [12.44834, 41.90095], [12.45181, 41.90056]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "VC", + iso1A3: "VCT", + iso1N3: "670", + wikidata: "Q757", + nameEn: "St. Vincent and the Grenadines", + aliases: ["WV"], + groups: ["029", "003", "419", "019", "UN"], + driveSide: "left", + roadSpeedUnit: "mph", + callingCodes: ["1 784"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-62.64026, 12.69984], [-59.94058, 12.34011], [-61.69315, 14.26451], [-62.64026, 12.69984]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "VE", + iso1A3: "VEN", + iso1N3: "862", + wikidata: "Q717", + nameEn: "Venezuela", + aliases: ["YV"], + groups: ["005", "419", "019", "UN"], + callingCodes: ["58"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-71.22331, 13.01387], [-70.92579, 11.96275], [-71.3275, 11.85], [-71.9675, 11.65536], [-72.24983, 11.14138], [-72.4767, 11.1117], [-72.88002, 10.44309], [-72.98085, 9.85253], [-73.36905, 9.16636], [-73.02119, 9.27584], [-72.94052, 9.10663], [-72.77415, 9.10165], [-72.65474, 8.61428], [-72.4042, 8.36513], [-72.36987, 8.19976], [-72.35163, 8.01163], [-72.39137, 8.03534], [-72.47213, 7.96106], [-72.48801, 7.94329], [-72.48183, 7.92909], [-72.47042, 7.92306], [-72.45806, 7.91141], [-72.46183, 7.90682], [-72.44454, 7.86031], [-72.46763, 7.79518], [-72.47827, 7.65604], [-72.45321, 7.57232], [-72.47415, 7.48928], [-72.43132, 7.40034], [-72.19437, 7.37034], [-72.04895, 7.03837], [-71.82441, 7.04314], [-71.44118, 7.02116], [-71.42212, 7.03854], [-71.37234, 7.01588], [-71.03941, 6.98163], [-70.7596, 7.09799], [-70.10716, 6.96516], [-69.41843, 6.1072], [-67.60654, 6.2891], [-67.4625, 6.20625], [-67.43513, 5.98835], [-67.58558, 5.84537], [-67.63914, 5.64963], [-67.59141, 5.5369], [-67.83341, 5.31104], [-67.85358, 4.53249], [-67.62671, 3.74303], [-67.50067, 3.75812], [-67.30945, 3.38393], [-67.85862, 2.86727], [-67.85862, 2.79173], [-67.65696, 2.81691], [-67.21967, 2.35778], [-66.85795, 1.22998], [-66.28507, 0.74585], [-65.6727, 1.01353], [-65.50158, 0.92086], [-65.57288, 0.62856], [-65.11657, 1.12046], [-64.38932, 1.5125], [-64.34654, 1.35569], [-64.08274, 1.64792], [-64.06135, 1.94722], [-63.39827, 2.16098], [-63.39114, 2.4317], [-64.0257, 2.48156], [-64.02908, 2.79797], [-64.48379, 3.7879], [-64.84028, 4.24665], [-64.72977, 4.28931], [-64.57648, 4.12576], [-64.14512, 4.12932], [-63.99183, 3.90172], [-63.86082, 3.94796], [-63.70218, 3.91417], [-63.67099, 4.01731], [-63.50611, 3.83592], [-63.42233, 3.89995], [-63.4464, 3.9693], [-63.21111, 3.96219], [-62.98296, 3.59935], [-62.7655, 3.73099], [-62.74411, 4.03331], [-62.57656, 4.04754], [-62.44822, 4.18621], [-62.13094, 4.08309], [-61.54629, 4.2822], [-61.48569, 4.43149], [-61.29675, 4.44216], [-61.31457, 4.54167], [-61.15703, 4.49839], [-60.98303, 4.54167], [-60.86539, 4.70512], [-60.5802, 4.94312], [-60.73204, 5.20931], [-61.4041, 5.95304], [-61.15058, 6.19558], [-61.20762, 6.58174], [-61.13632, 6.70922], [-60.54873, 6.8631], [-60.39419, 6.94847], [-60.28074, 7.1162], [-60.44116, 7.20817], [-60.54098, 7.14804], [-60.63367, 7.25061], [-60.59802, 7.33194], [-60.71923, 7.55817], [-60.64793, 7.56877], [-60.51959, 7.83373], [-60.38056, 7.8302], [-60.02407, 8.04557], [-59.97059, 8.20791], [-59.83156, 8.23261], [-59.80661, 8.28906], [-59.85562, 8.35213], [-59.98508, 8.53046], [-59.54058, 8.6862], [-60.89962, 9.81445], [-62.08693, 10.04435], [-61.62505, 11.18974], [-63.73917, 11.92623], [-63.19938, 16.44103], [-67.89186, 12.4116], [-68.01417, 11.77722], [-68.33524, 11.78151], [-68.99639, 11.79035], [-71.22331, 13.01387]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "VG", + iso1A3: "VGB", + iso1N3: "092", + wikidata: "Q25305", + nameEn: "British Virgin Islands", + country: "GB", + groups: ["BOTS", "029", "003", "419", "019", "UN"], + driveSide: "left", + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["1 284"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-64.47127, 17.55688], [-63.88746, 19.15706], [-65.02435, 18.73231], [-64.86027, 18.39056], [-64.64673, 18.36549], [-64.47127, 17.55688]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "VI", + iso1A3: "VIR", + iso1N3: "850", + wikidata: "Q11703", + nameEn: "United States Virgin Islands", + aliases: ["US-VI"], + country: "US", + groups: ["Q1352230", "029", "003", "419", "019", "UN"], + driveSide: "left", + roadSpeedUnit: "mph", + roadHeightUnit: "ft", + callingCodes: ["1 340"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-65.02435, 18.73231], [-65.27974, 17.56928], [-64.47127, 17.55688], [-64.64673, 18.36549], [-64.86027, 18.39056], [-65.02435, 18.73231]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "VN", + iso1A3: "VNM", + iso1N3: "704", + wikidata: "Q881", + nameEn: "Vietnam", + groups: ["035", "142", "UN"], + callingCodes: ["84"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[108.10003, 21.47338], [108.0569, 21.53604], [108.02926, 21.54997], [107.97932, 21.54503], [107.97383, 21.53961], [107.97074, 21.54072], [107.96774, 21.53601], [107.95232, 21.5388], [107.92652, 21.58906], [107.90006, 21.5905], [107.86114, 21.65128], [107.80355, 21.66141], [107.66967, 21.60787], [107.56537, 21.61945], [107.54047, 21.5934], [107.49065, 21.59774], [107.49532, 21.62958], [107.47197, 21.6672], [107.41593, 21.64839], [107.38636, 21.59774], [107.35989, 21.60063], [107.35834, 21.6672], [107.29296, 21.74674], [107.24625, 21.7077], [107.20734, 21.71493], [107.10771, 21.79879], [107.02615, 21.81981], [107.00964, 21.85948], [107.06101, 21.88982], [107.05634, 21.92303], [106.99252, 21.95191], [106.97228, 21.92592], [106.92714, 21.93459], [106.9178, 21.97357], [106.81038, 21.97934], [106.74345, 22.00965], [106.72551, 21.97923], [106.69276, 21.96013], [106.68274, 21.99811], [106.70142, 22.02409], [106.6983, 22.15102], [106.67495, 22.1885], [106.69986, 22.22309], [106.6516, 22.33977], [106.55976, 22.34841], [106.57221, 22.37], [106.55665, 22.46498], [106.58395, 22.474], [106.61269, 22.60301], [106.65316, 22.5757], [106.71698, 22.58432], [106.72321, 22.63606], [106.76293, 22.73491], [106.82404, 22.7881], [106.83685, 22.8098], [106.81271, 22.8226], [106.78422, 22.81532], [106.71128, 22.85982], [106.71387, 22.88296], [106.6734, 22.89587], [106.6516, 22.86862], [106.60179, 22.92884], [106.55976, 22.92311], [106.51306, 22.94891], [106.49749, 22.91164], [106.34961, 22.86718], [106.27022, 22.87722], [106.19705, 22.98475], [106.00179, 22.99049], [105.99568, 22.94178], [105.90119, 22.94168], [105.8726, 22.92756], [105.72382, 23.06641], [105.57594, 23.075], [105.56037, 23.16806], [105.49966, 23.20669], [105.42805, 23.30824], [105.40782, 23.28107], [105.32376, 23.39684], [105.22569, 23.27249], [105.17276, 23.28679], [105.11672, 23.25247], [105.07002, 23.26248], [104.98712, 23.19176], [104.96532, 23.20463], [104.9486, 23.17235], [104.91435, 23.18666], [104.87992, 23.17141], [104.87382, 23.12854], [104.79478, 23.12934], [104.8334, 23.01484], [104.86765, 22.95178], [104.84942, 22.93631], [104.77114, 22.90017], [104.72755, 22.81984], [104.65283, 22.83419], [104.60457, 22.81841], [104.58122, 22.85571], [104.47225, 22.75813], [104.35593, 22.69353], [104.25683, 22.76534], [104.27084, 22.8457], [104.11384, 22.80363], [104.03734, 22.72945], [104.01088, 22.51823], [103.99247, 22.51958], [103.97384, 22.50634], [103.96783, 22.51173], [103.96352, 22.50584], [103.95191, 22.5134], [103.94513, 22.52553], [103.93286, 22.52703], [103.87904, 22.56683], [103.64506, 22.79979], [103.56255, 22.69499], [103.57812, 22.65764], [103.52675, 22.59155], [103.43646, 22.70648], [103.43179, 22.75816], [103.32282, 22.8127], [103.28079, 22.68063], [103.18895, 22.64471], [103.15782, 22.59873], [103.17961, 22.55705], [103.07843, 22.50097], [103.0722, 22.44775], [102.9321, 22.48659], [102.8636, 22.60735], [102.60675, 22.73376], [102.57095, 22.7036], [102.51802, 22.77969], [102.46665, 22.77108], [102.42618, 22.69212], [102.38415, 22.67919], [102.41061, 22.64184], [102.25339, 22.4607], [102.26428, 22.41321], [102.16621, 22.43336], [102.14099, 22.40092], [102.18712, 22.30403], [102.51734, 22.02676], [102.49092, 21.99002], [102.62301, 21.91447], [102.67145, 21.65894], [102.74189, 21.66713], [102.82115, 21.73667], [102.81894, 21.83888], [102.85637, 21.84501], [102.86077, 21.71213], [102.97965, 21.74076], [102.98846, 21.58936], [102.86297, 21.4255], [102.94223, 21.46034], [102.88939, 21.3107], [102.80794, 21.25736], [102.89825, 21.24707], [102.97745, 21.05821], [103.03469, 21.05821], [103.12055, 20.89994], [103.21497, 20.89832], [103.38032, 20.79501], [103.45737, 20.82382], [103.68633, 20.66324], [103.73478, 20.6669], [103.82282, 20.8732], [103.98024, 20.91531], [104.11121, 20.96779], [104.27412, 20.91433], [104.63957, 20.6653], [104.38199, 20.47155], [104.40621, 20.3849], [104.47886, 20.37459], [104.66158, 20.47774], [104.72102, 20.40554], [104.62195, 20.36633], [104.61315, 20.24452], [104.86852, 20.14121], [104.91695, 20.15567], [104.9874, 20.09573], [104.8465, 19.91783], [104.8355, 19.80395], [104.68359, 19.72729], [104.64837, 19.62365], [104.53169, 19.61743], [104.41281, 19.70035], [104.23229, 19.70242], [104.06498, 19.66926], [104.05617, 19.61743], [104.10832, 19.51575], [104.06058, 19.43484], [103.87125, 19.31854], [104.5361, 18.97747], [104.64617, 18.85668], [105.12829, 18.70453], [105.19654, 18.64196], [105.1327, 18.58355], [105.10408, 18.43533], [105.15942, 18.38691], [105.38366, 18.15315], [105.46292, 18.22008], [105.64784, 17.96687], [105.60381, 17.89356], [105.76612, 17.67147], [105.85744, 17.63221], [106.09019, 17.36399], [106.18991, 17.28227], [106.24444, 17.24714], [106.29287, 17.3018], [106.31929, 17.20509], [106.43597, 17.01362], [106.50862, 16.9673], [106.55045, 17.0031], [106.54824, 16.92729], [106.51963, 16.92097], [106.52183, 16.87884], [106.55265, 16.86831], [106.55485, 16.68704], [106.59013, 16.62259], [106.58267, 16.6012], [106.61477, 16.60713], [106.66052, 16.56892], [106.65832, 16.47816], [106.74418, 16.41904], [106.84104, 16.55415], [106.88727, 16.52671], [106.88067, 16.43594], [106.96638, 16.34938], [106.97385, 16.30204], [107.02597, 16.31132], [107.09091, 16.3092], [107.15035, 16.26271], [107.14595, 16.17816], [107.25822, 16.13587], [107.33968, 16.05549], [107.44975, 16.08511], [107.46296, 16.01106], [107.39471, 15.88829], [107.34188, 15.89464], [107.21419, 15.83747], [107.21859, 15.74638], [107.27143, 15.71459], [107.27583, 15.62769], [107.34408, 15.62345], [107.3815, 15.49832], [107.50699, 15.48771], [107.53341, 15.40496], [107.62367, 15.42193], [107.60605, 15.37524], [107.62587, 15.2266], [107.58844, 15.20111], [107.61926, 15.13949], [107.61486, 15.0566], [107.46516, 15.00982], [107.48277, 14.93751], [107.59285, 14.87795], [107.51579, 14.79282], [107.54361, 14.69092], [107.55371, 14.628], [107.52102, 14.59034], [107.52569, 14.54665], [107.48521, 14.40346], [107.44941, 14.41552], [107.39493, 14.32655], [107.40427, 14.24509], [107.33577, 14.11832], [107.37158, 14.07906], [107.35757, 14.02319], [107.38247, 13.99147], [107.44318, 13.99751], [107.46498, 13.91593], [107.45252, 13.78897], [107.53503, 13.73908], [107.61909, 13.52577], [107.62843, 13.3668], [107.49144, 13.01215], [107.49611, 12.88926], [107.55993, 12.7982], [107.5755, 12.52177], [107.55059, 12.36824], [107.4463, 12.29373], [107.42917, 12.24657], [107.34511, 12.33327], [107.15831, 12.27547], [106.99953, 12.08983], [106.92325, 12.06548], [106.79405, 12.0807], [106.70687, 11.96956], [106.4111, 11.97413], [106.4687, 11.86751], [106.44068, 11.86294], [106.44535, 11.8279], [106.41577, 11.76999], [106.45158, 11.68616], [106.44691, 11.66787], [106.37219, 11.69836], [106.30525, 11.67549], [106.26478, 11.72122], [106.18539, 11.75171], [106.13158, 11.73283], [106.06708, 11.77761], [106.02038, 11.77457], [106.00792, 11.7197], [105.95188, 11.63738], [105.88962, 11.67854], [105.8507, 11.66635], [105.80867, 11.60536], [105.81645, 11.56876], [105.87328, 11.55953], [105.88962, 11.43605], [105.86782, 11.28343], [106.10444, 11.07879], [106.1527, 11.10476], [106.1757, 11.07301], [106.20095, 10.97795], [106.14301, 10.98176], [106.18539, 10.79451], [106.06708, 10.8098], [105.94535, 10.9168], [105.93403, 10.83853], [105.84603, 10.85873], [105.86376, 10.89839], [105.77751, 11.03671], [105.50045, 10.94586], [105.42884, 10.96878], [105.34011, 10.86179], [105.11449, 10.96332], [105.08326, 10.95656], [105.02722, 10.89236], [105.09571, 10.72722], [104.95094, 10.64003], [104.87933, 10.52833], [104.59018, 10.53073], [104.49869, 10.4057], [104.47963, 10.43046], [104.43778, 10.42386], [103.99198, 10.48391], [102.47649, 9.66162], [104.81582, 8.03101], [109.55486, 8.10026], [111.60491, 13.57105], [108.00365, 17.98159], [108.10003, 21.47338]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "VU", + iso1A3: "VUT", + iso1N3: "548", + wikidata: "Q686", + nameEn: "Vanuatu", + groups: ["054", "009", "UN"], + callingCodes: ["678"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[156.73836, -14.50464], [174.245, -23.1974], [172.71443, -12.01327], [156.73836, -14.50464]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "WF", + iso1A3: "WLF", + iso1N3: "876", + wikidata: "Q35555", + nameEn: "Wallis and Futuna", + country: "FR", + groups: ["Q1451600", "061", "009", "UN"], + callingCodes: ["681"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-178.66551, -14.32452], [-176.76826, -14.95183], [-175.59809, -12.61507], [-178.66551, -14.32452]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "WS", + iso1A3: "WSM", + iso1N3: "882", + wikidata: "Q683", + nameEn: "Samoa", + groups: ["061", "009", "UN"], + driveSide: "left", + callingCodes: ["685"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[-173.74402, -14.26669], [-170.99605, -15.1275], [-171.39864, -10.21587], [-173.74402, -14.26669]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "XK", + iso1A3: "XKX", + wikidata: "Q1246", + nameEn: "Kosovo", + aliases: ["KV"], + groups: ["039", "150"], + isoStatus: "usrAssn", + callingCodes: ["383"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[21.39045, 42.74888], [21.44047, 42.87276], [21.36941, 42.87397], [21.32974, 42.90424], [21.2719, 42.8994], [21.23534, 42.95523], [21.23877, 43.00848], [21.2041, 43.02277], [21.16734, 42.99694], [21.14465, 43.11089], [21.08952, 43.13471], [21.05378, 43.10707], [21.00749, 43.13984], [20.96287, 43.12416], [20.83727, 43.17842], [20.88685, 43.21697], [20.82145, 43.26769], [20.73811, 43.25068], [20.68688, 43.21335], [20.59929, 43.20492], [20.69515, 43.09641], [20.64557, 43.00826], [20.59929, 43.01067], [20.48692, 42.93208], [20.53484, 42.8885], [20.43734, 42.83157], [20.40594, 42.84853], [20.35692, 42.8335], [20.27869, 42.81945], [20.2539, 42.76245], [20.04898, 42.77701], [20.02088, 42.74789], [20.02915, 42.71147], [20.0969, 42.65559], [20.07761, 42.55582], [20.17127, 42.50469], [20.21797, 42.41237], [20.24399, 42.32168], [20.34479, 42.32656], [20.3819, 42.3029], [20.48857, 42.25444], [20.56955, 42.12097], [20.55633, 42.08173], [20.59434, 42.03879], [20.63069, 41.94913], [20.57946, 41.91593], [20.59524, 41.8818], [20.68523, 41.85318], [20.76786, 41.91839], [20.75464, 42.05229], [21.11491, 42.20794], [21.16614, 42.19815], [21.22728, 42.08909], [21.31983, 42.10993], [21.29913, 42.13954], [21.30496, 42.1418], [21.38428, 42.24465], [21.43882, 42.23609], [21.43882, 42.2789], [21.50823, 42.27156], [21.52145, 42.24465], [21.58992, 42.25915], [21.56772, 42.30946], [21.5264, 42.33634], [21.53467, 42.36809], [21.57021, 42.3647], [21.59029, 42.38042], [21.62887, 42.37664], [21.64209, 42.41081], [21.62556, 42.45106], [21.7035, 42.51899], [21.70522, 42.54176], [21.7327, 42.55041], [21.75672, 42.62695], [21.79413, 42.65923], [21.75025, 42.70125], [21.6626, 42.67813], [21.58755, 42.70418], [21.59154, 42.72643], [21.47498, 42.74695], [21.39045, 42.74888]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "YE", + iso1A3: "YEM", + iso1N3: "887", + wikidata: "Q805", + nameEn: "Yemen", + groups: ["145", "142", "UN"], + callingCodes: ["967"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[57.49095, 8.14549], [52.81185, 17.28568], [52.74267, 17.29519], [52.78009, 17.35124], [52.00311, 19.00083], [49.04884, 18.59899], [48.19996, 18.20584], [47.58351, 17.50366], [47.48245, 17.10808], [47.00571, 16.94765], [46.76494, 17.29151], [46.31018, 17.20464], [44.50126, 17.47475], [43.70631, 17.35762], [43.43005, 17.56148], [43.29185, 17.53224], [43.22533, 17.38343], [43.32653, 17.31179], [43.20156, 17.25901], [43.17787, 17.14717], [43.23967, 17.03428], [43.18233, 17.02673], [43.1813, 16.98438], [43.19328, 16.94703], [43.1398, 16.90696], [43.18338, 16.84852], [43.22012, 16.83932], [43.22956, 16.80613], [43.24801, 16.80613], [43.26303, 16.79479], [43.25857, 16.75304], [43.21325, 16.74416], [43.22066, 16.65179], [43.15274, 16.67248], [43.11601, 16.53166], [42.97215, 16.51093], [42.94351, 16.49467], [42.94625, 16.39721], [42.76801, 16.40371], [42.15205, 16.40211], [40.99158, 15.81743], [43.29075, 12.79154], [43.32909, 12.59711], [43.90659, 12.3823], [51.12877, 12.56479], [57.49095, 8.14549]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "YT", + iso1A3: "MYT", + iso1N3: "175", + wikidata: "Q17063", + nameEn: "Mayotte", + country: "FR", + groups: ["Q3320166", "EU", "014", "202", "002", "UN"], + callingCodes: ["262"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[43.28731, -13.97126], [45.54824, -13.22353], [45.4971, -11.75965], [43.28731, -13.97126]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "ZA", + iso1A3: "ZAF", + iso1N3: "710", + wikidata: "Q258", + nameEn: "South Africa", + groups: ["018", "202", "002", "UN"], + driveSide: "left", + callingCodes: ["27"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[31.30611, -22.422], [31.16344, -22.32599], [31.08932, -22.34884], [30.86696, -22.28907], [30.6294, -22.32599], [30.48686, -22.31368], [30.38614, -22.34533], [30.28351, -22.35587], [30.2265, -22.2961], [30.13147, -22.30841], [29.92242, -22.19408], [29.76848, -22.14128], [29.64609, -22.12917], [29.37703, -22.19581], [29.21955, -22.17771], [29.18974, -22.18599], [29.15268, -22.21399], [29.10881, -22.21202], [29.0151, -22.22907], [28.91889, -22.44299], [28.63287, -22.55887], [28.34874, -22.5694], [28.04562, -22.8394], [28.04752, -22.90243], [27.93729, -22.96194], [27.93539, -23.04941], [27.74154, -23.2137], [27.6066, -23.21894], [27.52393, -23.37952], [27.33768, -23.40917], [26.99749, -23.65486], [26.84165, -24.24885], [26.51667, -24.47219], [26.46346, -24.60358], [26.39409, -24.63468], [25.8515, -24.75727], [25.84295, -24.78661], [25.88571, -24.87802], [25.72702, -25.25503], [25.69661, -25.29284], [25.6643, -25.4491], [25.58543, -25.6343], [25.33076, -25.76616], [25.12266, -25.75931], [25.01718, -25.72507], [24.8946, -25.80723], [24.67319, -25.81749], [24.44703, -25.73021], [24.36531, -25.773], [24.18287, -25.62916], [23.9244, -25.64286], [23.47588, -25.29971], [23.03497, -25.29971], [22.86012, -25.50572], [22.70808, -25.99186], [22.56365, -26.19668], [22.41921, -26.23078], [22.21206, -26.3773], [22.06192, -26.61882], [21.90703, -26.66808], [21.83291, -26.65959], [21.77114, -26.69015], [21.7854, -26.79199], [21.69322, -26.86152], [21.37869, -26.82083], [21.13353, -26.86661], [20.87031, -26.80047], [20.68596, -26.9039], [20.63275, -26.78181], [20.61754, -26.4692], [20.86081, -26.14892], [20.64795, -25.47827], [20.29826, -24.94869], [20.03678, -24.81004], [20.02809, -24.78725], [19.99817, -24.76768], [19.99882, -28.42622], [18.99885, -28.89165], [17.4579, -28.68718], [17.15405, -28.08573], [16.90446, -28.057], [16.59922, -28.53246], [16.46592, -28.57126], [16.45332, -28.63117], [12.51595, -32.27486], [38.88176, -48.03306], [34.51034, -26.91792], [32.35222, -26.86027], [32.29584, -26.852], [32.22302, -26.84136], [32.19409, -26.84032], [32.13315, -26.84345], [32.09664, -26.80721], [32.00893, -26.8096], [31.97463, -27.11057], [31.97592, -27.31675], [31.49834, -27.31549], [31.15027, -27.20151], [30.96088, -27.0245], [30.97757, -26.92706], [30.88826, -26.79622], [30.81101, -26.84722], [30.78927, -26.48271], [30.95819, -26.26303], [31.13073, -25.91558], [31.31237, -25.7431], [31.4175, -25.71886], [31.86881, -25.99973], [31.974, -25.95387], [31.92649, -25.84216], [32.00631, -25.65044], [31.97875, -25.46356], [32.01676, -25.38117], [32.03196, -25.10785], [31.9835, -24.29983], [31.90368, -24.18892], [31.87707, -23.95293], [31.77445, -23.90082], [31.70223, -23.72695], [31.67942, -23.60858], [31.56539, -23.47268], [31.55779, -23.176], [31.30611, -22.422]], [[29.33204, -29.45598], [29.28545, -29.58456], [29.12553, -29.76266], [29.16548, -29.91706], [28.9338, -30.05072], [28.80222, -30.10579], [28.68627, -30.12885], [28.399, -30.1592], [28.2319, -30.28476], [28.12073, -30.68072], [27.74814, -30.60635], [27.69467, -30.55862], [27.67819, -30.53437], [27.6521, -30.51707], [27.62137, -30.50509], [27.56781, -30.44562], [27.56901, -30.42504], [27.45452, -30.32239], [27.38108, -30.33456], [27.36649, -30.27246], [27.37293, -30.19401], [27.40778, -30.14577], [27.32555, -30.14785], [27.29603, -30.05473], [27.22719, -30.00718], [27.09489, -29.72796], [27.01016, -29.65439], [27.33464, -29.48161], [27.4358, -29.33465], [27.47254, -29.31968], [27.45125, -29.29708], [27.48679, -29.29349], [27.54258, -29.25575], [27.5158, -29.2261], [27.55974, -29.18954], [27.75458, -28.89839], [27.8907, -28.91612], [27.88933, -28.88156], [27.9392, -28.84864], [27.98675, -28.8787], [28.02503, -28.85991], [28.1317, -28.7293], [28.2348, -28.69471], [28.30518, -28.69531], [28.40612, -28.6215], [28.65091, -28.57025], [28.68043, -28.58744], [29.40524, -29.21246], [29.44883, -29.3772], [29.33204, -29.45598]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "ZM", + iso1A3: "ZMB", + iso1N3: "894", + wikidata: "Q953", + nameEn: "Zambia", + groups: ["014", "202", "002", "UN"], + driveSide: "left", + callingCodes: ["260"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[32.95389, -9.40138], [32.76233, -9.31963], [32.75611, -9.28583], [32.53661, -9.24281], [32.49147, -9.14754], [32.43543, -9.11988], [32.25486, -9.13371], [32.16146, -9.05993], [32.08206, -9.04609], [31.98866, -9.07069], [31.94196, -9.02303], [31.94663, -8.93846], [31.81587, -8.88618], [31.71158, -8.91386], [31.57147, -8.81388], [31.57147, -8.70619], [31.37533, -8.60769], [31.00796, -8.58615], [30.79243, -8.27382], [28.88917, -8.4831], [28.9711, -8.66935], [28.38526, -9.23393], [28.36562, -9.30091], [28.52636, -9.35379], [28.51627, -9.44726], [28.56208, -9.49122], [28.68532, -9.78], [28.62795, -9.92942], [28.65032, -10.65133], [28.37241, -11.57848], [28.48357, -11.87532], [29.18592, -12.37921], [29.4992, -12.43843], [29.48404, -12.23604], [29.8139, -12.14898], [29.81551, -13.44683], [29.65078, -13.41844], [29.60531, -13.21685], [29.01918, -13.41353], [28.33199, -12.41375], [27.59932, -12.22123], [27.21025, -11.76157], [27.22541, -11.60323], [27.04351, -11.61312], [26.88687, -12.01868], [26.01777, -11.91488], [25.33058, -11.65767], [25.34069, -11.19707], [24.42612, -11.44975], [24.34528, -11.06816], [24.00027, -10.89356], [24.02603, -11.15368], [23.98804, -12.13149], [24.06672, -12.29058], [23.90937, -12.844], [24.03339, -12.99091], [21.97988, -13.00148], [22.00323, -16.18028], [22.17217, -16.50269], [23.20038, -17.47563], [23.47474, -17.62877], [24.23619, -17.47489], [24.32811, -17.49082], [24.38712, -17.46818], [24.5621, -17.52963], [24.70864, -17.49501], [25.00198, -17.58221], [25.26433, -17.79571], [25.51646, -17.86232], [25.6827, -17.81987], [25.85738, -17.91403], [25.85892, -17.97726], [26.08925, -17.98168], [26.0908, -17.93021], [26.21601, -17.88608], [26.55918, -17.99638], [26.68403, -18.07411], [26.74314, -18.0199], [26.89926, -17.98756], [27.14196, -17.81398], [27.30736, -17.60487], [27.61377, -17.34378], [27.62795, -17.24365], [27.83141, -16.96274], [28.73725, -16.5528], [28.76199, -16.51575], [28.81454, -16.48611], [28.8501, -16.04537], [28.9243, -15.93987], [29.01298, -15.93805], [29.21955, -15.76589], [29.4437, -15.68702], [29.8317, -15.6126], [30.35574, -15.6513], [30.41902, -15.62269], [30.22098, -14.99447], [33.24249, -14.00019], [33.16749, -13.93992], [33.07568, -13.98447], [33.02977, -14.05022], [32.99042, -13.95689], [32.88985, -13.82956], [32.79015, -13.80755], [32.76962, -13.77224], [32.84528, -13.71576], [32.7828, -13.64805], [32.68654, -13.64268], [32.66468, -13.60019], [32.68436, -13.55769], [32.73683, -13.57682], [32.84176, -13.52794], [32.86113, -13.47292], [33.0078, -13.19492], [32.98289, -13.12671], [33.02181, -12.88707], [32.96733, -12.88251], [32.94397, -12.76868], [33.05917, -12.59554], [33.18837, -12.61377], [33.28177, -12.54692], [33.37517, -12.54085], [33.54485, -12.35996], [33.47636, -12.32498], [33.3705, -12.34931], [33.25998, -12.14242], [33.33937, -11.91252], [33.32692, -11.59248], [33.24252, -11.59302], [33.23663, -11.40637], [33.29267, -11.43536], [33.29267, -11.3789], [33.39697, -11.15296], [33.25998, -10.88862], [33.28022, -10.84428], [33.47636, -10.78465], [33.70675, -10.56896], [33.54797, -10.36077], [33.53863, -10.20148], [33.31297, -10.05133], [33.37902, -9.9104], [33.36581, -9.81063], [33.31517, -9.82364], [33.2095, -9.61099], [33.12144, -9.58929], [33.10163, -9.66525], [33.05485, -9.61316], [33.00256, -9.63053], [33.00476, -9.5133], [32.95389, -9.40138]]]] + } + }, { + type: "Feature", + properties: { + iso1A2: "ZW", + iso1A3: "ZWE", + iso1N3: "716", + wikidata: "Q954", + nameEn: "Zimbabwe", + groups: ["014", "202", "002", "UN"], + driveSide: "left", + callingCodes: ["263"] + }, + geometry: { + type: "MultiPolygon", + coordinates: [[[[30.41902, -15.62269], [30.35574, -15.6513], [29.8317, -15.6126], [29.4437, -15.68702], [29.21955, -15.76589], [29.01298, -15.93805], [28.9243, -15.93987], [28.8501, -16.04537], [28.81454, -16.48611], [28.76199, -16.51575], [28.73725, -16.5528], [27.83141, -16.96274], [27.62795, -17.24365], [27.61377, -17.34378], [27.30736, -17.60487], [27.14196, -17.81398], [26.89926, -17.98756], [26.74314, -18.0199], [26.68403, -18.07411], [26.55918, -17.99638], [26.21601, -17.88608], [26.0908, -17.93021], [26.08925, -17.98168], [25.85892, -17.97726], [25.85738, -17.91403], [25.6827, -17.81987], [25.51646, -17.86232], [25.26433, -17.79571], [25.23909, -17.90832], [25.31799, -18.07091], [25.39972, -18.12691], [25.53465, -18.39041], [25.68859, -18.56165], [25.79217, -18.6355], [25.82353, -18.82808], [25.94326, -18.90362], [25.99837, -19.02943], [25.96226, -19.08152], [26.17227, -19.53709], [26.72246, -19.92707], [27.21278, -20.08244], [27.29831, -20.28935], [27.28865, -20.49873], [27.69361, -20.48531], [27.72972, -20.51735], [27.69171, -21.08409], [27.91407, -21.31621], [28.01669, -21.57624], [28.29416, -21.59037], [28.49942, -21.66634], [28.58114, -21.63455], [29.07763, -21.81877], [29.04023, -21.85864], [29.02191, -21.90647], [29.02191, -21.95665], [29.04108, -22.00563], [29.08495, -22.04867], [29.14501, -22.07275], [29.1974, -22.07472], [29.24648, -22.05967], [29.3533, -22.18363], [29.37703, -22.19581], [29.64609, -22.12917], [29.76848, -22.14128], [29.92242, -22.19408], [30.13147, -22.30841], [30.2265, -22.2961], [30.28351, -22.35587], [30.38614, -22.34533], [30.48686, -22.31368], [30.6294, -22.32599], [30.86696, -22.28907], [31.08932, -22.34884], [31.16344, -22.32599], [31.30611, -22.422], [31.38336, -22.36919], [32.41234, -21.31246], [32.48236, -21.32873], [32.37115, -21.133], [32.51644, -20.91929], [32.48122, -20.63319], [32.55167, -20.56312], [32.66174, -20.56106], [32.85987, -20.27841], [32.85987, -20.16686], [32.93032, -20.03868], [33.01178, -20.02007], [33.06461, -19.77787], [32.95013, -19.67219], [32.84666, -19.68462], [32.84446, -19.48343], [32.78282, -19.47513], [32.77966, -19.36098], [32.85107, -19.29238], [32.87088, -19.09279], [32.84006, -19.0262], [32.72118, -19.02204], [32.69917, -18.94293], [32.73439, -18.92628], [32.70137, -18.84712], [32.82465, -18.77419], [32.9017, -18.7992], [32.95013, -18.69079], [32.88629, -18.58023], [32.88629, -18.51344], [33.02278, -18.4696], [33.03159, -18.35054], [32.94133, -17.99705], [33.0492, -17.60298], [32.98536, -17.55891], [32.96554, -17.48964], [33.0426, -17.3468], [33.00517, -17.30477], [32.96554, -17.11971], [32.84113, -16.92259], [32.91051, -16.89446], [32.97655, -16.70689], [32.78943, -16.70267], [32.69917, -16.66893], [32.71017, -16.59932], [32.42838, -16.4727], [32.28529, -16.43892], [32.02772, -16.43892], [31.91324, -16.41569], [31.90223, -16.34388], [31.67988, -16.19595], [31.42451, -16.15154], [31.30563, -16.01193], [31.13171, -15.98019], [30.97761, -16.05848], [30.91597, -15.99924], [30.42568, -15.9962], [30.41902, -15.62269]]]] + } + }]; + var borders_default = { + type: type, + features: features + }; // src/country-coder.ts - // returns an selector to select entity ids for: - // - entityIDs passed in - // - shallow descendant entityIDs for any of those entities that are relations - function utilEntityOrMemberSelector(ids, graph) { - var seen = new Set(ids); - ids.forEach(collectShallowDescendants); - return utilEntitySelector(Array.from(seen)); + var borders = borders_default; + var whichPolygonGetter = {}; + var featuresByCode = {}; + var idFilterRegex = /(?=(?!^(and|the|of|el|la|de)$))(\b(and|the|of|el|la|de)\b)|[-_ .,'()&[\]/]/gi; - function collectShallowDescendants(id) { - var entity = graph.hasEntity(id); - if (!entity || entity.type !== 'relation') { return; } + function canonicalID(id) { + var s = id || ""; - entity.members - .map(function(member) { return member.id; }) - .forEach(function(id) { seen.add(id); }); - } + if (s.charAt(0) === ".") { + return s.toUpperCase(); + } else { + return s.replace(idFilterRegex, "").toUpperCase(); + } } + var levels = ["subterritory", "territory", "subcountryGroup", "country", "sharedLandform", "intermediateRegion", "subregion", "region", "subunion", "union", "unitedNations", "world"]; + loadDerivedDataAndCaches(borders); - // returns an selector to select entity ids for: - // - entityIDs passed in - // - deep descendant entityIDs for any of those entities that are relations - function utilEntityOrDeepMemberSelector(ids, graph) { - return utilEntitySelector(utilEntityAndDeepMemberIDs(ids, graph)); - } + function loadDerivedDataAndCaches(borders2) { + var identifierProps = ["iso1A2", "iso1A3", "m49", "wikidata", "emojiFlag", "ccTLD", "nameEn"]; + var geometryFeatures = []; + for (var i in borders2.features) { + var feature2 = borders2.features[i]; + feature2.properties.id = feature2.properties.iso1A2 || feature2.properties.m49 || feature2.properties.wikidata; + loadM49(feature2); + loadTLD(feature2); + loadIsoStatus(feature2); + loadLevel(feature2); + loadGroups(feature2); + loadFlag(feature2); + cacheFeatureByIDs(feature2); + if (feature2.geometry) geometryFeatures.push(feature2); + } + + for (var _i in borders2.features) { + var _feature = borders2.features[_i]; + _feature.properties.groups = _feature.properties.groups.map(function (groupID) { + return featuresByCode[groupID].properties.id; + }); + loadMembersForGroupsOf(_feature); + } + + for (var _i2 in borders2.features) { + var _feature2 = borders2.features[_i2]; + loadRoadSpeedUnit(_feature2); + loadRoadHeightUnit(_feature2); + loadDriveSide(_feature2); + loadCallingCodes(_feature2); + loadGroupGroups(_feature2); + } - // returns an selector to select entity ids for: - // - entityIDs passed in - // - deep descendant entityIDs for any of those entities that are relations - function utilEntityAndDeepMemberIDs(ids, graph) { - var seen = new Set(); - ids.forEach(collectDeepDescendants); - return Array.from(seen); + for (var _i3 in borders2.features) { + var _feature3 = borders2.features[_i3]; - function collectDeepDescendants(id) { - if (seen.has(id)) { return; } - seen.add(id); + _feature3.properties.groups.sort(function (groupID1, groupID2) { + return levels.indexOf(featuresByCode[groupID1].properties.level) - levels.indexOf(featuresByCode[groupID2].properties.level); + }); - var entity = graph.hasEntity(id); - if (!entity || entity.type !== 'relation') { return; } + if (_feature3.properties.members) _feature3.properties.members.sort(function (id1, id2) { + var diff = levels.indexOf(featuresByCode[id1].properties.level) - levels.indexOf(featuresByCode[id2].properties.level); - entity.members - .map(function(member) { return member.id; }) - .forEach(collectDeepDescendants); // recurse - } - } + if (diff === 0) { + return borders2.features.indexOf(featuresByCode[id1]) - borders2.features.indexOf(featuresByCode[id2]); + } - // returns an selector to select entity ids for: - // - deep descendant entityIDs for any of those entities that are relations - function utilDeepMemberSelector(ids, graph, skipMultipolgonMembers) { - var idsSet = new Set(ids); - var seen = new Set(); - var returners = new Set(); - ids.forEach(collectDeepDescendants); - return utilEntitySelector(Array.from(returners)); + return diff; + }); + } - function collectDeepDescendants(id) { - if (seen.has(id)) { return; } - seen.add(id); + var geometryOnlyCollection = { + type: "FeatureCollection", + features: geometryFeatures + }; + whichPolygonGetter = whichPolygon_1(geometryOnlyCollection); - if (!idsSet.has(id)) { - returners.add(id); - } + function loadGroups(feature2) { + var props = feature2.properties; - var entity = graph.hasEntity(id); - if (!entity || entity.type !== 'relation') { return; } - if (skipMultipolgonMembers && entity.isMultipolygon()) { return; } - entity.members - .map(function(member) { return member.id; }) - .forEach(collectDeepDescendants); // recurse + if (!props.groups) { + props.groups = []; } - } + if (feature2.geometry && props.country) { + props.groups.push(props.country); + } - // Adds or removes highlight styling for the specified entities - function utilHighlightEntities(ids, highlighted, context) { - context.surface() - .selectAll(utilEntityOrDeepMemberSelector(ids, context.graph())) - .classed('highlighted', highlighted); - } + if (props.m49 !== "001") { + props.groups.push("001"); + } + } + function loadM49(feature2) { + var props = feature2.properties; - // returns an Array that is the union of: - // - nodes for any nodeIDs passed in - // - child nodes of any wayIDs passed in - // - descendant member and child nodes of relationIDs passed in - function utilGetAllNodes(ids, graph) { - var seen = new Set(); - var nodes = new Set(); + if (!props.m49 && props.iso1N3) { + props.m49 = props.iso1N3; + } + } - ids.forEach(collectNodes); - return Array.from(nodes); + function loadTLD(feature2) { + var props = feature2.properties; + if (props.level === "unitedNations") return; - function collectNodes(id) { - if (seen.has(id)) { return; } - seen.add(id); + if (!props.ccTLD && props.iso1A2) { + props.ccTLD = "." + props.iso1A2.toLowerCase(); + } + } - var entity = graph.hasEntity(id); - if (!entity) { return; } + function loadIsoStatus(feature2) { + var props = feature2.properties; - if (entity.type === 'node') { - nodes.add(entity); - } else if (entity.type === 'way') { - entity.nodes.forEach(collectNodes); - } else { - entity.members - .map(function(member) { return member.id; }) - .forEach(collectNodes); // recurse - } + if (!props.isoStatus && props.iso1A2) { + props.isoStatus = "official"; } - } - + } - function utilDisplayName(entity) { - var localizedNameKey = 'name:' + _mainLocalizer.languageCode().toLowerCase(); - var name = entity.tags[localizedNameKey] || entity.tags.name || ''; - var network = entity.tags.cycle_network || entity.tags.network; + function loadLevel(feature2) { + var props = feature2.properties; + if (props.level) return; - if (!name && entity.tags.ref) { - name = entity.tags.ref; - if (network) { - name = network + ' ' + name; - } + if (!props.country) { + props.level = "country"; + } else if (!props.iso1A2 || props.isoStatus === "official") { + props.level = "territory"; + } else { + props.level = "subterritory"; } + } - return name; - } + function loadGroupGroups(feature2) { + var props = feature2.properties; + if (feature2.geometry || !props.members) return; + var featureLevelIndex = levels.indexOf(props.level); + var sharedGroups = []; + var _loop = function _loop(_i4) { + var memberID = props.members[_i4]; + var member = featuresByCode[memberID]; + var memberGroups = member.properties.groups.filter(function (groupID) { + return groupID !== feature2.properties.id && featureLevelIndex < levels.indexOf(featuresByCode[groupID].properties.level); + }); - function utilDisplayNameForPath(entity) { - var name = utilDisplayName(entity); - var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1; + if (_i4 === "0") { + sharedGroups = memberGroups; + } else { + sharedGroups = sharedGroups.filter(function (groupID) { + return memberGroups.indexOf(groupID) !== -1; + }); + } + }; - if (!isFirefox && name && rtlRegex.test(name)) { - name = fixRTLTextForSvg(name); + for (var _i4 in props.members) { + _loop(_i4); } - return name; - } + props.groups = props.groups.concat(sharedGroups.filter(function (groupID) { + return props.groups.indexOf(groupID) === -1; + })); + for (var j in sharedGroups) { + var groupFeature = featuresByCode[sharedGroups[j]]; - function utilDisplayType(id) { - return { - n: _t('inspector.node'), - w: _t('inspector.way'), - r: _t('inspector.relation') - }[id.charAt(0)]; - } + if (groupFeature.properties.members.indexOf(props.id) === -1) { + groupFeature.properties.members.push(props.id); + } + } + } + function loadRoadSpeedUnit(feature2) { + var props = feature2.properties; - function utilDisplayLabel(entity, graph) { - var displayName = utilDisplayName(entity); - if (displayName) { - // use the display name if there is one - return displayName; + if (feature2.geometry) { + if (!props.roadSpeedUnit) props.roadSpeedUnit = "km/h"; + } else if (props.members) { + var vals = Array.from(new Set(props.members.map(function (id) { + var member = featuresByCode[id]; + if (member.geometry) return member.properties.roadSpeedUnit || "km/h"; + }).filter(Boolean))); + if (vals.length === 1) props.roadSpeedUnit = vals[0]; } - var preset = _mainPresetIndex.match(entity, graph); - if (preset && preset.name()) { - // use the preset name if there is a match - return preset.name(); - } - // fallback to the display type (node/way/relation) - return utilDisplayType(entity.id); - } + } + function loadRoadHeightUnit(feature2) { + var props = feature2.properties; - function utilEntityRoot(entityType) { - return { - node: 'n', - way: 'w', - relation: 'r' - }[entityType]; - } + if (feature2.geometry) { + if (!props.roadHeightUnit) props.roadHeightUnit = "m"; + } else if (props.members) { + var vals = Array.from(new Set(props.members.map(function (id) { + var member = featuresByCode[id]; + if (member.geometry) return member.properties.roadHeightUnit || "m"; + }).filter(Boolean))); + if (vals.length === 1) props.roadHeightUnit = vals[0]; + } + } + function loadDriveSide(feature2) { + var props = feature2.properties; - // Returns a single object containing the tags of all the given entities. - // Example: - // { - // highway: 'service', - // service: 'parking_aisle' - // } - // + - // { - // highway: 'service', - // service: 'driveway', - // width: '3' - // } - // = - // { - // highway: 'service', - // service: [ 'driveway', 'parking_aisle' ], - // width: [ '3', undefined ] - // } - function utilCombinedTags(entityIDs, graph) { + if (feature2.geometry) { + if (!props.driveSide) props.driveSide = "right"; + } else if (props.members) { + var vals = Array.from(new Set(props.members.map(function (id) { + var member = featuresByCode[id]; + if (member.geometry) return member.properties.driveSide || "right"; + }).filter(Boolean))); + if (vals.length === 1) props.driveSide = vals[0]; + } + } - var tags = {}; - var tagCounts = {}; - var allKeys = new Set(); + function loadCallingCodes(feature2) { + var props = feature2.properties; - var entities = entityIDs.map(function(entityID) { - return graph.hasEntity(entityID); - }).filter(Boolean); + if (!feature2.geometry && props.members) { + props.callingCodes = Array.from(new Set(props.members.reduce(function (array, id) { + var member = featuresByCode[id]; + if (member.geometry && member.properties.callingCodes) return array.concat(member.properties.callingCodes); + return array; + }, []))); + } + } - // gather the aggregate keys - entities.forEach(function(entity) { - var keys = Object.keys(entity.tags).filter(Boolean); - keys.forEach(function(key) { - allKeys.add(key); - }); + function loadFlag(feature2) { + if (!feature2.properties.iso1A2) return; + var flag = feature2.properties.iso1A2.replace(/./g, function (_char) { + return String.fromCodePoint(_char.charCodeAt(0) + 127397); }); + feature2.properties.emojiFlag = flag; + } - entities.forEach(function(entity) { + function loadMembersForGroupsOf(feature2) { + for (var j in feature2.properties.groups) { + var groupID = feature2.properties.groups[j]; + var groupFeature = featuresByCode[groupID]; + if (!groupFeature.properties.members) groupFeature.properties.members = []; + groupFeature.properties.members.push(feature2.properties.id); + } + } - allKeys.forEach(function(key) { + function cacheFeatureByIDs(feature2) { + var ids = []; - var value = entity.tags[key]; // purposely allow `undefined` + for (var k in identifierProps) { + var prop = identifierProps[k]; + var id = feature2.properties[prop]; + if (id) ids.push(id); + } - if (!tags.hasOwnProperty(key)) { - // first value, set as raw - tags[key] = value; - } else { - if (!Array.isArray(tags[key])) { - if (tags[key] !== value) { - // first alternate value, replace single value with array - tags[key] = [tags[key], value]; - } - } else { // type is array - if (tags[key].indexOf(value) === -1) { - // subsequent alternate value, add to array - tags[key].push(value); - } - } - } + if (feature2.properties.aliases) { + for (var j in feature2.properties.aliases) { + ids.push(feature2.properties.aliases[j]); + } + } - var tagHash = key + '=' + value; - if (!tagCounts[tagHash]) { tagCounts[tagHash] = 0; } - tagCounts[tagHash] += 1; - }); - }); + for (var _i5 in ids) { + var _id = canonicalID(ids[_i5]); - for (var key in tags) { - if (!Array.isArray(tags[key])) { continue; } - - // sort values by frequency then alphabetically - tags[key] = tags[key].sort(function(val1, val2) { - var key = key; // capture - var count2 = tagCounts[key + '=' + val2]; - var count1 = tagCounts[key + '=' + val1]; - if (count2 !== count1) { - return count2 - count1; - } - if (val2 && val1) { - return val1.localeCompare(val2); - } - return val1 ? 1 : -1; - }); + featuresByCode[_id] = feature2; } - - return tags; + } } + function locArray(loc) { + if (Array.isArray(loc)) { + return loc; + } else if (loc.coordinates) { + return loc.coordinates; + } - function utilStringQs(str) { - var i = 0; // advance past any leading '?' or '#' characters - while (i < str.length && (str[i] === '?' || str[i] === '#')) { i++; } - str = str.slice(i); - - return str.split('&').reduce(function(obj, pair){ - var parts = pair.split('='); - if (parts.length === 2) { - obj[parts[0]] = (null === parts[1]) ? '' : decodeURIComponent(parts[1]); - } - return obj; - }, {}); + return loc.geometry.coordinates; } + function smallestFeature(loc) { + var query = locArray(loc); + var featureProperties = whichPolygonGetter(query); + if (!featureProperties) return null; + return featuresByCode[featureProperties.id]; + } - function utilQsString(obj, noencode) { - // encode everything except special characters used in certain hash parameters: - // "/" in map states, ":", ",", {" and "}" in background - function softEncode(s) { - return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent); - } - - return Object.keys(obj).sort().map(function(key) { - return encodeURIComponent(key) + '=' + ( - noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key])); - }).join('&'); + function countryFeature(loc) { + var feature2 = smallestFeature(loc); + if (!feature2) return null; + var countryCode = feature2.properties.country || feature2.properties.iso1A2; + return featuresByCode[countryCode] || null; } + var defaultOpts = { + level: void 0, + maxLevel: void 0, + withProp: void 0 + }; - function utilPrefixDOMProperty(property) { - var prefixes = ['webkit', 'ms', 'moz', 'o']; - var i = -1; - var n = prefixes.length; - var s = document.body; + function featureForLoc(loc, opts) { + var targetLevel = opts.level || "country"; + var maxLevel = opts.maxLevel || "world"; + var withProp = opts.withProp; + var targetLevelIndex = levels.indexOf(targetLevel); + if (targetLevelIndex === -1) return null; + var maxLevelIndex = levels.indexOf(maxLevel); + if (maxLevelIndex === -1) return null; + if (maxLevelIndex < targetLevelIndex) return null; + + if (targetLevel === "country") { + var fastFeature = countryFeature(loc); + + if (fastFeature) { + if (!withProp || fastFeature.properties[withProp]) { + return fastFeature; + } + } + } - if (property in s) - { return property; } + var features2 = featuresContaining(loc); - property = property.substr(0, 1).toUpperCase() + property.substr(1); + for (var i in features2) { + var feature2 = features2[i]; + var levelIndex = levels.indexOf(feature2.properties.level); - while (++i < n) { - if (prefixes[i] + property in s) { - return prefixes[i] + property; - } + if (feature2.properties.level === targetLevel || levelIndex > targetLevelIndex && levelIndex <= maxLevelIndex) { + if (!withProp || feature2.properties[withProp]) { + return feature2; + } } + } - return false; + return null; } + function featureForID(id) { + var stringID; - function utilPrefixCSSProperty(property) { - var prefixes = ['webkit', 'ms', 'Moz', 'O']; - var i = -1; - var n = prefixes.length; - var s = document.body.style; - - if (property.toLowerCase() in s) { - return property.toLowerCase(); - } + if (typeof id === "number") { + stringID = id.toString(); - while (++i < n) { - if (prefixes[i] + property in s) { - return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase(); - } + if (stringID.length === 1) { + stringID = "00" + stringID; + } else if (stringID.length === 2) { + stringID = "0" + stringID; } + } else { + stringID = canonicalID(id); + } - return false; + return featuresByCode[stringID] || null; } - - var transformProperty; - function utilSetTransform(el, x, y, scale) { - var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform'); - var translate = utilDetect().opera ? 'translate(' + x + 'px,' + y + 'px)' - : 'translate3d(' + x + 'px,' + y + 'px,0)'; - return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : '')); + function smallestFeaturesForBbox(bbox) { + return whichPolygonGetter.bbox(bbox).map(function (props) { + return featuresByCode[props.id]; + }); } + function smallestOrMatchingFeature(query) { + if (_typeof(query) === "object") { + return smallestFeature(query); + } - // Calculates Levenshtein distance between two strings - // see: https://en.wikipedia.org/wiki/Levenshtein_distance - // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents. - function utilEditDistance(a, b) { - a = remove$1(a.toLowerCase()); - b = remove$1(b.toLowerCase()); - if (a.length === 0) { return b.length; } - if (b.length === 0) { return a.length; } - var matrix = []; - for (var i = 0; i <= b.length; i++) { matrix[i] = [i]; } - for (var j = 0; j <= a.length; j++) { matrix[0][j] = j; } - for (i = 1; i <= b.length; i++) { - for (j = 1; j <= a.length; j++) { - if (b.charAt(i-1) === a.charAt(j-1)) { - matrix[i][j] = matrix[i-1][j-1]; - } else { - matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution - Math.min(matrix[i][j-1] + 1, // insertion - matrix[i-1][j] + 1)); // deletion - } - } - } - return matrix[b.length][a.length]; + return featureForID(query); } + function feature$1(query) { + var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultOpts; - // a d3.mouse-alike which - // 1. Only works on HTML elements, not SVG - // 2. Does not cause style recalculation - function utilFastMouse(container) { - var rect = container.getBoundingClientRect(); - var rectLeft = rect.left; - var rectTop = rect.top; - var clientLeft = +container.clientLeft; - var clientTop = +container.clientTop; - return function(e) { - return [ - e.clientX - rectLeft - clientLeft, - e.clientY - rectTop - clientTop]; - }; - } - + if (_typeof(query) === "object") { + return featureForLoc(query, opts); + } - function utilAsyncMap(inputs, func, callback) { - var remaining = inputs.length; - var results = []; - var errors = []; - - inputs.forEach(function(d, i) { - func(d, function done(err, data) { - errors[i] = err; - results[i] = data; - remaining--; - if (!remaining) { callback(errors, results); } - }); - }); + return featureForID(query); } - - // wraps an index to an interval [0..length-1] - function utilWrap(index, length) { - if (index < 0) { - index += Math.ceil(-index/length)*length; - } - return index % length; + function iso1A2Code(query) { + var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultOpts; + opts.withProp = "iso1A2"; + var match = feature$1(query, opts); + if (!match) return null; + return match.properties.iso1A2 || null; } + function featuresContaining(query, strict) { + var matchingFeatures; - /** - * a replacement for functor - * - * @param {*} value any value - * @returns {Function} a function that returns that value or the value if it's a function - */ - function utilFunctor(value) { - if (typeof value === 'function') { return value; } - return function() { - return value; - }; - } + if (Array.isArray(query) && query.length === 4) { + matchingFeatures = smallestFeaturesForBbox(query); + } else { + var smallestOrMatching = smallestOrMatchingFeature(query); + matchingFeatures = smallestOrMatching ? [smallestOrMatching] : []; + } + if (!matchingFeatures.length) return []; + var returnFeatures; - function utilNoAuto(selection) { - var isText = (selection.size() && selection.node().tagName.toLowerCase() === 'textarea'); + if (!strict || _typeof(query) === "object") { + returnFeatures = matchingFeatures.slice(); + } else { + returnFeatures = []; + } - return selection - // assign 'new-password' even for non-password fields to prevent browsers (Chrome) ignoring 'off' - .attr('autocomplete', 'new-password') - .attr('autocorrect', 'off') - .attr('autocapitalize', 'off') - .attr('spellcheck', isText ? 'true' : 'false'); - } + for (var j in matchingFeatures) { + var properties = matchingFeatures[j].properties; + for (var i in properties.groups) { + var groupID = properties.groups[i]; + var groupFeature = featuresByCode[groupID]; - // https://stackoverflow.com/questions/194846/is-there-any-kind-of-hash-code-function-in-javascript - // https://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/ - function utilHashcode(str) { - var hash = 0; - if (str.length === 0) { - return hash; - } - for (var i = 0; i < str.length; i++) { - var char = str.charCodeAt(i); - hash = ((hash << 5) - hash) + char; - hash = hash & hash; // Convert to 32bit integer + if (returnFeatures.indexOf(groupFeature) === -1) { + returnFeatures.push(groupFeature); + } } - return hash; - } - - // Returns version of `str` with all runs of special characters replaced by `_`; - // suitable for HTML ids, classes, selectors, etc. - function utilSafeClassName(str) { - return str.toLowerCase().replace(/[^a-z0-9]+/g, '_'); - } + } - // Returns string based on `val` that is highly unlikely to collide with an id - // used previously or that's present elsewhere in the document. Useful for preventing - // browser-provided autofills or when embedding iD on pages with unknown elements. - function utilUniqueDomId(val) { - return 'ideditor-' + utilSafeClassName(val.toString()) + '-' + new Date().getTime().toString(); + return returnFeatures; } - // Returns the length of `str` in unicode characters. This can be less than - // `String.length()` since a single unicode character can be composed of multiple - // JavaScript UTF-16 code units. - function utilUnicodeCharsCount(str) { - // Native ES2015 implementations of `Array.from` split strings into unicode characters - return Array.from(str).length; - } + function featuresIn(id, strict) { + var feature2 = featureForID(id); + if (!feature2) return []; + var features2 = []; - // Returns a new string representing `str` cut from its start to `limit` length - // in unicode characters. Note that this runs the risk of splitting graphemes. - function utilUnicodeCharsTruncated(str, limit) { - return Array.from(str).slice(0, limit).join(''); - } + if (!strict) { + features2.push(feature2); + } - function osmEntity(attrs) { - // For prototypal inheritance. - if (this instanceof osmEntity) { return; } + var properties = feature2.properties; - // Create the appropriate subtype. - if (attrs && attrs.type) { - return osmEntity[attrs.type].apply(this, arguments); - } else if (attrs && attrs.id) { - return osmEntity[osmEntity.id.type(attrs.id)].apply(this, arguments); + if (properties.members) { + for (var i in properties.members) { + var memberID = properties.members[i]; + features2.push(featuresByCode[memberID]); } + } - // Initialize a generic Entity (used only in tests). - return (new osmEntity()).initialize(arguments); + return features2; } + function aggregateFeature(id) { + var features2 = featuresIn(id, false); + if (features2.length === 0) return null; + var aggregateCoordinates = []; - osmEntity.id = function(type) { - return osmEntity.id.fromOSM(type, osmEntity.id.next[type]--); - }; + for (var i in features2) { + var feature2 = features2[i]; + if (feature2.geometry && feature2.geometry.type === "MultiPolygon" && feature2.geometry.coordinates) { + aggregateCoordinates = aggregateCoordinates.concat(feature2.geometry.coordinates); + } + } - osmEntity.id.next = { - changeset: -1, node: -1, way: -1, relation: -1 - }; + return { + type: "Feature", + properties: features2[0].properties, + geometry: { + type: "MultiPolygon", + coordinates: aggregateCoordinates + } + }; + } + function roadSpeedUnit(query) { + var feature2 = smallestOrMatchingFeature(query); + return feature2 && feature2.properties.roadSpeedUnit || null; + } - osmEntity.id.fromOSM = function(type, id) { - return type[0] + id; - }; + function roadHeightUnit(query) { + var feature2 = smallestOrMatchingFeature(query); + return feature2 && feature2.properties.roadHeightUnit || null; + } + var geojsonArea = {}; - osmEntity.id.toOSM = function(id) { - return id.slice(1); - }; + var wgs84$1 = {}; + wgs84$1.RADIUS = 6378137; + wgs84$1.FLATTENING = 1 / 298.257223563; + wgs84$1.POLAR_RADIUS = 6356752.3142; - osmEntity.id.type = function(id) { - return { 'c': 'changeset', 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]]; - }; + var wgs84 = wgs84$1; + geojsonArea.geometry = geometry; + geojsonArea.ring = ringArea; + function geometry(_) { + var area = 0, + i; - // A function suitable for use as the second argument to d3.selection#data(). - osmEntity.key = function(entity) { - return entity.id + 'v' + (entity.v || 0); - }; + switch (_.type) { + case 'Polygon': + return polygonArea(_.coordinates); - var _deprecatedTagValuesByKey; + case 'MultiPolygon': + for (i = 0; i < _.coordinates.length; i++) { + area += polygonArea(_.coordinates[i]); + } - osmEntity.deprecatedTagValuesByKey = function(dataDeprecated) { - if (!_deprecatedTagValuesByKey) { - _deprecatedTagValuesByKey = {}; - dataDeprecated.forEach(function(d) { - var oldKeys = Object.keys(d.old); - if (oldKeys.length === 1) { - var oldKey = oldKeys[0]; - var oldValue = d.old[oldKey]; - if (oldValue !== '*') { - if (!_deprecatedTagValuesByKey[oldKey]) { - _deprecatedTagValuesByKey[oldKey] = [oldValue]; - } else { - _deprecatedTagValuesByKey[oldKey].push(oldValue); - } - } - } - }); - } - return _deprecatedTagValuesByKey; - }; + return area; + case 'Point': + case 'MultiPoint': + case 'LineString': + case 'MultiLineString': + return 0; - osmEntity.prototype = { + case 'GeometryCollection': + for (i = 0; i < _.geometries.length; i++) { + area += geometry(_.geometries[i]); + } - tags: {}, + return area; + } + } + function polygonArea(coords) { + var area = 0; - initialize: function(sources) { - for (var i = 0; i < sources.length; ++i) { - var source = sources[i]; - for (var prop in source) { - if (Object.prototype.hasOwnProperty.call(source, prop)) { - if (source[prop] === undefined) { - delete this[prop]; - } else { - this[prop] = source[prop]; - } - } - } - } + if (coords && coords.length > 0) { + area += Math.abs(ringArea(coords[0])); - if (!this.id && this.type) { - this.id = osmEntity.id(this.type); - } - if (!this.hasOwnProperty('visible')) { - this.visible = true; - } + for (var i = 1; i < coords.length; i++) { + area -= Math.abs(ringArea(coords[i])); + } + } - return this; - }, + return area; + } + /** + * Calculate the approximate area of the polygon were it projected onto + * the earth. Note that this area will be positive if ring is oriented + * clockwise, otherwise it will be negative. + * + * Reference: + * Robert. G. Chamberlain and William H. Duquette, "Some Algorithms for + * Polygons on a Sphere", JPL Publication 07-03, Jet Propulsion + * Laboratory, Pasadena, CA, June 2007 http://trs-new.jpl.nasa.gov/dspace/handle/2014/40409 + * + * Returns: + * {float} The approximate signed geodesic area of the polygon in square + * meters. + */ - copy: function(resolver, copies) { - if (copies[this.id]) - { return copies[this.id]; } + function ringArea(coords) { + var p1, + p2, + p3, + lowerIndex, + middleIndex, + upperIndex, + i, + area = 0, + coordsLength = coords.length; + + if (coordsLength > 2) { + for (i = 0; i < coordsLength; i++) { + if (i === coordsLength - 2) { + // i = N-2 + lowerIndex = coordsLength - 2; + middleIndex = coordsLength - 1; + upperIndex = 0; + } else if (i === coordsLength - 1) { + // i = N-1 + lowerIndex = coordsLength - 1; + middleIndex = 0; + upperIndex = 1; + } else { + // i = 0 to N-3 + lowerIndex = i; + middleIndex = i + 1; + upperIndex = i + 2; + } - var copy = osmEntity(this, { id: undefined, user: undefined, version: undefined }); - copies[this.id] = copy; + p1 = coords[lowerIndex]; + p2 = coords[middleIndex]; + p3 = coords[upperIndex]; + area += (rad(p3[0]) - rad(p1[0])) * Math.sin(rad(p2[1])); + } - return copy; - }, + area = area * wgs84.RADIUS * wgs84.RADIUS / 2; + } + return area; + } - osmId: function() { - return osmEntity.id.toOSM(this.id); - }, + function rad(_) { + return _ * Math.PI / 180; + } + var inputValidation = {}; - isNew: function() { - return this.osmId() < 0; - }, + var $$n = _export; + var $includes = arrayIncludes.includes; + var addToUnscopables$2 = addToUnscopables$6; + // `Array.prototype.includes` method + // https://tc39.es/ecma262/#sec-array.prototype.includes + $$n({ target: 'Array', proto: true }, { + includes: function includes(el /* , fromIndex = 0 */) { + return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined); + } + }); - update: function(attrs) { - return osmEntity(this, attrs, { v: 1 + (this.v || 0) }); - }, + // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables + addToUnscopables$2('includes'); + var validateCenter$1 = {}; - mergeTags: function(tags) { - var merged = Object.assign({}, this.tags); // shallow copy - var changed = false; - for (var k in tags) { - var t1 = merged[k]; - var t2 = tags[k]; - if (!t1) { - changed = true; - merged[k] = t2; - } else if (t1 !== t2) { - changed = true; - merged[k] = utilUnicodeCharsTruncated( - utilArrayUnion(t1.split(/;\s*/), t2.split(/;\s*/)).join(';'), - 255 // avoid exceeding character limit; see also services/osm.js -> maxCharsForTagValue() - ); - } - } - return changed ? this.update({ tags: merged }) : this; - }, + validateCenter$1.validateCenter = function validateCenter(center) { + var validCenterLengths = [2, 3]; + if (!Array.isArray(center) || !validCenterLengths.includes(center.length)) { + throw new Error("ERROR! Center has to be an array of length two or three"); + } - intersects: function(extent, resolver) { - return this.extent(resolver).intersects(extent); - }, + var _center = _slicedToArray(center, 2), + lng = _center[0], + lat = _center[1]; + if (typeof lng !== "number" || typeof lat !== "number") { + throw new Error("ERROR! Longitude and Latitude has to be numbers but where ".concat(_typeof(lng), " and ").concat(_typeof(lat))); + } - hasNonGeometryTags: function() { - return Object.keys(this.tags).some(function(k) { return k !== 'area'; }); - }, + if (lng > 180 || lng < -180) { + throw new Error("ERROR! Longitude has to be between -180 and 180 but was ".concat(lng)); + } - hasParentRelations: function(resolver) { - return resolver.parentRelations(this).length > 0; - }, + if (lat > 90 || lat < -90) { + throw new Error("ERROR! Latitude has to be between -90 and 90 but was ".concat(lat)); + } + }; - hasInterestingTags: function() { - return Object.keys(this.tags).some(osmIsInterestingTag); - }, + var validateRadius$1 = {}; - hasWikidata: function() { - return !!this.tags.wikidata || !!this.tags['brand:wikidata']; - }, + validateRadius$1.validateRadius = function validateRadius(radius) { + if (typeof radius !== "number") { + throw new Error("ERROR! Radius has to be a positive number but was: ".concat(_typeof(radius))); + } - isHighwayIntersection: function() { - return false; - }, + if (radius <= 0) { + throw new Error("ERROR! Radius has to be a positive number but was: ".concat(radius)); + } + }; - isDegenerate: function() { - return true; - }, + var validateNumberOfEdges$1 = {}; - deprecatedTags: function(dataDeprecated) { - var tags = this.tags; + validateNumberOfEdges$1.validateNumberOfEdges = function validateNumberOfEdges(numberOfEdges) { + if (typeof numberOfEdges !== "number") { + var ARGUMENT_TYPE = Array.isArray(numberOfEdges) ? "array" : _typeof(numberOfEdges); + throw new Error("ERROR! Number of edges has to be a number but was: ".concat(ARGUMENT_TYPE)); + } - // if there are no tags, none can be deprecated - if (Object.keys(tags).length === 0) { return []; } + if (numberOfEdges < 3) { + throw new Error("ERROR! Number of edges has to be at least 3 but was: ".concat(numberOfEdges)); + } + }; - var deprecated = []; - dataDeprecated.forEach(function(d) { - var oldKeys = Object.keys(d.old); - var matchesDeprecatedTags = oldKeys.every(function(oldKey) { - if (!tags[oldKey]) { return false; } - if (d.old[oldKey] === '*') { return true; } + var validateEarthRadius$1 = {}; - var vals = tags[oldKey].split(';').filter(Boolean); - if (vals.length === 0) { - return false; - } else if (vals.length > 1) { - return vals.indexOf(d.old[oldKey]) !== -1; - } else { - if (tags[oldKey] === d.old[oldKey]) { - if (d.replace && d.old[oldKey] === d.replace[oldKey]) { - var replaceKeys = Object.keys(d.replace); - return !replaceKeys.every(function(replaceKey) { - return tags[replaceKey] === d.replace[replaceKey]; - }); - } else { - return true; - } - } - } - return false; - }); - if (matchesDeprecatedTags) { - deprecated.push(d); - } - }); + validateEarthRadius$1.validateEarthRadius = function validateEarthRadius(earthRadius) { + if (typeof earthRadius !== "number") { + var ARGUMENT_TYPE = Array.isArray(earthRadius) ? "array" : _typeof(earthRadius); + throw new Error("ERROR! Earth radius has to be a number but was: ".concat(ARGUMENT_TYPE)); + } - return deprecated; - } + if (earthRadius <= 0) { + throw new Error("ERROR! Earth radius has to be a positive number but was: ".concat(earthRadius)); + } }; - function osmLanes(entity) { - if (entity.type !== 'way') { return null; } - if (!entity.tags.highway) { return null; } + var validateBearing$1 = {}; - var tags = entity.tags; - var isOneWay = entity.isOneWay(); - var laneCount = getLaneCount(tags, isOneWay); - var maxspeed = parseMaxspeed(tags); - - var laneDirections = parseLaneDirections(tags, isOneWay, laneCount); - var forward = laneDirections.forward; - var backward = laneDirections.backward; - var bothways = laneDirections.bothways; - - // parse the piped string 'x|y|z' format - var turnLanes = {}; - turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']); - turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']); - turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']); - - var maxspeedLanes = {}; - maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed); - maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed); - maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed); - - var psvLanes = {}; - psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']); - psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']); - psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']); - - var busLanes = {}; - busLanes.unspecified = parseMiscLanes(tags['bus:lanes']); - busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']); - busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']); - - var taxiLanes = {}; - taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']); - taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']); - taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']); - - var hovLanes = {}; - hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']); - hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']); - hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']); - - var hgvLanes = {}; - hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']); - hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']); - hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']); - - var bicyclewayLanes = {}; - bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']); - bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']); - bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']); - - var lanesObj = { - forward: [], - backward: [], - unspecified: [] - }; + validateBearing$1.validateBearing = function validateBearing(bearing) { + if (typeof bearing !== "number") { + var ARGUMENT_TYPE = Array.isArray(bearing) ? "array" : _typeof(bearing); + throw new Error("ERROR! Bearing has to be a number but was: ".concat(ARGUMENT_TYPE)); + } + }; - // map forward/backward/unspecified of each lane type to lanesObj - mapToLanesObj(lanesObj, turnLanes, 'turnLane'); - mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed'); - mapToLanesObj(lanesObj, psvLanes, 'psv'); - mapToLanesObj(lanesObj, busLanes, 'bus'); - mapToLanesObj(lanesObj, taxiLanes, 'taxi'); - mapToLanesObj(lanesObj, hovLanes, 'hov'); - mapToLanesObj(lanesObj, hgvLanes, 'hgv'); - mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway'); + var validateCenter = validateCenter$1.validateCenter; + var validateRadius = validateRadius$1.validateRadius; + var validateNumberOfEdges = validateNumberOfEdges$1.validateNumberOfEdges; + var validateEarthRadius = validateEarthRadius$1.validateEarthRadius; + var validateBearing = validateBearing$1.validateBearing; - return { - metadata: { - count: laneCount, - oneway: isOneWay, - forward: forward, - backward: backward, - bothways: bothways, - turnLanes: turnLanes, - maxspeed: maxspeed, - maxspeedLanes: maxspeedLanes, - psvLanes: psvLanes, - busLanes: busLanes, - taxiLanes: taxiLanes, - hovLanes: hovLanes, - hgvLanes: hgvLanes, - bicyclewayLanes: bicyclewayLanes - }, - lanes: lanesObj - }; + function validateInput$1(_ref) { + var center = _ref.center, + radius = _ref.radius, + numberOfEdges = _ref.numberOfEdges, + earthRadius = _ref.earthRadius, + bearing = _ref.bearing; + validateCenter(center); + validateRadius(radius); + validateNumberOfEdges(numberOfEdges); + validateEarthRadius(earthRadius); + validateBearing(bearing); } + inputValidation.validateCenter = validateCenter; + inputValidation.validateRadius = validateRadius; + inputValidation.validateNumberOfEdges = validateNumberOfEdges; + inputValidation.validateEarthRadius = validateEarthRadius; + inputValidation.validateBearing = validateBearing; + inputValidation.validateInput = validateInput$1; - function getLaneCount(tags, isOneWay) { - var count; - if (tags.lanes) { - count = parseInt(tags.lanes, 10); - if (count > 0) { - return count; - } - } + var validateInput = inputValidation.validateInput; + var defaultEarthRadius = 6378137; // equatorial Earth radius + function toRadians(angleInDegrees) { + return angleInDegrees * Math.PI / 180; + } - switch (tags.highway) { - case 'trunk': - case 'motorway': - count = isOneWay ? 2 : 4; - break; - default: - count = isOneWay ? 1 : 2; - break; - } + function toDegrees(angleInRadians) { + return angleInRadians * 180 / Math.PI; + } - return count; + function offset(c1, distance, earthRadius, bearing) { + var lat1 = toRadians(c1[1]); + var lon1 = toRadians(c1[0]); + var dByR = distance / earthRadius; + var lat = Math.asin(Math.sin(lat1) * Math.cos(dByR) + Math.cos(lat1) * Math.sin(dByR) * Math.cos(bearing)); + var lon = lon1 + Math.atan2(Math.sin(bearing) * Math.sin(dByR) * Math.cos(lat1), Math.cos(dByR) - Math.sin(lat1) * Math.sin(lat)); + return [toDegrees(lon), toDegrees(lat)]; } + var circleToPolygon = function circleToPolygon(center, radius, options) { + var n = getNumberOfEdges(options); + var earthRadius = getEarthRadius(options); + var bearing = getBearing(options); + var direction = getDirection(options); // validateInput() throws error on invalid input and do nothing on valid input - function parseMaxspeed(tags) { - var maxspeed = tags.maxspeed; - if (!maxspeed) { return; } + validateInput({ + center: center, + radius: radius, + numberOfEdges: n, + earthRadius: earthRadius, + bearing: bearing + }); + var start = toRadians(bearing); + var coordinates = []; - var maxspeedRegex = /^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/; - if (!maxspeedRegex.test(maxspeed)) { return; } + for (var i = 0; i < n; ++i) { + coordinates.push(offset(center, radius, earthRadius, start + direction * 2 * Math.PI * -i / n)); + } - return parseInt(maxspeed, 10); - } + coordinates.push(coordinates[0]); + return { + type: "Polygon", + coordinates: [coordinates] + }; + }; + function getNumberOfEdges(options) { + if (isUndefinedOrNull(options)) { + return 32; + } else if (isObjectNotArray(options)) { + var numberOfEdges = options.numberOfEdges; + return numberOfEdges === undefined ? 32 : numberOfEdges; + } - function parseLaneDirections(tags, isOneWay, laneCount) { - var forward = parseInt(tags['lanes:forward'], 10); - var backward = parseInt(tags['lanes:backward'], 10); - var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0; + return options; + } - if (parseInt(tags.oneway, 10) === -1) { - forward = 0; - bothways = 0; - backward = laneCount; - } - else if (isOneWay) { - forward = laneCount; - bothways = 0; - backward = 0; - } - else if (isNaN(forward) && isNaN(backward)) { - backward = Math.floor((laneCount - bothways) / 2); - forward = laneCount - bothways - backward; - } - else if (isNaN(forward)) { - if (backward > laneCount - bothways) { - backward = laneCount - bothways; - } - forward = laneCount - bothways - backward; - } - else if (isNaN(backward)) { - if (forward > laneCount - bothways) { - forward = laneCount - bothways; - } - backward = laneCount - bothways - forward; - } - return { - forward: forward, - backward: backward, - bothways: bothways - }; + function getEarthRadius(options) { + if (isUndefinedOrNull(options)) { + return defaultEarthRadius; + } else if (isObjectNotArray(options)) { + var earthRadius = options.earthRadius; + return earthRadius === undefined ? defaultEarthRadius : earthRadius; + } + + return defaultEarthRadius; } + function getDirection(options) { + if (isObjectNotArray(options) && options.rightHandRule) { + return -1; + } - function parseTurnLanes(tag){ - if (!tag) { return; } + return 1; + } - var validValues = [ - 'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right', - 'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none' - ]; + function getBearing(options) { + if (isUndefinedOrNull(options)) { + return 0; + } else if (isObjectNotArray(options)) { + var bearing = options.bearing; + return bearing === undefined ? 0 : bearing; + } - return tag.split('|') - .map(function (s) { - if (s === '') { s = 'none'; } - return s.split(';') - .map(function (d) { - return validValues.indexOf(d) === -1 ? 'unknown': d; - }); - }); + return 0; } + function isObjectNotArray(argument) { + return argument !== null && _typeof(argument) === "object" && !Array.isArray(argument); + } - function parseMaxspeedLanes(tag, maxspeed) { - if (!tag) { return; } - - return tag.split('|') - .map(function (s) { - if (s === 'none') { return s; } - var m = parseInt(s, 10); - if (s === '' || m === maxspeed) { return null; } - return isNaN(m) ? 'unknown': m; - }); + function isUndefinedOrNull(argument) { + return argument === null || argument === undefined; } + var $$m = _export; - function parseMiscLanes(tag) { - if (!tag) { return; } + // `Number.EPSILON` constant + // https://tc39.es/ecma262/#sec-number.epsilon + $$m({ target: 'Number', stat: true }, { + EPSILON: Math.pow(2, -52) + }); - var validValues = [ - 'yes', 'no', 'designated' - ]; + var uncurryThis$8 = functionUncurryThis; + var requireObjectCoercible$4 = requireObjectCoercible$e; + var toString$5 = toString$k; - return tag.split('|') - .map(function (s) { - if (s === '') { s = 'no'; } - return validValues.indexOf(s) === -1 ? 'unknown': s; - }); - } + var quot = /"/g; + var replace$2 = uncurryThis$8(''.replace); + // `CreateHTML` abstract operation + // https://tc39.es/ecma262/#sec-createhtml + var createHtml = function (string, tag, attribute, value) { + var S = toString$5(requireObjectCoercible$4(string)); + var p1 = '<' + tag; + if (attribute !== '') p1 += ' ' + attribute + '="' + replace$2(toString$5(value), quot, '"') + '"'; + return p1 + '>' + S + ''; + }; - function parseBicycleWay(tag) { - if (!tag) { return; } + var fails$6 = fails$V; - var validValues = [ - 'yes', 'no', 'designated', 'lane' - ]; + // check the existence of a method, lowercase + // of a tag and escaping quotes in arguments + var stringHtmlForced = function (METHOD_NAME) { + return fails$6(function () { + var test = ''[METHOD_NAME]('"'); + return test !== test.toLowerCase() || test.split('"').length > 3; + }); + }; - return tag.split('|') - .map(function (s) { - if (s === '') { s = 'no'; } - return validValues.indexOf(s) === -1 ? 'unknown': s; - }); - } + var $$l = _export; + var createHTML = createHtml; + var forcedStringHTMLMethod = stringHtmlForced; + // `String.prototype.link` method + // https://tc39.es/ecma262/#sec-string.prototype.link + $$l({ target: 'String', proto: true, forced: forcedStringHTMLMethod('link') }, { + link: function link(url) { + return createHTML(this, 'a', 'href', url); + } + }); - function mapToLanesObj(lanesObj, data, key) { - if (data.forward) { data.forward.forEach(function(l, i) { - if (!lanesObj.forward[i]) { lanesObj.forward[i] = {}; } - lanesObj.forward[i][key] = l; - }); } - if (data.backward) { data.backward.forEach(function(l, i) { - if (!lanesObj.backward[i]) { lanesObj.backward[i] = {}; } - lanesObj.backward[i][key] = l; - }); } - if (data.unspecified) { data.unspecified.forEach(function(l, i) { - if (!lanesObj.unspecified[i]) { lanesObj.unspecified[i] = {}; } - lanesObj.unspecified[i][key] = l; - }); } - } + /** + * splaytree v3.1.0 + * Fast Splay tree for Node and browser + * + * @author Alexander Milevski + * @license MIT + * @preserve + */ + var Node = + /** @class */ + function () { + function Node(key, data) { + this.next = null; + this.key = key; + this.data = data; + this.left = null; + this.right = null; + } - function osmWay() { - if (!(this instanceof osmWay)) { - return (new osmWay()).initialize(arguments); - } else if (arguments.length) { - this.initialize(arguments); - } - } + return Node; + }(); + /* follows "An implementation of top-down splaying" + * by D. Sleator March 1992 + */ - osmEntity.way = osmWay; + function DEFAULT_COMPARE(a, b) { + return a > b ? 1 : a < b ? -1 : 0; + } + /** + * Simple top down splay, not requiring i to be in the tree t. + */ - osmWay.prototype = Object.create(osmEntity.prototype); + function splay(i, t, comparator) { + var N = new Node(null, null); + var l = N; + var r = N; - Object.assign(osmWay.prototype, { - type: 'way', - nodes: [], + while (true) { + var cmp = comparator(i, t.key); //if (i < t.key) { + if (cmp < 0) { + if (t.left === null) break; //if (i < t.left.key) { - copy: function(resolver, copies) { - if (copies[this.id]) { return copies[this.id]; } + if (comparator(i, t.left.key) < 0) { + var y = t.left; + /* rotate right */ - var copy = osmEntity.prototype.copy.call(this, resolver, copies); + t.left = y.right; + y.right = t; + t = y; + if (t.left === null) break; + } - var nodes = this.nodes.map(function(id) { - return resolver.entity(id).copy(resolver, copies).id; - }); + r.left = t; + /* link right */ - copy = copy.update({ nodes: nodes }); - copies[this.id] = copy; + r = t; + t = t.left; //} else if (i > t.key) { + } else if (cmp > 0) { + if (t.right === null) break; //if (i > t.right.key) { - return copy; - }, + if (comparator(i, t.right.key) > 0) { + var y = t.right; + /* rotate left */ + t.right = y.left; + y.left = t; + t = y; + if (t.right === null) break; + } - extent: function(resolver) { - return resolver.transient(this, 'extent', function() { - var extent = geoExtent(); - for (var i = 0; i < this.nodes.length; i++) { - var node = resolver.hasEntity(this.nodes[i]); - if (node) { - extent._extend(node.extent()); - } - } - return extent; - }); - }, + l.right = t; + /* link left */ + l = t; + t = t.right; + } else break; + } + /* assemble */ - first: function() { - return this.nodes[0]; - }, + l.right = t.left; + r.left = t.right; + t.left = N.right; + t.right = N.left; + return t; + } - last: function() { - return this.nodes[this.nodes.length - 1]; - }, + function insert(i, data, t, comparator) { + var node = new Node(i, data); + if (t === null) { + node.left = node.right = null; + return node; + } - contains: function(node) { - return this.nodes.indexOf(node) >= 0; - }, + t = splay(i, t, comparator); + var cmp = comparator(i, t.key); + if (cmp < 0) { + node.left = t.left; + node.right = t; + t.left = null; + } else if (cmp >= 0) { + node.right = t.right; + node.left = t; + t.right = null; + } - affix: function(node) { - if (this.nodes[0] === node) { return 'prefix'; } - if (this.nodes[this.nodes.length - 1] === node) { return 'suffix'; } - }, + return node; + } + function split$2(key, v, comparator) { + var left = null; + var right = null; - layer: function() { - // explicit layer tag, clamp between -10, 10.. - if (isFinite(this.tags.layer)) { - return Math.max(-10, Math.min(+(this.tags.layer), 10)); - } + if (v) { + v = splay(key, v, comparator); + var cmp = comparator(v.key, key); - // implied layer tag.. - if (this.tags.covered === 'yes') { return -1; } - if (this.tags.location === 'overground') { return 1; } - if (this.tags.location === 'underground') { return -1; } - if (this.tags.location === 'underwater') { return -10; } + if (cmp === 0) { + left = v.left; + right = v.right; + } else if (cmp < 0) { + right = v.right; + v.right = null; + left = v; + } else { + left = v.left; + v.left = null; + right = v; + } + } - if (this.tags.power === 'line') { return 10; } - if (this.tags.power === 'minor_line') { return 10; } - if (this.tags.aerialway) { return 10; } - if (this.tags.bridge) { return 1; } - if (this.tags.cutting) { return -1; } - if (this.tags.tunnel) { return -1; } - if (this.tags.waterway) { return -1; } - if (this.tags.man_made === 'pipeline') { return -10; } - if (this.tags.boundary) { return -10; } - return 0; - }, + return { + left: left, + right: right + }; + } + function merge$3(left, right, comparator) { + if (right === null) return left; + if (left === null) return right; + right = splay(left.key, right, comparator); + right.left = left; + return right; + } + /** + * Prints level of the tree + */ - // the approximate width of the line based on its tags except its `width` tag - impliedLineWidthMeters: function() { - var averageWidths = { - highway: { // width is for single lane - motorway: 5, motorway_link: 5, trunk: 4.5, trunk_link: 4.5, - primary: 4, secondary: 4, tertiary: 4, - primary_link: 4, secondary_link: 4, tertiary_link: 4, - unclassified: 4, road: 4, living_street: 4, bus_guideway: 4, pedestrian: 4, - residential: 3.5, service: 3.5, track: 3, cycleway: 2.5, - bridleway: 2, corridor: 2, steps: 2, path: 1.5, footway: 1.5 - }, - railway: { // width includes ties and rail bed, not just track gauge - rail: 2.5, light_rail: 2.5, tram: 2.5, subway: 2.5, - monorail: 2.5, funicular: 2.5, disused: 2.5, preserved: 2.5, - miniature: 1.5, narrow_gauge: 1.5 - }, - waterway: { - river: 50, canal: 25, stream: 5, tidal_channel: 5, fish_pass: 2.5, drain: 2.5, ditch: 1.5 - } - }; - for (var key in averageWidths) { - if (this.tags[key] && averageWidths[key][this.tags[key]]) { - var width = averageWidths[key][this.tags[key]]; - if (key === 'highway') { - var laneCount = this.tags.lanes && parseInt(this.tags.lanes, 10); - if (!laneCount) { laneCount = this.isOneWay() ? 1 : 2; } - - return width * laneCount; - } - return width; - } - } - return null; - }, + function printRow(root, prefix, isTail, out, printNode) { + if (root) { + out("" + prefix + (isTail ? '└── ' : '├── ') + printNode(root) + "\n"); + var indent = prefix + (isTail ? ' ' : '│ '); + if (root.left) printRow(root.left, indent, false, out, printNode); + if (root.right) printRow(root.right, indent, true, out, printNode); + } + } + + var Tree = + /** @class */ + function () { + function Tree(comparator) { + if (comparator === void 0) { + comparator = DEFAULT_COMPARE; + } - isOneWay: function() { - // explicit oneway tag.. - var values = { - 'yes': true, - '1': true, - '-1': true, - 'reversible': true, - 'alternating': true, - 'no': false, - '0': false - }; - if (values[this.tags.oneway] !== undefined) { - return values[this.tags.oneway]; - } + this._root = null; + this._size = 0; + this._comparator = comparator; + } + /** + * Inserts a key, allows duplicates + */ - // implied oneway tag.. - for (var key in this.tags) { - if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key])) - { return true; } - } - return false; - }, - // Some identifier for tag that implies that this way is "sided", - // i.e. the right side is the 'inside' (e.g. the right side of a - // natural=cliff is lower). - sidednessIdentifier: function() { - for (var key in this.tags) { - var value = this.tags[key]; - if (key in osmRightSideIsInsideTags && (value in osmRightSideIsInsideTags[key])) { - if (osmRightSideIsInsideTags[key][value] === true) { - return key; - } else { - // if the map's value is something other than a - // literal true, we should use it so we can - // special case some keys (e.g. natural=coastline - // is handled differently to other naturals). - return osmRightSideIsInsideTags[key][value]; - } - } - } + Tree.prototype.insert = function (key, data) { + this._size++; + return this._root = insert(key, data, this._root, this._comparator); + }; + /** + * Adds a key, if it is not present in the tree + */ - return null; - }, - isSided: function() { - if (this.tags.two_sided === 'yes') { - return false; - } + Tree.prototype.add = function (key, data) { + var node = new Node(key, data); - return this.sidednessIdentifier() !== null; - }, + if (this._root === null) { + node.left = node.right = null; + this._size++; + this._root = node; + } - lanes: function() { - return osmLanes(this); - }, + var comparator = this._comparator; + var t = splay(key, this._root, comparator); + var cmp = comparator(key, t.key); + if (cmp === 0) this._root = t;else { + if (cmp < 0) { + node.left = t.left; + node.right = t; + t.left = null; + } else if (cmp > 0) { + node.right = t.right; + node.left = t; + t.right = null; + } + this._size++; + this._root = node; + } + return this._root; + }; + /** + * @param {Key} key + * @return {Node|null} + */ - isClosed: function() { - return this.nodes.length > 1 && this.first() === this.last(); - }, + Tree.prototype.remove = function (key) { + this._root = this._remove(key, this._root, this._comparator); + }; + /** + * Deletes i from the tree if it's there + */ - isConvex: function(resolver) { - if (!this.isClosed() || this.isDegenerate()) { return null; } - var nodes = utilArrayUniq(resolver.childNodes(this)); - var coords = nodes.map(function(n) { return n.loc; }); - var curr = 0; - var prev = 0; + Tree.prototype._remove = function (i, t, comparator) { + var x; + if (t === null) return null; + t = splay(i, t, comparator); + var cmp = comparator(i, t.key); - for (var i = 0; i < coords.length; i++) { - var o = coords[(i+1) % coords.length]; - var a = coords[i]; - var b = coords[(i+2) % coords.length]; - var res = geoVecCross(a, b, o); + if (cmp === 0) { + /* found it */ + if (t.left === null) { + x = t.right; + } else { + x = splay(i, t.left, comparator); + x.right = t.right; + } - curr = (res > 0) ? 1 : (res < 0) ? -1 : 0; - if (curr === 0) { - continue; - } else if (prev && curr !== prev) { - return false; - } - prev = curr; - } - return true; - }, + this._size--; + return x; + } - // returns an object with the tag that implies this is an area, if any - tagSuggestingArea: function() { - return osmTagSuggestingArea(this.tags); - }, + return t; + /* It wasn't there */ + }; + /** + * Removes and returns the node with smallest key + */ - isArea: function() { - if (this.tags.area === 'yes') - { return true; } - if (!this.isClosed() || this.tags.area === 'no') - { return false; } - return this.tagSuggestingArea() !== null; - }, + Tree.prototype.pop = function () { + var node = this._root; - isDegenerate: function() { - return (new Set(this.nodes).size < (this.isArea() ? 3 : 2)); - }, + if (node) { + while (node.left) { + node = node.left; + } + this._root = splay(node.key, this._root, this._comparator); + this._root = this._remove(node.key, this._root, this._comparator); + return { + key: node.key, + data: node.data + }; + } - areAdjacent: function(n1, n2) { - for (var i = 0; i < this.nodes.length; i++) { - if (this.nodes[i] === n1) { - if (this.nodes[i - 1] === n2) { return true; } - if (this.nodes[i + 1] === n2) { return true; } - } - } - return false; - }, + return null; + }; + /** + * Find without splaying + */ - geometry: function(graph) { - return graph.transient(this, 'geometry', function() { - return this.isArea() ? 'area' : 'line'; - }); - }, + Tree.prototype.findStatic = function (key) { + var current = this._root; + var compare = this._comparator; + while (current) { + var cmp = compare(key, current.key); + if (cmp === 0) return current;else if (cmp < 0) current = current.left;else current = current.right; + } - // returns an array of objects representing the segments between the nodes in this way - segments: function(graph) { - - function segmentExtent(graph) { - var n1 = graph.hasEntity(this.nodes[0]); - var n2 = graph.hasEntity(this.nodes[1]); - return n1 && n2 && geoExtent([ - [ - Math.min(n1.loc[0], n2.loc[0]), - Math.min(n1.loc[1], n2.loc[1]) - ], - [ - Math.max(n1.loc[0], n2.loc[0]), - Math.max(n1.loc[1], n2.loc[1]) - ] - ]); - } - - return graph.transient(this, 'segments', function() { - var segments = []; - for (var i = 0; i < this.nodes.length - 1; i++) { - segments.push({ - id: this.id + '-' + i, - wayId: this.id, - index: i, - nodes: [this.nodes[i], this.nodes[i + 1]], - extent: segmentExtent - }); - } - return segments; - }); - }, + return null; + }; + Tree.prototype.find = function (key) { + if (this._root) { + this._root = splay(key, this._root, this._comparator); + if (this._comparator(key, this._root.key) !== 0) return null; + } - // If this way is not closed, append the beginning node to the end of the nodelist to close it. - close: function() { - if (this.isClosed() || !this.nodes.length) { return this; } + return this._root; + }; - var nodes = this.nodes.slice(); - nodes = nodes.filter(noRepeatNodes); - nodes.push(nodes[0]); - return this.update({ nodes: nodes }); - }, + Tree.prototype.contains = function (key) { + var current = this._root; + var compare = this._comparator; + while (current) { + var cmp = compare(key, current.key); + if (cmp === 0) return true;else if (cmp < 0) current = current.left;else current = current.right; + } - // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it. - unclose: function() { - if (!this.isClosed()) { return this; } + return false; + }; - var nodes = this.nodes.slice(); - var connector = this.first(); - var i = nodes.length - 1; + Tree.prototype.forEach = function (visitor, ctx) { + var current = this._root; + var Q = []; + /* Initialize stack s */ - // remove trailing connectors.. - while (i > 0 && nodes.length > 1 && nodes[i] === connector) { - nodes.splice(i, 1); - i = nodes.length - 1; - } + var done = false; - nodes = nodes.filter(noRepeatNodes); - return this.update({ nodes: nodes }); - }, + while (!done) { + if (current !== null) { + Q.push(current); + current = current.left; + } else { + if (Q.length !== 0) { + current = Q.pop(); + visitor.call(ctx, current); + current = current.right; + } else done = true; + } + } + + return this; + }; + /** + * Walk key range from `low` to `high`. Stops if `fn` returns a value. + */ - // Adds a node (id) in front of the node which is currently at position index. - // If index is undefined, the node will be added to the end of the way for linear ways, - // or just before the final connecting node for circular ways. - // Consecutive duplicates are eliminated including existing ones. - // Circularity is always preserved when adding a node. - addNode: function(id, index) { - var nodes = this.nodes.slice(); - var isClosed = this.isClosed(); - var max = isClosed ? nodes.length - 1 : nodes.length; + Tree.prototype.range = function (low, high, fn, ctx) { + var Q = []; + var compare = this._comparator; + var node = this._root; + var cmp; - if (index === undefined) { - index = max; - } + while (Q.length !== 0 || node) { + if (node) { + Q.push(node); + node = node.left; + } else { + node = Q.pop(); + cmp = compare(node.key, high); - if (index < 0 || index > max) { - throw new RangeError('index ' + index + ' out of range 0..' + max); + if (cmp > 0) { + break; + } else if (compare(node.key, low) >= 0) { + if (fn.call(ctx, node)) return this; // stop if smth is returned } - // If this is a closed way, remove all connector nodes except the first one - // (there may be duplicates) and adjust index if necessary.. - if (isClosed) { - var connector = this.first(); + node = node.right; + } + } - // leading connectors.. - var i = 1; - while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) { - nodes.splice(i, 1); - if (index > i) { index--; } - } + return this; + }; + /** + * Returns array of keys + */ - // trailing connectors.. - i = nodes.length - 1; - while (i > 0 && nodes.length > 1 && nodes[i] === connector) { - nodes.splice(i, 1); - if (index > i) { index--; } - i = nodes.length - 1; - } - } - nodes.splice(index, 0, id); - nodes = nodes.filter(noRepeatNodes); + Tree.prototype.keys = function () { + var keys = []; + this.forEach(function (_a) { + var key = _a.key; + return keys.push(key); + }); + return keys; + }; + /** + * Returns array of all the data in the nodes + */ - // If the way was closed before, append a connector node to keep it closed.. - if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) { - nodes.push(nodes[0]); - } - return this.update({ nodes: nodes }); - }, + Tree.prototype.values = function () { + var values = []; + this.forEach(function (_a) { + var data = _a.data; + return values.push(data); + }); + return values; + }; + Tree.prototype.min = function () { + if (this._root) return this.minNode(this._root).key; + return null; + }; - // Replaces the node which is currently at position index with the given node (id). - // Consecutive duplicates are eliminated including existing ones. - // Circularity is preserved when updating a node. - updateNode: function(id, index) { - var nodes = this.nodes.slice(); - var isClosed = this.isClosed(); - var max = nodes.length - 1; + Tree.prototype.max = function () { + if (this._root) return this.maxNode(this._root).key; + return null; + }; - if (index === undefined || index < 0 || index > max) { - throw new RangeError('index ' + index + ' out of range 0..' + max); - } + Tree.prototype.minNode = function (t) { + if (t === void 0) { + t = this._root; + } - // If this is a closed way, remove all connector nodes except the first one - // (there may be duplicates) and adjust index if necessary.. - if (isClosed) { - var connector = this.first(); + if (t) while (t.left) { + t = t.left; + } + return t; + }; - // leading connectors.. - var i = 1; - while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) { - nodes.splice(i, 1); - if (index > i) { index--; } - } + Tree.prototype.maxNode = function (t) { + if (t === void 0) { + t = this._root; + } - // trailing connectors.. - i = nodes.length - 1; - while (i > 0 && nodes.length > 1 && nodes[i] === connector) { - nodes.splice(i, 1); - if (index === i) { index = 0; } // update leading connector instead - i = nodes.length - 1; - } - } + if (t) while (t.right) { + t = t.right; + } + return t; + }; + /** + * Returns node at given index + */ - nodes.splice(index, 1, id); - nodes = nodes.filter(noRepeatNodes); - // If the way was closed before, append a connector node to keep it closed.. - if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) { - nodes.push(nodes[0]); - } + Tree.prototype.at = function (index) { + var current = this._root; + var done = false; + var i = 0; + var Q = []; - return this.update({nodes: nodes}); - }, + while (!done) { + if (current) { + Q.push(current); + current = current.left; + } else { + if (Q.length > 0) { + current = Q.pop(); + if (i === index) return current; + i++; + current = current.right; + } else done = true; + } + } + return null; + }; - // Replaces each occurrence of node id needle with replacement. - // Consecutive duplicates are eliminated including existing ones. - // Circularity is preserved. - replaceNode: function(needleID, replacementID) { - var nodes = this.nodes.slice(); - var isClosed = this.isClosed(); + Tree.prototype.next = function (d) { + var root = this._root; + var successor = null; - for (var i = 0; i < nodes.length; i++) { - if (nodes[i] === needleID) { - nodes[i] = replacementID; - } - } + if (d.right) { + successor = d.right; - nodes = nodes.filter(noRepeatNodes); + while (successor.left) { + successor = successor.left; + } - // If the way was closed before, append a connector node to keep it closed.. - if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) { - nodes.push(nodes[0]); - } + return successor; + } - return this.update({nodes: nodes}); - }, + var comparator = this._comparator; + while (root) { + var cmp = comparator(d.key, root.key); + if (cmp === 0) break;else if (cmp < 0) { + successor = root; + root = root.left; + } else root = root.right; + } - // Removes each occurrence of node id. - // Consecutive duplicates are eliminated including existing ones. - // Circularity is preserved. - removeNode: function(id) { - var nodes = this.nodes.slice(); - var isClosed = this.isClosed(); + return successor; + }; - nodes = nodes - .filter(function(node) { return node !== id; }) - .filter(noRepeatNodes); + Tree.prototype.prev = function (d) { + var root = this._root; + var predecessor = null; - // If the way was closed before, append a connector node to keep it closed.. - if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) { - nodes.push(nodes[0]); - } + if (d.left !== null) { + predecessor = d.left; - return this.update({nodes: nodes}); - }, + while (predecessor.right) { + predecessor = predecessor.right; + } + return predecessor; + } - asJXON: function(changeset_id) { - var r = { - way: { - '@id': this.osmId(), - '@version': this.version || 0, - nd: this.nodes.map(function(id) { - return { keyAttributes: { ref: osmEntity.id.toOSM(id) } }; - }, this), - tag: Object.keys(this.tags).map(function(k) { - return { keyAttributes: { k: k, v: this.tags[k] } }; - }, this) - } - }; - if (changeset_id) { - r.way['@changeset'] = changeset_id; - } - return r; - }, + var comparator = this._comparator; + while (root) { + var cmp = comparator(d.key, root.key); + if (cmp === 0) break;else if (cmp < 0) root = root.left;else { + predecessor = root; + root = root.right; + } + } - asGeoJSON: function(resolver) { - return resolver.transient(this, 'GeoJSON', function() { - var coordinates = resolver.childNodes(this) - .map(function(n) { return n.loc; }); + return predecessor; + }; - if (this.isArea() && this.isClosed()) { - return { - type: 'Polygon', - coordinates: [coordinates] - }; - } else { - return { - type: 'LineString', - coordinates: coordinates - }; - } - }); - }, + Tree.prototype.clear = function () { + this._root = null; + this._size = 0; + return this; + }; + Tree.prototype.toList = function () { + return toList(this._root); + }; + /** + * Bulk-load items. Both array have to be same size + */ - area: function(resolver) { - return resolver.transient(this, 'area', function() { - var nodes = resolver.childNodes(this); - var json = { - type: 'Polygon', - coordinates: [ nodes.map(function(n) { return n.loc; }) ] - }; + Tree.prototype.load = function (keys, values, presort) { + if (values === void 0) { + values = []; + } - if (!this.isClosed() && nodes.length) { - json.coordinates[0].push(nodes[0].loc); - } + if (presort === void 0) { + presort = false; + } - var area = d3_geoArea(json); + var size = keys.length; + var comparator = this._comparator; // sort if needed - // Heuristic for detecting counterclockwise winding order. Assumes - // that OpenStreetMap polygons are not hemisphere-spanning. - if (area > 2 * Math.PI) { - json.coordinates[0] = json.coordinates[0].reverse(); - area = d3_geoArea(json); - } + if (presort) sort(keys, values, 0, size - 1, comparator); - return isNaN(area) ? 0 : area; - }); + if (this._root === null) { + // empty tree + this._root = loadRecursive(keys, values, 0, size); + this._size = size; + } else { + // that re-builds the whole tree from two in-order traversals + var mergedList = mergeLists(this.toList(), createList(keys, values), comparator); + size = this._size + size; + this._root = sortedListToBST({ + head: mergedList + }, 0, size); } - }); + return this; + }; - // Filter function to eliminate consecutive duplicates. - function noRepeatNodes(node, i, arr) { - return i === 0 || node !== arr[i - 1]; - } + Tree.prototype.isEmpty = function () { + return this._root === null; + }; - // "Old" multipolyons, previously known as "simple" multipolygons, are as follows: - // - // 1. Relation tagged with `type=multipolygon` and no interesting tags. - // 2. One and only one member with the `outer` role. Must be a way with interesting tags. - // 3. No members without a role. - // - // Old multipolygons are no longer recommended but are still rendered as areas by iD. + Object.defineProperty(Tree.prototype, "size", { + get: function get() { + return this._size; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Tree.prototype, "root", { + get: function get() { + return this._root; + }, + enumerable: true, + configurable: true + }); - function osmOldMultipolygonOuterMemberOfRelation(entity, graph) { - if (entity.type !== 'relation' || - !entity.isMultipolygon() - || Object.keys(entity.tags).filter(osmIsInterestingTag).length > 1) { - return false; + Tree.prototype.toString = function (printNode) { + if (printNode === void 0) { + printNode = function printNode(n) { + return String(n.key); + }; } - var outerMember; - for (var memberIndex in entity.members) { - var member = entity.members[memberIndex]; - if (!member.role || member.role === 'outer') { - if (outerMember) { return false; } - if (member.type !== 'way') { return false; } - if (!graph.hasEntity(member.id)) { return false; } + var out = []; + printRow(this._root, '', true, function (v) { + return out.push(v); + }, printNode); + return out.join(''); + }; - outerMember = graph.entity(member.id); + Tree.prototype.update = function (key, newKey, newData) { + var comparator = this._comparator; - if (Object.keys(outerMember.tags).filter(osmIsInterestingTag).length === 0) { - return false; - } - } + var _a = split$2(key, this._root, comparator), + left = _a.left, + right = _a.right; + + if (comparator(key, newKey) < 0) { + right = insert(newKey, newData, right, comparator); + } else { + left = insert(newKey, newData, left, comparator); } - return outerMember; - } + this._root = merge$3(left, right, comparator); + }; - // For fixing up rendering of multipolygons with tags on the outer member. - // https://github.com/openstreetmap/iD/issues/613 - function osmIsOldMultipolygonOuterMember(entity, graph) { - if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0) - { return false; } + Tree.prototype.split = function (key) { + return split$2(key, this._root, this._comparator); + }; - var parents = graph.parentRelations(entity); - if (parents.length !== 1) - { return false; } + return Tree; + }(); - var parent = parents[0]; - if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1) - { return false; } + function loadRecursive(keys, values, start, end) { + var size = end - start; - var members = parent.members, member; - for (var i = 0; i < members.length; i++) { - member = members[i]; - if (member.id === entity.id && member.role && member.role !== 'outer') - { return false; } // Not outer member - if (member.id !== entity.id && (!member.role || member.role === 'outer')) - { return false; } // Not a simple multipolygon - } + if (size > 0) { + var middle = start + Math.floor(size / 2); + var key = keys[middle]; + var data = values[middle]; + var node = new Node(key, data); + node.left = loadRecursive(keys, values, start, middle); + node.right = loadRecursive(keys, values, middle + 1, end); + return node; + } - return parent; + return null; } + function createList(keys, values) { + var head = new Node(null, null); + var p = head; - function osmOldMultipolygonOuterMember(entity, graph) { - if (entity.type !== 'way') - { return false; } + for (var i = 0; i < keys.length; i++) { + p = p.next = new Node(keys[i], values[i]); + } - var parents = graph.parentRelations(entity); - if (parents.length !== 1) - { return false; } + p.next = null; + return head.next; + } - var parent = parents[0]; - if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1) - { return false; } + function toList(root) { + var current = root; + var Q = []; + var done = false; + var head = new Node(null, null); + var p = head; - var members = parent.members, member, outerMember; - for (var i = 0; i < members.length; i++) { - member = members[i]; - if (!member.role || member.role === 'outer') { - if (outerMember) - { return false; } // Not a simple multipolygon - outerMember = member; - } + while (!done) { + if (current) { + Q.push(current); + current = current.left; + } else { + if (Q.length > 0) { + current = p = p.next = Q.pop(); + current = current.right; + } else done = true; } + } - if (!outerMember) - { return false; } - - var outerEntity = graph.hasEntity(outerMember.id); - if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length) - { return false; } + p.next = null; // that'll work even if the tree was empty - return outerEntity; + return head.next; } + function sortedListToBST(list, start, end) { + var size = end - start; - // Join `toJoin` array into sequences of connecting ways. + if (size > 0) { + var middle = start + Math.floor(size / 2); + var left = sortedListToBST(list, start, middle); + var root = list.head; + root.left = left; + list.head = list.head.next; + root.right = sortedListToBST(list, middle + 1, end); + return root; + } - // Segments which share identical start/end nodes will, as much as possible, - // be connected with each other. - // - // The return value is a nested array. Each constituent array contains elements - // of `toJoin` which have been determined to connect. - // - // Each consitituent array also has a `nodes` property whose value is an - // ordered array of member nodes, with appropriate order reversal and - // start/end coordinate de-duplication. - // - // Members of `toJoin` must have, at minimum, `type` and `id` properties. - // Thus either an array of `osmWay`s or a relation member array may be used. - // - // If an member is an `osmWay`, its tags and childnodes may be reversed via - // `actionReverse` in the output. - // - // The returned sequences array also has an `actions` array property, containing - // any reversal actions that should be applied to the graph, should the calling - // code attempt to actually join the given ways. - // - // Incomplete members (those for which `graph.hasEntity(element.id)` returns - // false) and non-way members are ignored. - // - function osmJoinWays(toJoin, graph) { - function resolve(member) { - return graph.childNodes(graph.entity(member.id)); - } + return null; + } - function reverse(item) { - var action = actionReverse(item.id, { reverseOneway: true }); - sequences.actions.push(action); - return (item instanceof osmWay) ? action(graph).entity(item.id) : item; - } + function mergeLists(l1, l2, compare) { + var head = new Node(null, null); // dummy - // make a copy containing only the items to join - toJoin = toJoin.filter(function(member) { - return member.type === 'way' && graph.hasEntity(member.id); - }); + var p = head; + var p1 = l1; + var p2 = l2; - // Are the things we are joining relation members or `osmWays`? - // If `osmWays`, skip the "prefer a forward path" code below (see #4872) - var i; - var joinAsMembers = true; - for (i = 0; i < toJoin.length; i++) { - if (toJoin[i] instanceof osmWay) { - joinAsMembers = false; - break; - } + while (p1 !== null && p2 !== null) { + if (compare(p1.key, p2.key) < 0) { + p.next = p1; + p1 = p1.next; + } else { + p.next = p2; + p2 = p2.next; } - var sequences = []; - sequences.actions = []; + p = p.next; + } - while (toJoin.length) { - // start a new sequence - var item = toJoin.shift(); - var currWays = [item]; - var currNodes = resolve(item).slice(); - var doneSequence = false; - - // add to it - while (toJoin.length && !doneSequence) { - var start = currNodes[0]; - var end = currNodes[currNodes.length - 1]; - var fn = null; - var nodes = null; - - // Find the next way/member to join. - for (i = 0; i < toJoin.length; i++) { - item = toJoin[i]; - nodes = resolve(item); - - // (for member ordering only, not way ordering - see #4872) - // Strongly prefer to generate a forward path that preserves the order - // of the members array. For multipolygons and most relations, member - // order does not matter - but for routes, it does. (see #4589) - // If we started this sequence backwards (i.e. next member way attaches to - // the start node and not the end node), reverse the initial way before continuing. - if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end && - (nodes[nodes.length - 1] === start || nodes[0] === start) - ) { - currWays[0] = reverse(currWays[0]); - currNodes.reverse(); - start = currNodes[0]; - end = currNodes[currNodes.length - 1]; - } + if (p1 !== null) { + p.next = p1; + } else if (p2 !== null) { + p.next = p2; + } - if (nodes[0] === end) { - fn = currNodes.push; // join to end - nodes = nodes.slice(1); - break; - } else if (nodes[nodes.length - 1] === end) { - fn = currNodes.push; // join to end - nodes = nodes.slice(0, -1).reverse(); - item = reverse(item); - break; - } else if (nodes[nodes.length - 1] === start) { - fn = currNodes.unshift; // join to beginning - nodes = nodes.slice(0, -1); - break; - } else if (nodes[0] === start) { - fn = currNodes.unshift; // join to beginning - nodes = nodes.slice(1).reverse(); - item = reverse(item); - break; - } else { - fn = nodes = null; - } - } + return head.next; + } - if (!nodes) { // couldn't find a joinable way/member - doneSequence = true; - break; - } + function sort(keys, values, left, right, compare) { + if (left >= right) return; + var pivot = keys[left + right >> 1]; + var i = left - 1; + var j = right + 1; - fn.apply(currWays, [item]); - fn.apply(currNodes, nodes); + while (true) { + do { + i++; + } while (compare(keys[i], pivot) < 0); - toJoin.splice(i, 1); - } + do { + j--; + } while (compare(keys[j], pivot) > 0); - currWays.nodes = currNodes; - sequences.push(currWays); - } + if (i >= j) break; + var tmp = keys[i]; + keys[i] = keys[j]; + keys[j] = tmp; + tmp = values[i]; + values[i] = values[j]; + values[j] = tmp; + } - return sequences; + sort(keys, values, left, j, compare); + sort(keys, values, j + 1, right, compare); } - function actionAddMember(relationId, member, memberIndex, insertPair) { + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } - return function action(graph) { - var relation = graph.entity(relationId); + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } - // There are some special rules for Public Transport v2 routes. - var isPTv2 = /stop|platform/.test(member.role); + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + /** + * A bounding box has the format: + * + * { ll: { x: xmin, y: ymin }, ur: { x: xmax, y: ymax } } + * + */ - if ((isNaN(memberIndex) || insertPair) && member.type === 'way' && !isPTv2) { - // Try to perform sensible inserts based on how the ways join together - graph = addWayMember(relation, graph); - } else { - // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes - // Stops and Platforms for PTv2 should be ordered first. - // hack: We do not currently have the ability to place them in the exactly correct order. - if (isPTv2 && isNaN(memberIndex)) { - memberIndex = 0; - } - graph = graph.replace(relation.addMember(member, memberIndex)); - } + var isInBbox = function isInBbox(bbox, point) { + return bbox.ll.x <= point.x && point.x <= bbox.ur.x && bbox.ll.y <= point.y && point.y <= bbox.ur.y; + }; + /* Returns either null, or a bbox (aka an ordered pair of points) + * If there is only one point of overlap, a bbox with identical points + * will be returned */ - return graph; - }; + var getBboxOverlap = function getBboxOverlap(b1, b2) { + // check if the bboxes overlap at all + if (b2.ur.x < b1.ll.x || b1.ur.x < b2.ll.x || b2.ur.y < b1.ll.y || b1.ur.y < b2.ll.y) return null; // find the middle two X values - // Add a way member into the relation "wherever it makes sense". - // In this situation we were not supplied a memberIndex. - function addWayMember(relation, graph) { - var groups, tempWay, item, i, j, k; + var lowerX = b1.ll.x < b2.ll.x ? b2.ll.x : b1.ll.x; + var upperX = b1.ur.x < b2.ur.x ? b1.ur.x : b2.ur.x; // find the middle two Y values - // remove PTv2 stops and platforms before doing anything. - var PTv2members = []; - var members = []; - for (i = 0; i < relation.members.length; i++) { - var m = relation.members[i]; - if (/stop|platform/.test(m.role)) { - PTv2members.push(m); - } else { - members.push(m); - } - } - relation = relation.update({ members: members }); - - - if (insertPair) { - // We're adding a member that must stay paired with an existing member. - // (This feature is used by `actionSplit`) - // - // This is tricky because the members may exist multiple times in the - // member list, and with different A-B/B-A ordering and different roles. - // (e.g. a bus route that loops out and back - #4589). - // - // Replace the existing member with a temporary way, - // so that `osmJoinWays` can treat the pair like a single way. - tempWay = osmWay({ id: 'wTemp', nodes: insertPair.nodes }); - graph = graph.replace(tempWay); - var tempMember = { id: tempWay.id, type: 'way', role: member.role }; - var tempRelation = relation.replaceMember({id: insertPair.originalID}, tempMember, true); - groups = utilArrayGroupBy(tempRelation.members, 'type'); - groups.way = groups.way || []; + var lowerY = b1.ll.y < b2.ll.y ? b2.ll.y : b1.ll.y; + var upperY = b1.ur.y < b2.ur.y ? b1.ur.y : b2.ur.y; // put those middle values together to get the overlap - } else { - // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it. - groups = utilArrayGroupBy(relation.members, 'type'); - groups.way = groups.way || []; - groups.way.push(member); - } - - members = withIndex(groups.way); - var joined = osmJoinWays(members, graph); - - // `joined` might not contain all of the way members, - // But will contain only the completed (downloaded) members - for (i = 0; i < joined.length; i++) { - var segment = joined[i]; - var nodes = segment.nodes.slice(); - var startIndex = segment[0].index; - - // j = array index in `members` where this segment starts - for (j = 0; j < members.length; j++) { - if (members[j].index === startIndex) { - break; - } - } + return { + ll: { + x: lowerX, + y: lowerY + }, + ur: { + x: upperX, + y: upperY + } + }; + }; + /* Javascript doesn't do integer math. Everything is + * floating point with percision Number.EPSILON. + * + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/EPSILON + */ - // k = each member in segment - for (k = 0; k < segment.length; k++) { - item = segment[k]; - var way = graph.entity(item.id); - - // If this is a paired item, generate members in correct order and role - if (tempWay && item.id === tempWay.id) { - if (nodes[0].id === insertPair.nodes[0]) { - item.pair = [ - { id: insertPair.originalID, type: 'way', role: item.role }, - { id: insertPair.insertedID, type: 'way', role: item.role } - ]; - } else { - item.pair = [ - { id: insertPair.insertedID, type: 'way', role: item.role }, - { id: insertPair.originalID, type: 'way', role: item.role } - ]; - } - } - // reorder `members` if necessary - if (k > 0) { - if (j+k >= members.length || item.index !== members[j+k].index) { - moveMember(members, item.index, j+k); - } - } + var epsilon = Number.EPSILON; // IE Polyfill - nodes.splice(0, way.nodes.length - 1); - } - } + if (epsilon === undefined) epsilon = Math.pow(2, -52); + var EPSILON_SQ = epsilon * epsilon; + /* FLP comparator */ - if (tempWay) { - graph = graph.remove(tempWay); - } + var cmp = function cmp(a, b) { + // check if they're both 0 + if (-epsilon < a && a < epsilon) { + if (-epsilon < b && b < epsilon) { + return 0; + } + } // check if they're flp equal - // Final pass: skip dead items, split pairs, remove index properties - var wayMembers = []; - for (i = 0; i < members.length; i++) { - item = members[i]; - if (item.index === -1) { continue; } - if (item.pair) { - wayMembers.push(item.pair[0]); - wayMembers.push(item.pair[1]); - } else { - wayMembers.push(utilObjectOmit(item, ['index'])); - } - } + var ab = a - b; - // Put stops and platforms first, then nodes, ways, relations - // This is recommended for Public Transport v2 routes: - // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes - var newMembers = PTv2members.concat( (groups.node || []), wayMembers, (groups.relation || []) ); + if (ab * ab < EPSILON_SQ * a * b) { + return 0; + } // normal comparison - return graph.replace(relation.update({ members: newMembers })); + return a < b ? -1 : 1; + }; + /** + * This class rounds incoming values sufficiently so that + * floating points problems are, for the most part, avoided. + * + * Incoming points are have their x & y values tested against + * all previously seen x & y values. If either is 'too close' + * to a previously seen value, it's value is 'snapped' to the + * previously seen value. + * + * All points should be rounded by this class before being + * stored in any data structures in the rest of this algorithm. + */ - // `moveMember()` changes the `members` array in place by splicing - // the item with `.index = findIndex` to where it belongs, - // and marking the old position as "dead" with `.index = -1` - // - // j=5, k=0 jk - // segment 5 4 7 6 - // members 0 1 2 3 4 5 6 7 8 9 keep 5 in j+k - // - // j=5, k=1 j k - // segment 5 4 7 6 - // members 0 1 2 3 4 5 6 7 8 9 move 4 to j+k - // members 0 1 2 3 x 5 4 6 7 8 9 moved - // - // j=5, k=2 j k - // segment 5 4 7 6 - // members 0 1 2 3 x 5 4 6 7 8 9 move 7 to j+k - // members 0 1 2 3 x 5 4 7 6 x 8 9 moved - // - // j=5, k=3 j k - // segment 5 4 7 6 - // members 0 1 2 3 x 5 4 7 6 x 8 9 keep 6 in j+k - // - function moveMember(arr, findIndex, toIndex) { - for (var i = 0; i < arr.length; i++) { - if (arr[i].index === findIndex) { - break; - } - } - var item = Object.assign({}, arr[i]); // shallow copy - arr[i].index = -1; // mark as dead - item.index = toIndex; - arr.splice(toIndex, 0, item); - } + var PtRounder = /*#__PURE__*/function () { + function PtRounder() { + _classCallCheck(this, PtRounder); + this.reset(); + } - // This is the same as `Relation.indexedMembers`, - // Except we don't want to index all the members, only the ways - function withIndex(arr) { - var result = new Array(arr.length); - for (var i = 0; i < arr.length; i++) { - result[i] = Object.assign({}, arr[i]); // shallow copy - result[i].index = i; - } - return result; - } + _createClass(PtRounder, [{ + key: "reset", + value: function reset() { + this.xRounder = new CoordRounder(); + this.yRounder = new CoordRounder(); } + }, { + key: "round", + value: function round(x, y) { + return { + x: this.xRounder.round(x), + y: this.yRounder.round(y) + }; + } + }]); - } - - function actionAddMidpoint(midpoint, node) { - return function(graph) { - graph = graph.replace(node.move(midpoint.loc)); - - var parents = utilArrayIntersection( - graph.parentWays(graph.entity(midpoint.edge[0])), - graph.parentWays(graph.entity(midpoint.edge[1])) - ); - - parents.forEach(function(way) { - for (var i = 0; i < way.nodes.length - 1; i++) { - if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) { - graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1)); + return PtRounder; + }(); - // Add only one midpoint on doubled-back segments, - // turning them into self-intersections. - return; - } - } - }); + var CoordRounder = /*#__PURE__*/function () { + function CoordRounder() { + _classCallCheck(this, CoordRounder); - return graph; - }; - } + this.tree = new Tree(); // preseed with 0 so we don't end up with values < Number.EPSILON - // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as - function actionAddVertex(wayId, nodeId, index) { - return function(graph) { - return graph.replace(graph.entity(wayId).addNode(nodeId, index)); - }; - } + this.round(0); + } // Note: this can rounds input values backwards or forwards. + // You might ask, why not restrict this to just rounding + // forwards? Wouldn't that allow left endpoints to always + // remain left endpoints during splitting (never change to + // right). No - it wouldn't, because we snap intersections + // to endpoints (to establish independence from the segment + // angle for t-intersections). - function actionChangeMember(relationId, member, memberIndex) { - return function(graph) { - return graph.replace(graph.entity(relationId).updateMember(member, memberIndex)); - }; - } - function actionChangePreset(entityID, oldPreset, newPreset, skipFieldDefaults) { - return function action(graph) { - var entity = graph.entity(entityID); - var geometry = entity.geometry(graph); - var tags = entity.tags; + _createClass(CoordRounder, [{ + key: "round", + value: function round(coord) { + var node = this.tree.add(coord); + var prevNode = this.tree.prev(node); - if (oldPreset) { tags = oldPreset.unsetTags(tags, geometry); } - if (newPreset) { tags = newPreset.setTags(tags, geometry, skipFieldDefaults); } + if (prevNode !== null && cmp(node.key, prevNode.key) === 0) { + this.tree.remove(coord); + return prevNode.key; + } - return graph.replace(entity.update({tags: tags})); - }; - } + var nextNode = this.tree.next(node); - function actionChangeTags(entityId, tags) { - return function(graph) { - var entity = graph.entity(entityId); - return graph.replace(entity.update({tags: tags})); - }; - } + if (nextNode !== null && cmp(node.key, nextNode.key) === 0) { + this.tree.remove(coord); + return nextNode.key; + } - function osmNode() { - if (!(this instanceof osmNode)) { - return (new osmNode()).initialize(arguments); - } else if (arguments.length) { - this.initialize(arguments); + return coord; } - } + }]); - osmEntity.node = osmNode; + return CoordRounder; + }(); // singleton available by import - osmNode.prototype = Object.create(osmEntity.prototype); - Object.assign(osmNode.prototype, { - type: 'node', - loc: [9999, 9999], + var rounder = new PtRounder(); + /* Cross Product of two vectors with first point at origin */ - extent: function() { - return new geoExtent(this.loc); - }, + var crossProduct = function crossProduct(a, b) { + return a.x * b.y - a.y * b.x; + }; + /* Dot Product of two vectors with first point at origin */ - geometry: function(graph) { - return graph.transient(this, 'geometry', function() { - return graph.isPoi(this) ? 'point' : 'vertex'; - }); - }, + var dotProduct = function dotProduct(a, b) { + return a.x * b.x + a.y * b.y; + }; + /* Comparator for two vectors with same starting point */ - move: function(loc) { - return this.update({loc: loc}); - }, + var compareVectorAngles = function compareVectorAngles(basePt, endPt1, endPt2) { + var v1 = { + x: endPt1.x - basePt.x, + y: endPt1.y - basePt.y + }; + var v2 = { + x: endPt2.x - basePt.x, + y: endPt2.y - basePt.y + }; + var kross = crossProduct(v1, v2); + return cmp(kross, 0); + }; + var length = function length(v) { + return Math.sqrt(dotProduct(v, v)); + }; + /* Get the sine of the angle from pShared -> pAngle to pShaed -> pBase */ - isDegenerate: function() { - return !( - Array.isArray(this.loc) && this.loc.length === 2 && - this.loc[0] >= -180 && this.loc[0] <= 180 && - this.loc[1] >= -90 && this.loc[1] <= 90 - ); - }, + var sineOfAngle = function sineOfAngle(pShared, pBase, pAngle) { + var vBase = { + x: pBase.x - pShared.x, + y: pBase.y - pShared.y + }; + var vAngle = { + x: pAngle.x - pShared.x, + y: pAngle.y - pShared.y + }; + return crossProduct(vAngle, vBase) / length(vAngle) / length(vBase); + }; + /* Get the cosine of the angle from pShared -> pAngle to pShaed -> pBase */ - // Inspect tags and geometry to determine which direction(s) this node/vertex points - directions: function(resolver, projection) { - var val; - var i; - // which tag to use? - if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') { - // all-way stop tag on a highway intersection - val = 'all'; - } else { - // generic direction tag - val = (this.tags.direction || '').toLowerCase(); - - // better suffix-style direction tag - var re = /:direction$/i; - var keys = Object.keys(this.tags); - for (i = 0; i < keys.length; i++) { - if (re.test(keys[i])) { - val = this.tags[keys[i]].toLowerCase(); - break; - } - } - } + var cosineOfAngle = function cosineOfAngle(pShared, pBase, pAngle) { + var vBase = { + x: pBase.x - pShared.x, + y: pBase.y - pShared.y + }; + var vAngle = { + x: pAngle.x - pShared.x, + y: pAngle.y - pShared.y + }; + return dotProduct(vAngle, vBase) / length(vAngle) / length(vBase); + }; + /* Get the x coordinate where the given line (defined by a point and vector) + * crosses the horizontal line with the given y coordiante. + * In the case of parrallel lines (including overlapping ones) returns null. */ - if (val === '') { return []; } - - var cardinal = { - north: 0, n: 0, - northnortheast: 22, nne: 22, - northeast: 45, ne: 45, - eastnortheast: 67, ene: 67, - east: 90, e: 90, - eastsoutheast: 112, ese: 112, - southeast: 135, se: 135, - southsoutheast: 157, sse: 157, - south: 180, s: 180, - southsouthwest: 202, ssw: 202, - southwest: 225, sw: 225, - westsouthwest: 247, wsw: 247, - west: 270, w: 270, - westnorthwest: 292, wnw: 292, - northwest: 315, nw: 315, - northnorthwest: 337, nnw: 337 - }; + var horizontalIntersection = function horizontalIntersection(pt, v, y) { + if (v.y === 0) return null; + return { + x: pt.x + v.x / v.y * (y - pt.y), + y: y + }; + }; + /* Get the y coordinate where the given line (defined by a point and vector) + * crosses the vertical line with the given x coordiante. + * In the case of parrallel lines (including overlapping ones) returns null. */ - var values = val.split(';'); - var results = []; - values.forEach(function(v) { - // swap cardinal for numeric directions - if (cardinal[v] !== undefined) { - v = cardinal[v]; - } + var verticalIntersection = function verticalIntersection(pt, v, x) { + if (v.x === 0) return null; + return { + x: x, + y: pt.y + v.y / v.x * (x - pt.x) + }; + }; + /* Get the intersection of two lines, each defined by a base point and a vector. + * In the case of parrallel lines (including overlapping ones) returns null. */ + + + var intersection = function intersection(pt1, v1, pt2, v2) { + // take some shortcuts for vertical and horizontal lines + // this also ensures we don't calculate an intersection and then discover + // it's actually outside the bounding box of the line + if (v1.x === 0) return verticalIntersection(pt2, v2, pt1.x); + if (v2.x === 0) return verticalIntersection(pt1, v1, pt2.x); + if (v1.y === 0) return horizontalIntersection(pt2, v2, pt1.y); + if (v2.y === 0) return horizontalIntersection(pt1, v1, pt2.y); // General case for non-overlapping segments. + // This algorithm is based on Schneider and Eberly. + // http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf - pg 244 + + var kross = crossProduct(v1, v2); + if (kross == 0) return null; + var ve = { + x: pt2.x - pt1.x, + y: pt2.y - pt1.y + }; + var d1 = crossProduct(ve, v1) / kross; + var d2 = crossProduct(ve, v2) / kross; // take the average of the two calculations to minimize rounding error + + var x1 = pt1.x + d2 * v1.x, + x2 = pt2.x + d1 * v2.x; + var y1 = pt1.y + d2 * v1.y, + y2 = pt2.y + d1 * v2.y; + var x = (x1 + x2) / 2; + var y = (y1 + y2) / 2; + return { + x: x, + y: y + }; + }; - // numeric direction - just add to results - if (v !== '' && !isNaN(+v)) { - results.push(+v); - return; - } + var SweepEvent = /*#__PURE__*/function () { + _createClass(SweepEvent, null, [{ + key: "compare", + // for ordering sweep events in the sweep event queue + value: function compare(a, b) { + // favor event with a point that the sweep line hits first + var ptCmp = SweepEvent.comparePoints(a.point, b.point); + if (ptCmp !== 0) return ptCmp; // the points are the same, so link them if needed - // string direction - inspect parent ways - var lookBackward = - (this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all'); - var lookForward = - (this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all'); - - if (!lookForward && !lookBackward) { return; } - - var nodeIds = {}; - resolver.parentWays(this).forEach(function(parent) { - var nodes = parent.nodes; - for (i = 0; i < nodes.length; i++) { - if (nodes[i] === this.id) { // match current entity - if (lookForward && i > 0) { - nodeIds[nodes[i - 1]] = true; // look back to prev node - } - if (lookBackward && i < nodes.length - 1) { - nodeIds[nodes[i + 1]] = true; // look ahead to next node - } - } - } - }, this); + if (a.point !== b.point) a.link(b); // favor right events over left - Object.keys(nodeIds).forEach(function(nodeId) { - // +90 because geoAngle returns angle from X axis, not Y (north) - results.push( - (geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI)) + 90 - ); - }, this); + if (a.isLeft !== b.isLeft) return a.isLeft ? 1 : -1; // we have two matching left or right endpoints + // ordering of this case is the same as for their segments - }, this); + return Segment.compare(a.segment, b.segment); + } // for ordering points in sweep line order - return utilArrayUniq(results); - }, + }, { + key: "comparePoints", + value: function comparePoints(aPt, bPt) { + if (aPt.x < bPt.x) return -1; + if (aPt.x > bPt.x) return 1; + if (aPt.y < bPt.y) return -1; + if (aPt.y > bPt.y) return 1; + return 0; + } // Warning: 'point' input will be modified and re-used (for performance) + + }]); + + function SweepEvent(point, isLeft) { + _classCallCheck(this, SweepEvent); + + if (point.events === undefined) point.events = [this];else point.events.push(this); + this.point = point; + this.isLeft = isLeft; // this.segment, this.otherSE set by factory + } + + _createClass(SweepEvent, [{ + key: "link", + value: function link(other) { + if (other.point === this.point) { + throw new Error('Tried to link already linked events'); + } + var otherEvents = other.point.events; - isEndpoint: function(resolver) { - return resolver.transient(this, 'isEndpoint', function() { - var id = this.id; - return resolver.parentWays(this).filter(function(parent) { - return !parent.isClosed() && !!parent.affix(id); - }).length > 0; - }); - }, + for (var i = 0, iMax = otherEvents.length; i < iMax; i++) { + var evt = otherEvents[i]; + this.point.events.push(evt); + evt.point = this.point; + } + this.checkForConsuming(); + } + /* Do a pass over our linked events and check to see if any pair + * of segments match, and should be consumed. */ - isConnected: function(resolver) { - return resolver.transient(this, 'isConnected', function() { - var parents = resolver.parentWays(this); + }, { + key: "checkForConsuming", + value: function checkForConsuming() { + // FIXME: The loops in this method run O(n^2) => no good. + // Maintain little ordered sweep event trees? + // Can we maintaining an ordering that avoids the need + // for the re-sorting with getLeftmostComparator in geom-out? + // Compare each pair of events to see if other events also match + var numEvents = this.point.events.length; + + for (var i = 0; i < numEvents; i++) { + var evt1 = this.point.events[i]; + if (evt1.segment.consumedBy !== undefined) continue; + + for (var j = i + 1; j < numEvents; j++) { + var evt2 = this.point.events[j]; + if (evt2.consumedBy !== undefined) continue; + if (evt1.otherSE.point.events !== evt2.otherSE.point.events) continue; + evt1.segment.consume(evt2.segment); + } + } + } + }, { + key: "getAvailableLinkedEvents", + value: function getAvailableLinkedEvents() { + // point.events is always of length 2 or greater + var events = []; - if (parents.length > 1) { - // vertex is connected to multiple parent ways - for (var i in parents) { - if (parents[i].geometry(resolver) === 'line' && - parents[i].hasInterestingTags()) { return true; } - } - } else if (parents.length === 1) { - var way = parents[0]; - var nodes = way.nodes.slice(); - if (way.isClosed()) { nodes.pop(); } // ignore connecting node if closed + for (var i = 0, iMax = this.point.events.length; i < iMax; i++) { + var evt = this.point.events[i]; - // return true if vertex appears multiple times (way is self intersecting) - return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id); - } + if (evt !== this && !evt.segment.ringOut && evt.segment.isInResult()) { + events.push(evt); + } + } - return false; - }); - }, + return events; + } + /** + * Returns a comparator function for sorting linked events that will + * favor the event that will give us the smallest left-side angle. + * All ring construction starts as low as possible heading to the right, + * so by always turning left as sharp as possible we'll get polygons + * without uncessary loops & holes. + * + * The comparator function has a compute cache such that it avoids + * re-computing already-computed values. + */ + }, { + key: "getLeftmostComparator", + value: function getLeftmostComparator(baseEvent) { + var _this = this; - parentIntersectionWays: function(resolver) { - return resolver.transient(this, 'parentIntersectionWays', function() { - return resolver.parentWays(this).filter(function(parent) { - return (parent.tags.highway || - parent.tags.waterway || - parent.tags.railway || - parent.tags.aeroway) && - parent.geometry(resolver) === 'line'; - }); - }); - }, + var cache = new Map(); + var fillCache = function fillCache(linkedEvent) { + var nextEvent = linkedEvent.otherSE; + cache.set(linkedEvent, { + sine: sineOfAngle(_this.point, baseEvent.point, nextEvent.point), + cosine: cosineOfAngle(_this.point, baseEvent.point, nextEvent.point) + }); + }; - isIntersection: function(resolver) { - return this.parentIntersectionWays(resolver).length > 1; - }, + return function (a, b) { + if (!cache.has(a)) fillCache(a); + if (!cache.has(b)) fillCache(b); + var _cache$get = cache.get(a), + asine = _cache$get.sine, + acosine = _cache$get.cosine; - isHighwayIntersection: function(resolver) { - return resolver.transient(this, 'isHighwayIntersection', function() { - return resolver.parentWays(this).filter(function(parent) { - return parent.tags.highway && parent.geometry(resolver) === 'line'; - }).length > 1; - }); - }, + var _cache$get2 = cache.get(b), + bsine = _cache$get2.sine, + bcosine = _cache$get2.cosine; // both on or above x-axis - isOnAddressLine: function(resolver) { - return resolver.transient(this, 'isOnAddressLine', function() { - return resolver.parentWays(this).filter(function(parent) { - return parent.tags.hasOwnProperty('addr:interpolation') && - parent.geometry(resolver) === 'line'; - }).length > 0; - }); - }, + if (asine >= 0 && bsine >= 0) { + if (acosine < bcosine) return 1; + if (acosine > bcosine) return -1; + return 0; + } // both below x-axis - asJXON: function(changeset_id) { - var r = { - node: { - '@id': this.osmId(), - '@lon': this.loc[0], - '@lat': this.loc[1], - '@version': (this.version || 0), - tag: Object.keys(this.tags).map(function(k) { - return { keyAttributes: { k: k, v: this.tags[k] } }; - }, this) - } - }; - if (changeset_id) { r.node['@changeset'] = changeset_id; } - return r; - }, + if (asine < 0 && bsine < 0) { + if (acosine < bcosine) return -1; + if (acosine > bcosine) return 1; + return 0; + } // one above x-axis, one below - asGeoJSON: function() { - return { - type: 'Point', - coordinates: this.loc - }; + if (bsine < asine) return -1; + if (bsine > asine) return 1; + return 0; + }; } - }); + }]); - function actionCircularize(wayId, projection, maxAngle) { - maxAngle = (maxAngle || 20) * Math.PI / 180; + return SweepEvent; + }(); // segments and sweep events when all else is identical - var action = function(graph, t) { - if (t === null || !isFinite(t)) { t = 1; } - t = Math.min(Math.max(+t, 0), 1); + var segmentId = 0; - var way = graph.entity(wayId); - var origNodes = {}; + var Segment = /*#__PURE__*/function () { + _createClass(Segment, null, [{ + key: "compare", - graph.childNodes(way).forEach(function(node) { - if (!origNodes[node.id]) { origNodes[node.id] = node; } - }); + /* This compare() function is for ordering segments in the sweep + * line tree, and does so according to the following criteria: + * + * Consider the vertical line that lies an infinestimal step to the + * right of the right-more of the two left endpoints of the input + * segments. Imagine slowly moving a point up from negative infinity + * in the increasing y direction. Which of the two segments will that + * point intersect first? That segment comes 'before' the other one. + * + * If neither segment would be intersected by such a line, (if one + * or more of the segments are vertical) then the line to be considered + * is directly on the right-more of the two left inputs. + */ + value: function compare(a, b) { + var alx = a.leftSE.point.x; + var blx = b.leftSE.point.x; + var arx = a.rightSE.point.x; + var brx = b.rightSE.point.x; // check if they're even in the same vertical plane + + if (brx < alx) return 1; + if (arx < blx) return -1; + var aly = a.leftSE.point.y; + var bly = b.leftSE.point.y; + var ary = a.rightSE.point.y; + var bry = b.rightSE.point.y; // is left endpoint of segment B the right-more? + + if (alx < blx) { + // are the two segments in the same horizontal plane? + if (bly < aly && bly < ary) return 1; + if (bly > aly && bly > ary) return -1; // is the B left endpoint colinear to segment A? + + var aCmpBLeft = a.comparePoint(b.leftSE.point); + if (aCmpBLeft < 0) return 1; + if (aCmpBLeft > 0) return -1; // is the A right endpoint colinear to segment B ? + + var bCmpARight = b.comparePoint(a.rightSE.point); + if (bCmpARight !== 0) return bCmpARight; // colinear segments, consider the one with left-more + // left endpoint to be first (arbitrary?) - if (!way.isConvex(graph)) { - graph = action.makeConvex(graph); - } - - var nodes = utilArrayUniq(graph.childNodes(way)); - var keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; }); - var points = nodes.map(function(n) { return projection(n.loc); }); - var keyPoints = keyNodes.map(function(n) { return projection(n.loc); }); - var centroid = (points.length === 2) ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points); - var radius = d3_median(points, function(p) { return geoVecLength(centroid, p); }); - var sign = d3_polygonArea(points) > 0 ? 1 : -1; - var ids, i, j, k; - - // we need atleast two key nodes for the algorithm to work - if (!keyNodes.length) { - keyNodes = [nodes[0]]; - keyPoints = [points[0]]; - } - - if (keyNodes.length === 1) { - var index = nodes.indexOf(keyNodes[0]); - var oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length); - - keyNodes.push(nodes[oppositeIndex]); - keyPoints.push(points[oppositeIndex]); - } - - // key points and nodes are those connected to the ways, - // they are projected onto the circle, inbetween nodes are moved - // to constant intervals between key nodes, extra inbetween nodes are - // added if necessary. - for (i = 0; i < keyPoints.length; i++) { - var nextKeyNodeIndex = (i + 1) % keyNodes.length; - var startNode = keyNodes[i]; - var endNode = keyNodes[nextKeyNodeIndex]; - var startNodeIndex = nodes.indexOf(startNode); - var endNodeIndex = nodes.indexOf(endNode); - var numberNewPoints = -1; - var indexRange = endNodeIndex - startNodeIndex; - var nearNodes = {}; - var inBetweenNodes = []; - var startAngle, endAngle, totalAngle, eachAngle; - var angle, loc, node, origNode; - - if (indexRange < 0) { - indexRange += nodes.length; - } + return -1; + } // is left endpoint of segment A the right-more? - // position this key node - var distance = geoVecLength(centroid, keyPoints[i]) || 1e-4; - keyPoints[i] = [ - centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius, - centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius - ]; - loc = projection.invert(keyPoints[i]); - node = keyNodes[i]; - origNode = origNodes[node.id]; - node = node.move(geoVecInterp(origNode.loc, loc, t)); - graph = graph.replace(node); - - // figure out the between delta angle we want to match to - startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]); - endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]); - totalAngle = endAngle - startAngle; - - // detects looping around -pi/pi - if (totalAngle * sign > 0) { - totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle)); - } - do { - numberNewPoints++; - eachAngle = totalAngle / (indexRange + numberNewPoints); - } while (Math.abs(eachAngle) > maxAngle); + if (alx > blx) { + if (aly < bly && aly < bry) return -1; + if (aly > bly && aly > bry) return 1; // is the A left endpoint colinear to segment B? + var bCmpALeft = b.comparePoint(a.leftSE.point); + if (bCmpALeft !== 0) return bCmpALeft; // is the B right endpoint colinear to segment A? - // move existing nodes - for (j = 1; j < indexRange; j++) { - angle = startAngle + j * eachAngle; - loc = projection.invert([ - centroid[0] + Math.cos(angle) * radius, - centroid[1] + Math.sin(angle) * radius - ]); + var aCmpBRight = a.comparePoint(b.rightSE.point); + if (aCmpBRight < 0) return 1; + if (aCmpBRight > 0) return -1; // colinear segments, consider the one with left-more + // left endpoint to be first (arbitrary?) - node = nodes[(j + startNodeIndex) % nodes.length]; - origNode = origNodes[node.id]; - nearNodes[node.id] = angle; + return 1; + } // if we get here, the two left endpoints are in the same + // vertical plane, ie alx === blx + // consider the lower left-endpoint to come first - node = node.move(geoVecInterp(origNode.loc, loc, t)); - graph = graph.replace(node); - } - // add new inbetween nodes if necessary - for (j = 0; j < numberNewPoints; j++) { - angle = startAngle + (indexRange + j) * eachAngle; - loc = projection.invert([ - centroid[0] + Math.cos(angle) * radius, - centroid[1] + Math.sin(angle) * radius - ]); - - // choose a nearnode to use as the original - var min = Infinity; - for (var nodeId in nearNodes) { - var nearAngle = nearNodes[nodeId]; - var dist = Math.abs(nearAngle - angle); - if (dist < min) { - dist = min; - origNode = origNodes[nodeId]; - } - } + if (aly < bly) return -1; + if (aly > bly) return 1; // left endpoints are identical + // check for colinearity by using the left-more right endpoint + // is the A right endpoint more left-more? - node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) }); - graph = graph.replace(node); + if (arx < brx) { + var _bCmpARight = b.comparePoint(a.rightSE.point); - nodes.splice(endNodeIndex + j, 0, node); - inBetweenNodes.push(node.id); - } + if (_bCmpARight !== 0) return _bCmpARight; + } // is the B right endpoint more left-more? - // Check for other ways that share these keyNodes.. - // If keyNodes are adjacent in both ways, - // we can add inBetween nodes to that shared way too.. - if (indexRange === 1 && inBetweenNodes.length) { - var startIndex1 = way.nodes.lastIndexOf(startNode.id); - var endIndex1 = way.nodes.lastIndexOf(endNode.id); - var wayDirection1 = (endIndex1 - startIndex1); - if (wayDirection1 < -1) { wayDirection1 = 1; } - - var parentWays = graph.parentWays(keyNodes[i]); - for (j = 0; j < parentWays.length; j++) { - var sharedWay = parentWays[j]; - if (sharedWay === way) { continue; } - - if (sharedWay.areAdjacent(startNode.id, endNode.id)) { - var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id); - var endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id); - var wayDirection2 = (endIndex2 - startIndex2); - var insertAt = endIndex2; - if (wayDirection2 < -1) { wayDirection2 = 1; } - - if (wayDirection1 !== wayDirection2) { - inBetweenNodes.reverse(); - insertAt = startIndex2; - } - for (k = 0; k < inBetweenNodes.length; k++) { - sharedWay = sharedWay.addNode(inBetweenNodes[k], insertAt + k); - } - graph = graph.replace(sharedWay); - } - } - } - } + if (arx > brx) { + var _aCmpBRight = a.comparePoint(b.rightSE.point); - // update the way to have all the new nodes - ids = nodes.map(function(n) { return n.id; }); - ids.push(ids[0]); + if (_aCmpBRight < 0) return 1; + if (_aCmpBRight > 0) return -1; + } - way = way.update({nodes: ids}); - graph = graph.replace(way); + if (arx !== brx) { + // are these two [almost] vertical segments with opposite orientation? + // if so, the one with the lower right endpoint comes first + var ay = ary - aly; + var ax = arx - alx; + var by = bry - bly; + var bx = brx - blx; + if (ay > ax && by < bx) return 1; + if (ay < ax && by > bx) return -1; + } // we have colinear segments with matching orientation + // consider the one with more left-more right endpoint to be first - return graph; - }; + if (arx > brx) return 1; + if (arx < brx) return -1; // if we get here, two two right endpoints are in the same + // vertical plane, ie arx === brx + // consider the lower right-endpoint to come first - action.makeConvex = function(graph) { - var way = graph.entity(wayId); - var nodes = utilArrayUniq(graph.childNodes(way)); - var points = nodes.map(function(n) { return projection(n.loc); }); - var sign = d3_polygonArea(points) > 0 ? 1 : -1; - var hull = d3_polygonHull(points); - var i, j; + if (ary < bry) return -1; + if (ary > bry) return 1; // right endpoints identical as well, so the segments are idential + // fall back on creation order as consistent tie-breaker - // D3 convex hulls go counterclockwise.. - if (sign === -1) { - nodes.reverse(); - points.reverse(); - } + if (a.id < b.id) return -1; + if (a.id > b.id) return 1; // identical segment, ie a === b - for (i = 0; i < hull.length - 1; i++) { - var startIndex = points.indexOf(hull[i]); - var endIndex = points.indexOf(hull[i+1]); - var indexRange = (endIndex - startIndex); + return 0; + } + /* Warning: a reference to ringWindings input will be stored, + * and possibly will be later modified */ - if (indexRange < 0) { - indexRange += nodes.length; - } + }]); - // move interior nodes to the surface of the convex hull.. - for (j = 1; j < indexRange; j++) { - var point = geoVecInterp(hull[i], hull[i+1], j / indexRange); - var node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point)); - graph = graph.replace(node); - } - } - return graph; - }; + function Segment(leftSE, rightSE, rings, windings) { + _classCallCheck(this, Segment); + this.id = ++segmentId; + this.leftSE = leftSE; + leftSE.segment = this; + leftSE.otherSE = rightSE; + this.rightSE = rightSE; + rightSE.segment = this; + rightSE.otherSE = leftSE; + this.rings = rings; + this.windings = windings; // left unset for performance, set later in algorithm + // this.ringOut, this.consumedBy, this.prev + } - action.disabled = function(graph) { - if (!graph.entity(wayId).isClosed()) { - return 'not_closed'; - } + _createClass(Segment, [{ + key: "replaceRightSE", - //disable when already circular - var way = graph.entity(wayId); - var nodes = utilArrayUniq(graph.childNodes(way)); - var points = nodes.map(function(n) { return projection(n.loc); }); - var hull = d3_polygonHull(points); - var epsilonAngle = Math.PI / 180; - if (hull.length !== points.length || hull.length < 3){ - return false; - } - var centroid = d3_polygonCentroid(points); - var radius = geoVecLengthSquare(centroid, points[0]); - - // compare distances between centroid and points - for (var i = 0; i 0.05*radius) { - return false; - } - } - - //check if central angles are smaller than maxAngle - for (i = 0; i Math.PI){ - angle = (2*Math.PI - angle); - } - - if (angle > maxAngle + epsilonAngle) { - return false; - } + /* When a segment is split, the rightSE is replaced with a new sweep event */ + value: function replaceRightSE(newRightSE) { + this.rightSE = newRightSE; + this.rightSE.segment = this; + this.rightSE.otherSE = this.leftSE; + this.leftSE.otherSE = this.rightSE; + } + }, { + key: "bbox", + value: function bbox() { + var y1 = this.leftSE.point.y; + var y2 = this.rightSE.point.y; + return { + ll: { + x: this.leftSE.point.x, + y: y1 < y2 ? y1 : y2 + }, + ur: { + x: this.rightSE.point.x, + y: y1 > y2 ? y1 : y2 } - return 'already_circular'; - }; + }; + } + /* A vector from the left point to the right */ + }, { + key: "vector", + value: function vector() { + return { + x: this.rightSE.point.x - this.leftSE.point.x, + y: this.rightSE.point.y - this.leftSE.point.y + }; + } + }, { + key: "isAnEndpoint", + value: function isAnEndpoint(pt) { + return pt.x === this.leftSE.point.x && pt.y === this.leftSE.point.y || pt.x === this.rightSE.point.x && pt.y === this.rightSE.point.y; + } + /* Compare this segment with a point. + * + * A point P is considered to be colinear to a segment if there + * exists a distance D such that if we travel along the segment + * from one * endpoint towards the other a distance D, we find + * ourselves at point P. + * + * Return value indicates: + * + * 1: point lies above the segment (to the left of vertical) + * 0: point is colinear to segment + * -1: point lies below the segment (to the right of vertical) + */ - action.transitionable = true; + }, { + key: "comparePoint", + value: function comparePoint(point) { + if (this.isAnEndpoint(point)) return 0; + var lPt = this.leftSE.point; + var rPt = this.rightSE.point; + var v = this.vector(); // Exactly vertical segments. + + if (lPt.x === rPt.x) { + if (point.x === lPt.x) return 0; + return point.x < lPt.x ? 1 : -1; + } // Nearly vertical segments with an intersection. + // Check to see where a point on the line with matching Y coordinate is. + + + var yDist = (point.y - lPt.y) / v.y; + var xFromYDist = lPt.x + yDist * v.x; + if (point.x === xFromYDist) return 0; // General case. + // Check to see where a point on the line with matching X coordinate is. + + var xDist = (point.x - lPt.x) / v.x; + var yFromXDist = lPt.y + xDist * v.y; + if (point.y === yFromXDist) return 0; + return point.y < yFromXDist ? -1 : 1; + } + /** + * Given another segment, returns the first non-trivial intersection + * between the two segments (in terms of sweep line ordering), if it exists. + * + * A 'non-trivial' intersection is one that will cause one or both of the + * segments to be split(). As such, 'trivial' vs. 'non-trivial' intersection: + * + * * endpoint of segA with endpoint of segB --> trivial + * * endpoint of segA with point along segB --> non-trivial + * * endpoint of segB with point along segA --> non-trivial + * * point along segA with point along segB --> non-trivial + * + * If no non-trivial intersection exists, return null + * Else, return null. + */ + }, { + key: "getIntersection", + value: function getIntersection(other) { + // If bboxes don't overlap, there can't be any intersections + var tBbox = this.bbox(); + var oBbox = other.bbox(); + var bboxOverlap = getBboxOverlap(tBbox, oBbox); + if (bboxOverlap === null) return null; // We first check to see if the endpoints can be considered intersections. + // This will 'snap' intersections to endpoints if possible, and will + // handle cases of colinearity. + + var tlp = this.leftSE.point; + var trp = this.rightSE.point; + var olp = other.leftSE.point; + var orp = other.rightSE.point; // does each endpoint touch the other segment? + // note that we restrict the 'touching' definition to only allow segments + // to touch endpoints that lie forward from where we are in the sweep line pass + + var touchesOtherLSE = isInBbox(tBbox, olp) && this.comparePoint(olp) === 0; + var touchesThisLSE = isInBbox(oBbox, tlp) && other.comparePoint(tlp) === 0; + var touchesOtherRSE = isInBbox(tBbox, orp) && this.comparePoint(orp) === 0; + var touchesThisRSE = isInBbox(oBbox, trp) && other.comparePoint(trp) === 0; // do left endpoints match? + + if (touchesThisLSE && touchesOtherLSE) { + // these two cases are for colinear segments with matching left + // endpoints, and one segment being longer than the other + if (touchesThisRSE && !touchesOtherRSE) return trp; + if (!touchesThisRSE && touchesOtherRSE) return orp; // either the two segments match exactly (two trival intersections) + // or just on their left endpoint (one trivial intersection - return action; - } + return null; + } // does this left endpoint matches (other doesn't) - // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as - function actionDeleteWay(wayID) { - function canDeleteNode(node, graph) { - // don't delete nodes still attached to ways or relations - if (graph.parentWays(node).length || - graph.parentRelations(node).length) { return false; } + if (touchesThisLSE) { + // check for segments that just intersect on opposing endpoints + if (touchesOtherRSE) { + if (tlp.x === orp.x && tlp.y === orp.y) return null; + } // t-intersection on left endpoint - var geometries = osmNodeGeometriesForTags(node.tags); - // don't delete if this node can be a standalone point - if (geometries.point) { return false; } - // delete if this node only be a vertex - if (geometries.vertex) { return true; } - // iD doesn't know if this should be a point or vertex, - // so only delete if there are no interesting tags - return !node.hasInterestingTags(); - } + return tlp; + } // does other left endpoint matches (this doesn't) - var action = function(graph) { - var way = graph.entity(wayID); + if (touchesOtherLSE) { + // check for segments that just intersect on opposing endpoints + if (touchesThisRSE) { + if (trp.x === olp.x && trp.y === olp.y) return null; + } // t-intersection on left endpoint - graph.parentRelations(way).forEach(function(parent) { - parent = parent.removeMembersWithID(wayID); - graph = graph.replace(parent); - if (parent.isDegenerate()) { - graph = actionDeleteRelation(parent.id)(graph); - } - }); + return olp; + } // trivial intersection on right endpoints - (new Set(way.nodes)).forEach(function(nodeID) { - graph = graph.replace(way.removeNode(nodeID)); - var node = graph.entity(nodeID); - if (canDeleteNode(node, graph)) { - graph = graph.remove(node); - } - }); + if (touchesThisRSE && touchesOtherRSE) return null; // t-intersections on just one right endpoint - return graph.remove(way); - }; + if (touchesThisRSE) return trp; + if (touchesOtherRSE) return orp; // None of our endpoints intersect. Look for a general intersection between + // infinite lines laid over the segments + var pt = intersection(tlp, this.vector(), olp, other.vector()); // are the segments parrallel? Note that if they were colinear with overlap, + // they would have an endpoint intersection and that case was already handled above - return action; - } + if (pt === null) return null; // is the intersection found between the lines not on the segments? - function actionDeleteMultiple(ids) { - var actions = { - way: actionDeleteWay, - node: actionDeleteNode, - relation: actionDeleteRelation - }; + if (!isInBbox(bboxOverlap, pt)) return null; // round the the computed point if needed + return rounder.round(pt.x, pt.y); + } + /** + * Split the given segment into multiple segments on the given points. + * * Each existing segment will retain its leftSE and a new rightSE will be + * generated for it. + * * A new segment will be generated which will adopt the original segment's + * rightSE, and a new leftSE will be generated for it. + * * If there are more than two points given to split on, new segments + * in the middle will be generated with new leftSE and rightSE's. + * * An array of the newly generated SweepEvents will be returned. + * + * Warning: input array of points is modified + */ - var action = function(graph) { - ids.forEach(function(id) { - if (graph.hasEntity(id)) { // It may have been deleted aready. - graph = actions[graph.entity(id).type](id)(graph); - } - }); + }, { + key: "split", + value: function split(point) { + var newEvents = []; + var alreadyLinked = point.events !== undefined; + var newLeftSE = new SweepEvent(point, true); + var newRightSE = new SweepEvent(point, false); + var oldRightSE = this.rightSE; + this.replaceRightSE(newRightSE); + newEvents.push(newRightSE); + newEvents.push(newLeftSE); + var newSeg = new Segment(newLeftSE, oldRightSE, this.rings.slice(), this.windings.slice()); // when splitting a nearly vertical downward-facing segment, + // sometimes one of the resulting new segments is vertical, in which + // case its left and right events may need to be swapped + + if (SweepEvent.comparePoints(newSeg.leftSE.point, newSeg.rightSE.point) > 0) { + newSeg.swapEvents(); + } - return graph; - }; + if (SweepEvent.comparePoints(this.leftSE.point, this.rightSE.point) > 0) { + this.swapEvents(); + } // in the point we just used to create new sweep events with was already + // linked to other events, we need to check if either of the affected + // segments should be consumed - return action; - } + if (alreadyLinked) { + newLeftSE.checkForConsuming(); + newRightSE.checkForConsuming(); + } - // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as - function actionDeleteRelation(relationID, allowUntaggedMembers) { + return newEvents; + } + /* Swap which event is left and right */ - function canDeleteEntity(entity, graph) { - return !graph.parentWays(entity).length && - !graph.parentRelations(entity).length && - (!entity.hasInterestingTags() && !allowUntaggedMembers); + }, { + key: "swapEvents", + value: function swapEvents() { + var tmpEvt = this.rightSE; + this.rightSE = this.leftSE; + this.leftSE = tmpEvt; + this.leftSE.isLeft = true; + this.rightSE.isLeft = false; + + for (var i = 0, iMax = this.windings.length; i < iMax; i++) { + this.windings[i] *= -1; + } } + /* Consume another segment. We take their rings under our wing + * and mark them as consumed. Use for perfectly overlapping segments */ + }, { + key: "consume", + value: function consume(other) { + var consumer = this; + var consumee = other; - var action = function(graph) { - var relation = graph.entity(relationID); + while (consumer.consumedBy) { + consumer = consumer.consumedBy; + } - graph.parentRelations(relation) - .forEach(function(parent) { - parent = parent.removeMembersWithID(relationID); - graph = graph.replace(parent); + while (consumee.consumedBy) { + consumee = consumee.consumedBy; + } - if (parent.isDegenerate()) { - graph = actionDeleteRelation(parent.id)(graph); - } - }); + var cmp = Segment.compare(consumer, consumee); + if (cmp === 0) return; // already consumed + // the winner of the consumption is the earlier segment + // according to sweep line ordering - var memberIDs = utilArrayUniq(relation.members.map(function(m) { return m.id; })); - memberIDs.forEach(function(memberID) { - graph = graph.replace(relation.removeMembersWithID(memberID)); + if (cmp > 0) { + var tmp = consumer; + consumer = consumee; + consumee = tmp; + } // make sure a segment doesn't consume it's prev - var entity = graph.entity(memberID); - if (canDeleteEntity(entity, graph)) { - graph = actionDeleteMultiple([memberID])(graph); - } - }); - return graph.remove(relation); - }; + if (consumer.prev === consumee) { + var _tmp = consumer; + consumer = consumee; + consumee = _tmp; + } + for (var i = 0, iMax = consumee.rings.length; i < iMax; i++) { + var ring = consumee.rings[i]; + var winding = consumee.windings[i]; + var index = consumer.rings.indexOf(ring); - return action; - } + if (index === -1) { + consumer.rings.push(ring); + consumer.windings.push(winding); + } else consumer.windings[index] += winding; + } - // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as - function actionDeleteNode(nodeId) { - var action = function(graph) { - var node = graph.entity(nodeId); + consumee.rings = null; + consumee.windings = null; + consumee.consumedBy = consumer; // mark sweep events consumed as to maintain ordering in sweep event queue - graph.parentWays(node) - .forEach(function(parent) { - parent = parent.removeNode(nodeId); - graph = graph.replace(parent); + consumee.leftSE.consumedBy = consumer.leftSE; + consumee.rightSE.consumedBy = consumer.rightSE; + } + /* The first segment previous segment chain that is in the result */ - if (parent.isDegenerate()) { - graph = actionDeleteWay(parent.id)(graph); - } - }); + }, { + key: "prevInResult", + value: function prevInResult() { + if (this._prevInResult !== undefined) return this._prevInResult; + if (!this.prev) this._prevInResult = null;else if (this.prev.isInResult()) this._prevInResult = this.prev;else this._prevInResult = this.prev.prevInResult(); + return this._prevInResult; + } + }, { + key: "beforeState", + value: function beforeState() { + if (this._beforeState !== undefined) return this._beforeState; + if (!this.prev) this._beforeState = { + rings: [], + windings: [], + multiPolys: [] + };else { + var seg = this.prev.consumedBy || this.prev; + this._beforeState = seg.afterState(); + } + return this._beforeState; + } + }, { + key: "afterState", + value: function afterState() { + if (this._afterState !== undefined) return this._afterState; + var beforeState = this.beforeState(); + this._afterState = { + rings: beforeState.rings.slice(0), + windings: beforeState.windings.slice(0), + multiPolys: [] + }; + var ringsAfter = this._afterState.rings; + var windingsAfter = this._afterState.windings; + var mpsAfter = this._afterState.multiPolys; // calculate ringsAfter, windingsAfter - graph.parentRelations(node) - .forEach(function(parent) { - parent = parent.removeMembersWithID(nodeId); - graph = graph.replace(parent); + for (var i = 0, iMax = this.rings.length; i < iMax; i++) { + var ring = this.rings[i]; + var winding = this.windings[i]; + var index = ringsAfter.indexOf(ring); - if (parent.isDegenerate()) { - graph = actionDeleteRelation(parent.id)(graph); - } - }); + if (index === -1) { + ringsAfter.push(ring); + windingsAfter.push(winding); + } else windingsAfter[index] += winding; + } // calcualte polysAfter - return graph.remove(node); - }; + var polysAfter = []; + var polysExclude = []; - return action; - } + for (var _i = 0, _iMax = ringsAfter.length; _i < _iMax; _i++) { + if (windingsAfter[_i] === 0) continue; // non-zero rule - // Connect the ways at the given nodes. - // - // First choose a node to be the survivor, with preference given - // to an existing (not new) node. - // - // Tags and relation memberships of of non-surviving nodes are merged - // to the survivor. - // - // This is the inverse of `iD.actionDisconnect`. - // - // Reference: - // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as - // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java - // - function actionConnect(nodeIDs) { - var action = function(graph) { - var survivor; - var node; - var parents; - var i, j; - - // Choose a survivor node, prefer an existing (not new) node - #4974 - for (i = 0; i < nodeIDs.length; i++) { - survivor = graph.entity(nodeIDs[i]); - if (survivor.version) { break; } // found one - } - - // Replace all non-surviving nodes with the survivor and merge tags. - for (i = 0; i < nodeIDs.length; i++) { - node = graph.entity(nodeIDs[i]); - if (node.id === survivor.id) { continue; } - - parents = graph.parentWays(node); - for (j = 0; j < parents.length; j++) { - graph = graph.replace(parents[j].replaceNode(node.id, survivor.id)); - } + var _ring = ringsAfter[_i]; + var poly = _ring.poly; + if (polysExclude.indexOf(poly) !== -1) continue; + if (_ring.isExterior) polysAfter.push(poly);else { + if (polysExclude.indexOf(poly) === -1) polysExclude.push(poly); - parents = graph.parentRelations(node); - for (j = 0; j < parents.length; j++) { - graph = graph.replace(parents[j].replaceMember(node, survivor)); - } + var _index = polysAfter.indexOf(_ring.poly); - survivor = survivor.mergeTags(node.tags); - graph = actionDeleteNode(node.id)(graph); + if (_index !== -1) polysAfter.splice(_index, 1); } + } // calculate multiPolysAfter - graph = graph.replace(survivor); - - // find and delete any degenerate ways created by connecting adjacent vertices - parents = graph.parentWays(survivor); - for (i = 0; i < parents.length; i++) { - if (parents[i].isDegenerate()) { - graph = actionDeleteWay(parents[i].id)(graph); - } - } - return graph; - }; + for (var _i2 = 0, _iMax2 = polysAfter.length; _i2 < _iMax2; _i2++) { + var mp = polysAfter[_i2].multiPoly; + if (mpsAfter.indexOf(mp) === -1) mpsAfter.push(mp); + } + return this._afterState; + } + /* Is this segment part of the final result? */ - action.disabled = function(graph) { - var seen = {}; - var restrictionIDs = []; - var survivor; - var node, way; - var relations, relation, role; - var i, j, k; + }, { + key: "isInResult", + value: function isInResult() { + // if we've been consumed, we're not in the result + if (this.consumedBy) return false; + if (this._isInResult !== undefined) return this._isInResult; + var mpsBefore = this.beforeState().multiPolys; + var mpsAfter = this.afterState().multiPolys; + + switch (operation.type) { + case 'union': + { + // UNION - included iff: + // * On one side of us there is 0 poly interiors AND + // * On the other side there is 1 or more. + var noBefores = mpsBefore.length === 0; + var noAfters = mpsAfter.length === 0; + this._isInResult = noBefores !== noAfters; + break; + } - // Choose a survivor node, prefer an existing (not new) node - #4974 - for (i = 0; i < nodeIDs.length; i++) { - survivor = graph.entity(nodeIDs[i]); - if (survivor.version) { break; } // found one - } + case 'intersection': + { + // INTERSECTION - included iff: + // * on one side of us all multipolys are rep. with poly interiors AND + // * on the other side of us, not all multipolys are repsented + // with poly interiors + var least; + var most; + + if (mpsBefore.length < mpsAfter.length) { + least = mpsBefore.length; + most = mpsAfter.length; + } else { + least = mpsAfter.length; + most = mpsBefore.length; + } - // 1. disable if the nodes being connected have conflicting relation roles - for (i = 0; i < nodeIDs.length; i++) { - node = graph.entity(nodeIDs[i]); - relations = graph.parentRelations(node); + this._isInResult = most === operation.numMultiPolys && least < most; + break; + } - for (j = 0; j < relations.length; j++) { - relation = relations[j]; - role = relation.memberById(node.id).role || ''; + case 'xor': + { + // XOR - included iff: + // * the difference between the number of multipolys represented + // with poly interiors on our two sides is an odd number + var diff = Math.abs(mpsBefore.length - mpsAfter.length); + this._isInResult = diff % 2 === 1; + break; + } - // if this node is a via node in a restriction, remember for later - if (relation.hasFromViaTo()) { - restrictionIDs.push(relation.id); - } + case 'difference': + { + // DIFFERENCE included iff: + // * on exactly one side, we have just the subject + var isJustSubject = function isJustSubject(mps) { + return mps.length === 1 && mps[0].isSubject; + }; - if (seen[relation.id] !== undefined && seen[relation.id] !== role) { - return 'relation'; - } else { - seen[relation.id] = role; - } - } - } + this._isInResult = isJustSubject(mpsBefore) !== isJustSubject(mpsAfter); + break; + } - // gather restrictions for parent ways - for (i = 0; i < nodeIDs.length; i++) { - node = graph.entity(nodeIDs[i]); + default: + throw new Error("Unrecognized operation type found ".concat(operation.type)); + } - var parents = graph.parentWays(node); - for (j = 0; j < parents.length; j++) { - var parent = parents[j]; - relations = graph.parentRelations(parent); + return this._isInResult; + } + }], [{ + key: "fromRing", + value: function fromRing(pt1, pt2, ring) { + var leftPt, rightPt, winding; // ordering the two points according to sweep line ordering - for (k = 0; k < relations.length; k++) { - relation = relations[k]; - if (relation.hasFromViaTo()) { - restrictionIDs.push(relation.id); - } - } - } - } + var cmpPts = SweepEvent.comparePoints(pt1, pt2); + if (cmpPts < 0) { + leftPt = pt1; + rightPt = pt2; + winding = 1; + } else if (cmpPts > 0) { + leftPt = pt2; + rightPt = pt1; + winding = -1; + } else throw new Error("Tried to create degenerate segment at [".concat(pt1.x, ", ").concat(pt1.y, "]")); - // test restrictions - restrictionIDs = utilArrayUniq(restrictionIDs); - for (i = 0; i < restrictionIDs.length; i++) { - relation = graph.entity(restrictionIDs[i]); - if (!relation.isComplete(graph)) { continue; } + var leftSE = new SweepEvent(leftPt, true); + var rightSE = new SweepEvent(rightPt, false); + return new Segment(leftSE, rightSE, [ring], [winding]); + } + }]); - var memberWays = relation.members - .filter(function(m) { return m.type === 'way'; }) - .map(function(m) { return graph.entity(m.id); }); + return Segment; + }(); - memberWays = utilArrayUniq(memberWays); - var f = relation.memberByRole('from'); - var t = relation.memberByRole('to'); - var isUturn = (f.id === t.id); + var RingIn = /*#__PURE__*/function () { + function RingIn(geomRing, poly, isExterior) { + _classCallCheck(this, RingIn); - // 2a. disable if connection would damage a restriction - // (a key node is a node at the junction of ways) - var nodes = { from: [], via: [], to: [], keyfrom: [], keyto: [] }; - for (j = 0; j < relation.members.length; j++) { - collectNodes(relation.members[j], nodes); - } + if (!Array.isArray(geomRing) || geomRing.length === 0) { + throw new Error('Input geometry is not a valid Polygon or MultiPolygon'); + } - nodes.keyfrom = utilArrayUniq(nodes.keyfrom.filter(hasDuplicates)); - nodes.keyto = utilArrayUniq(nodes.keyto.filter(hasDuplicates)); - - var filter = keyNodeFilter(nodes.keyfrom, nodes.keyto); - nodes.from = nodes.from.filter(filter); - nodes.via = nodes.via.filter(filter); - nodes.to = nodes.to.filter(filter); - - var connectFrom = false; - var connectVia = false; - var connectTo = false; - var connectKeyFrom = false; - var connectKeyTo = false; - - for (j = 0; j < nodeIDs.length; j++) { - var n = nodeIDs[j]; - if (nodes.from.indexOf(n) !== -1) { connectFrom = true; } - if (nodes.via.indexOf(n) !== -1) { connectVia = true; } - if (nodes.to.indexOf(n) !== -1) { connectTo = true; } - if (nodes.keyfrom.indexOf(n) !== -1) { connectKeyFrom = true; } - if (nodes.keyto.indexOf(n) !== -1) { connectKeyTo = true; } - } - if (connectFrom && connectTo && !isUturn) { return 'restriction'; } - if (connectFrom && connectVia) { return 'restriction'; } - if (connectTo && connectVia) { return 'restriction'; } - - // connecting to a key node - - // if both nodes are on a member way (i.e. part of the turn restriction), - // the connecting node must be adjacent to the key node. - if (connectKeyFrom || connectKeyTo) { - if (nodeIDs.length !== 2) { return 'restriction'; } - - var n0 = null; - var n1 = null; - for (j = 0; j < memberWays.length; j++) { - way = memberWays[j]; - if (way.contains(nodeIDs[0])) { n0 = nodeIDs[0]; } - if (way.contains(nodeIDs[1])) { n1 = nodeIDs[1]; } - } + this.poly = poly; + this.isExterior = isExterior; + this.segments = []; - if (n0 && n1) { // both nodes are part of the restriction - var ok = false; - for (j = 0; j < memberWays.length; j++) { - way = memberWays[j]; - if (way.areAdjacent(n0, n1)) { - ok = true; - break; - } - } - if (!ok) { - return 'restriction'; - } - } - } + if (typeof geomRing[0][0] !== 'number' || typeof geomRing[0][1] !== 'number') { + throw new Error('Input geometry is not a valid Polygon or MultiPolygon'); + } - // 2b. disable if nodes being connected will destroy a member way in a restriction - // (to test, make a copy and try actually connecting the nodes) - for (j = 0; j < memberWays.length; j++) { - way = memberWays[j].update({}); // make copy - for (k = 0; k < nodeIDs.length; k++) { - if (nodeIDs[k] === survivor.id) { continue; } + var firstPoint = rounder.round(geomRing[0][0], geomRing[0][1]); + this.bbox = { + ll: { + x: firstPoint.x, + y: firstPoint.y + }, + ur: { + x: firstPoint.x, + y: firstPoint.y + } + }; + var prevPoint = firstPoint; - if (way.areAdjacent(nodeIDs[k], survivor.id)) { - way = way.removeNode(nodeIDs[k]); - } else { - way = way.replaceNode(nodeIDs[k], survivor.id); - } - } - if (way.isDegenerate()) { - return 'restriction'; - } - } - } + for (var i = 1, iMax = geomRing.length; i < iMax; i++) { + if (typeof geomRing[i][0] !== 'number' || typeof geomRing[i][1] !== 'number') { + throw new Error('Input geometry is not a valid Polygon or MultiPolygon'); + } - return false; + var point = rounder.round(geomRing[i][0], geomRing[i][1]); // skip repeated points + if (point.x === prevPoint.x && point.y === prevPoint.y) continue; + this.segments.push(Segment.fromRing(prevPoint, point, this)); + if (point.x < this.bbox.ll.x) this.bbox.ll.x = point.x; + if (point.y < this.bbox.ll.y) this.bbox.ll.y = point.y; + if (point.x > this.bbox.ur.x) this.bbox.ur.x = point.x; + if (point.y > this.bbox.ur.y) this.bbox.ur.y = point.y; + prevPoint = point; + } // add segment from last to first if last is not the same as first - // if a key node appears multiple times (indexOf !== lastIndexOf) it's a FROM-VIA or TO-VIA junction - function hasDuplicates(n, i, arr) { - return arr.indexOf(n) !== arr.lastIndexOf(n); - } - function keyNodeFilter(froms, tos) { - return function(n) { - return froms.indexOf(n) === -1 && tos.indexOf(n) === -1; - }; - } + if (firstPoint.x !== prevPoint.x || firstPoint.y !== prevPoint.y) { + this.segments.push(Segment.fromRing(prevPoint, firstPoint, this)); + } + } - function collectNodes(member, collection) { - var entity = graph.hasEntity(member.id); - if (!entity) { return; } + _createClass(RingIn, [{ + key: "getSweepEvents", + value: function getSweepEvents() { + var sweepEvents = []; - var role = member.role || ''; - if (!collection[role]) { - collection[role] = []; - } + for (var i = 0, iMax = this.segments.length; i < iMax; i++) { + var segment = this.segments[i]; + sweepEvents.push(segment.leftSE); + sweepEvents.push(segment.rightSE); + } - if (member.type === 'node') { - collection[role].push(member.id); - if (role === 'via') { - collection.keyfrom.push(member.id); - collection.keyto.push(member.id); - } + return sweepEvents; + } + }]); - } else if (member.type === 'way') { - collection[role].push.apply(collection[role], entity.nodes); - if (role === 'from' || role === 'via') { - collection.keyfrom.push(entity.first()); - collection.keyfrom.push(entity.last()); - } - if (role === 'to' || role === 'via') { - collection.keyto.push(entity.first()); - collection.keyto.push(entity.last()); - } - } - } - }; + return RingIn; + }(); + var PolyIn = /*#__PURE__*/function () { + function PolyIn(geomPoly, multiPoly) { + _classCallCheck(this, PolyIn); - return action; - } + if (!Array.isArray(geomPoly)) { + throw new Error('Input geometry is not a valid Polygon or MultiPolygon'); + } - function actionCopyEntities(ids, fromGraph) { - var _copies = {}; + this.exteriorRing = new RingIn(geomPoly[0], this, true); // copy by value + this.bbox = { + ll: { + x: this.exteriorRing.bbox.ll.x, + y: this.exteriorRing.bbox.ll.y + }, + ur: { + x: this.exteriorRing.bbox.ur.x, + y: this.exteriorRing.bbox.ur.y + } + }; + this.interiorRings = []; - var action = function(graph) { - ids.forEach(function(id) { - fromGraph.entity(id).copy(fromGraph, _copies); - }); + for (var i = 1, iMax = geomPoly.length; i < iMax; i++) { + var ring = new RingIn(geomPoly[i], this, false); + if (ring.bbox.ll.x < this.bbox.ll.x) this.bbox.ll.x = ring.bbox.ll.x; + if (ring.bbox.ll.y < this.bbox.ll.y) this.bbox.ll.y = ring.bbox.ll.y; + if (ring.bbox.ur.x > this.bbox.ur.x) this.bbox.ur.x = ring.bbox.ur.x; + if (ring.bbox.ur.y > this.bbox.ur.y) this.bbox.ur.y = ring.bbox.ur.y; + this.interiorRings.push(ring); + } - for (var id in _copies) { - graph = graph.replace(_copies[id]); - } + this.multiPoly = multiPoly; + } - return graph; - }; + _createClass(PolyIn, [{ + key: "getSweepEvents", + value: function getSweepEvents() { + var sweepEvents = this.exteriorRing.getSweepEvents(); + for (var i = 0, iMax = this.interiorRings.length; i < iMax; i++) { + var ringSweepEvents = this.interiorRings[i].getSweepEvents(); - action.copies = function() { - return _copies; - }; + for (var j = 0, jMax = ringSweepEvents.length; j < jMax; j++) { + sweepEvents.push(ringSweepEvents[j]); + } + } + return sweepEvents; + } + }]); - return action; - } + return PolyIn; + }(); - function actionDeleteMember(relationId, memberIndex) { - return function(graph) { - var relation = graph.entity(relationId) - .removeMember(memberIndex); + var MultiPolyIn = /*#__PURE__*/function () { + function MultiPolyIn(geom, isSubject) { + _classCallCheck(this, MultiPolyIn); - graph = graph.replace(relation); + if (!Array.isArray(geom)) { + throw new Error('Input geometry is not a valid Polygon or MultiPolygon'); + } - if (relation.isDegenerate()) - { graph = actionDeleteRelation(relation.id)(graph); } + try { + // if the input looks like a polygon, convert it to a multipolygon + if (typeof geom[0][0][0] === 'number') geom = [geom]; + } catch (ex) {// The input is either malformed or has empty arrays. + // In either case, it will be handled later on. + } - return graph; + this.polys = []; + this.bbox = { + ll: { + x: Number.POSITIVE_INFINITY, + y: Number.POSITIVE_INFINITY + }, + ur: { + x: Number.NEGATIVE_INFINITY, + y: Number.NEGATIVE_INFINITY + } }; - } - function actionDiscardTags(difference, discardTags) { - discardTags = discardTags || {}; + for (var i = 0, iMax = geom.length; i < iMax; i++) { + var poly = new PolyIn(geom[i], this); + if (poly.bbox.ll.x < this.bbox.ll.x) this.bbox.ll.x = poly.bbox.ll.x; + if (poly.bbox.ll.y < this.bbox.ll.y) this.bbox.ll.y = poly.bbox.ll.y; + if (poly.bbox.ur.x > this.bbox.ur.x) this.bbox.ur.x = poly.bbox.ur.x; + if (poly.bbox.ur.y > this.bbox.ur.y) this.bbox.ur.y = poly.bbox.ur.y; + this.polys.push(poly); + } - return function (graph) { - difference.modified().forEach(checkTags); - difference.created().forEach(checkTags); - return graph; + this.isSubject = isSubject; + } - function checkTags(entity) { - var keys = Object.keys(entity.tags); - var didDiscard = false; - var tags = {}; + _createClass(MultiPolyIn, [{ + key: "getSweepEvents", + value: function getSweepEvents() { + var sweepEvents = []; - for (var i = 0; i < keys.length; i++) { - var k = keys[i]; - if (discardTags[k] || !entity.tags[k]) { - didDiscard = true; - } else { - tags[k] = entity.tags[k]; + for (var i = 0, iMax = this.polys.length; i < iMax; i++) { + var polySweepEvents = this.polys[i].getSweepEvents(); + + for (var j = 0, jMax = polySweepEvents.length; j < jMax; j++) { + sweepEvents.push(polySweepEvents[j]); } } - if (didDiscard) { - graph = graph.replace(entity.update({ tags: tags })); - } - } - }; - } + return sweepEvents; + } + }]); - // Disconect the ways at the given node. - // - // Optionally, disconnect only the given ways. - // - // For testing convenience, accepts an ID to assign to the (first) new node. - // Normally, this will be undefined and the way will automatically - // be assigned a new ID. - // - // This is the inverse of `iD.actionConnect`. - // - // Reference: - // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as - // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java - // - function actionDisconnect(nodeId, newNodeId) { - var wayIds; + return MultiPolyIn; + }(); + var RingOut = /*#__PURE__*/function () { + _createClass(RingOut, null, [{ + key: "factory", - var action = function(graph) { - var node = graph.entity(nodeId); - var connections = action.connections(graph); + /* Given the segments from the sweep line pass, compute & return a series + * of closed rings from all the segments marked to be part of the result */ + value: function factory(allSegments) { + var ringsOut = []; - connections.forEach(function(connection) { - var way = graph.entity(connection.wayID); - var newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags}); + for (var i = 0, iMax = allSegments.length; i < iMax; i++) { + var segment = allSegments[i]; + if (!segment.isInResult() || segment.ringOut) continue; + var prevEvent = null; + var event = segment.leftSE; + var nextEvent = segment.rightSE; + var events = [event]; + var startingPoint = event.point; + var intersectionLEs = []; + /* Walk the chain of linked events to form a closed ring */ - graph = graph.replace(newNode); - if (connection.index === 0 && way.isArea()) { - // replace shared node with shared node.. - graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id)); - } else if (way.isClosed() && connection.index === way.nodes.length - 1) { - // replace closing node with new new node.. - graph = graph.replace(way.unclose().addNode(newNode.id)); - } else { - // replace shared node with multiple new nodes.. - graph = graph.replace(way.updateNode(newNode.id, connection.index)); - } - }); + while (true) { + prevEvent = event; + event = nextEvent; + events.push(event); + /* Is the ring complete? */ - return graph; - }; + if (event.point === startingPoint) break; + while (true) { + var availableLEs = event.getAvailableLinkedEvents(); + /* Did we hit a dead end? This shouldn't happen. Indicates some earlier + * part of the algorithm malfunctioned... please file a bug report. */ - action.connections = function(graph) { - var candidates = []; - var keeping = false; - var parentWays = graph.parentWays(graph.entity(nodeId)); - var way, waynode; - for (var i = 0; i < parentWays.length; i++) { - way = parentWays[i]; - if (wayIds && wayIds.indexOf(way.id) === -1) { - keeping = true; - continue; - } - if (way.isArea() && (way.nodes[0] === nodeId)) { - candidates.push({ wayID: way.id, index: 0 }); - } else { - for (var j = 0; j < way.nodes.length; j++) { - waynode = way.nodes[j]; - if (waynode === nodeId) { - if (way.isClosed() && - parentWays.length > 1 && - wayIds && - wayIds.indexOf(way.id) !== -1 && - j === way.nodes.length - 1) { - continue; - } - candidates.push({ wayID: way.id, index: j }); - } - } + if (availableLEs.length === 0) { + var firstPt = events[0].point; + var lastPt = events[events.length - 1].point; + throw new Error("Unable to complete output ring starting at [".concat(firstPt.x, ",") + " ".concat(firstPt.y, "]. Last matching segment found ends at") + " [".concat(lastPt.x, ", ").concat(lastPt.y, "].")); } - } - - return keeping ? candidates : candidates.slice(1); - }; + /* Only one way to go, so cotinue on the path */ - action.disabled = function(graph) { - var connections = action.connections(graph); - if (connections.length === 0) - { return 'not_connected'; } - - var parentWays = graph.parentWays(graph.entity(nodeId)); - var seenRelationIds = {}; - var sharedRelation; - - parentWays.forEach(function(way) { - var relations = graph.parentRelations(way); - relations.forEach(function(relation) { - if (relation.id in seenRelationIds) { - if (wayIds) { - if (wayIds.indexOf(way.id) !== -1 || - wayIds.indexOf(seenRelationIds[relation.id]) !== -1) { - sharedRelation = relation; - } - } else { - sharedRelation = relation; - } - } else { - seenRelationIds[relation.id] = way.id; - } - }); - }); - - if (sharedRelation) - { return 'relation'; } - }; + if (availableLEs.length === 1) { + nextEvent = availableLEs[0].otherSE; + break; + } + /* We must have an intersection. Check for a completed loop */ - action.limitWays = function(val) { - if (!arguments.length) { return wayIds; } - wayIds = val; - return action; - }; + var indexLE = null; + for (var j = 0, jMax = intersectionLEs.length; j < jMax; j++) { + if (intersectionLEs[j].point === event.point) { + indexLE = j; + break; + } + } + /* Found a completed loop. Cut that off and make a ring */ - return action; - } - function actionExtract(entityID) { + if (indexLE !== null) { + var intersectionLE = intersectionLEs.splice(indexLE)[0]; + var ringEvents = events.splice(intersectionLE.index); + ringEvents.unshift(ringEvents[0].otherSE); + ringsOut.push(new RingOut(ringEvents.reverse())); + continue; + } + /* register the intersection */ - var extractedNodeID; - var action = function(graph) { - var entity = graph.entity(entityID); + intersectionLEs.push({ + index: events.length, + point: event.point + }); + /* Choose the left-most option to continue the walk */ - if (entity.type === 'node') { - return extractFromNode(entity, graph); + var comparator = event.getLeftmostComparator(prevEvent); + nextEvent = availableLEs.sort(comparator)[0].otherSE; + break; + } } - return extractFromWayOrRelation(entity, graph); - }; - - function extractFromNode(node, graph) { + ringsOut.push(new RingOut(events)); + } - extractedNodeID = node.id; + return ringsOut; + } + }]); - // Create a new node to replace the one we will detach - var replacement = osmNode({ loc: node.loc }); - graph = graph.replace(replacement); + function RingOut(events) { + _classCallCheck(this, RingOut); - // Process each way in turn, updating the graph as we go - graph = graph.parentWays(node) - .reduce(function(accGraph, parentWay) { - return accGraph.replace(parentWay.replaceNode(entityID, replacement.id)); - }, graph); + this.events = events; - // Process any relations too - return graph.parentRelations(node) - .reduce(function(accGraph, parentRel) { - return accGraph.replace(parentRel.replaceMember(node, replacement)); - }, graph); + for (var i = 0, iMax = events.length; i < iMax; i++) { + events[i].segment.ringOut = this; } - function extractFromWayOrRelation(entity, graph) { + this.poly = null; + } - var fromGeometry = entity.geometry(graph); + _createClass(RingOut, [{ + key: "getGeom", + value: function getGeom() { + // Remove superfluous points (ie extra points along a straight line), + var prevPt = this.events[0].point; + var points = [prevPt]; - var keysToCopyAndRetain = ['source', 'wheelchair']; - var keysToRetain = ['area']; - var buildingKeysToRetain = ['architect', 'building', 'height', 'layer']; + for (var i = 1, iMax = this.events.length - 1; i < iMax; i++) { + var _pt = this.events[i].point; + var _nextPt = this.events[i + 1].point; + if (compareVectorAngles(_pt, prevPt, _nextPt) === 0) continue; + points.push(_pt); + prevPt = _pt; + } // ring was all (within rounding error of angle calc) colinear points - var extractedLoc = d3_geoCentroid(entity.asGeoJSON(graph)); - if (!extractedLoc || !isFinite(extractedLoc[0]) || !isFinite(extractedLoc[1])) { - extractedLoc = entity.extent(graph).center(); - } - var isBuilding = entity.tags.building && entity.tags.building !== 'no'; + if (points.length === 1) return null; // check if the starting point is necessary - var entityTags = Object.assign({}, entity.tags); // shallow copy - var pointTags = {}; - for (var key in entityTags) { + var pt = points[0]; + var nextPt = points[1]; + if (compareVectorAngles(pt, prevPt, nextPt) === 0) points.shift(); + points.push(points[0]); + var step = this.isExteriorRing() ? 1 : -1; + var iStart = this.isExteriorRing() ? 0 : points.length - 1; + var iEnd = this.isExteriorRing() ? points.length : -1; + var orderedPoints = []; - if (entity.type === 'relation' && - key === 'type') { - continue; - } + for (var _i = iStart; _i != iEnd; _i += step) { + orderedPoints.push([points[_i].x, points[_i].y]); + } - if (keysToRetain.indexOf(key) !== -1) { - continue; - } + return orderedPoints; + } + }, { + key: "isExteriorRing", + value: function isExteriorRing() { + if (this._isExteriorRing === undefined) { + var enclosing = this.enclosingRing(); + this._isExteriorRing = enclosing ? !enclosing.isExteriorRing() : true; + } - if (isBuilding) { - // don't transfer building-related tags - if (buildingKeysToRetain.indexOf(key) !== -1 || - key.match(/^building:.{1,}/) || - key.match(/^roof:.{1,}/)) { continue; } - } + return this._isExteriorRing; + } + }, { + key: "enclosingRing", + value: function enclosingRing() { + if (this._enclosingRing === undefined) { + this._enclosingRing = this._calcEnclosingRing(); + } - // copy the tag from the entity to the point - pointTags[key] = entityTags[key]; + return this._enclosingRing; + } + /* Returns the ring that encloses this one, if any */ - // leave addresses and some other tags so they're on both features - if (keysToCopyAndRetain.indexOf(key) !== -1 || - key.match(/^addr:.{1,}/)) { - continue; - } + }, { + key: "_calcEnclosingRing", + value: function _calcEnclosingRing() { + // start with the ealier sweep line event so that the prevSeg + // chain doesn't lead us inside of a loop of ours + var leftMostEvt = this.events[0]; + + for (var i = 1, iMax = this.events.length; i < iMax; i++) { + var evt = this.events[i]; + if (SweepEvent.compare(leftMostEvt, evt) > 0) leftMostEvt = evt; + } - // remove the tag from the entity - delete entityTags[key]; - } + var prevSeg = leftMostEvt.segment.prevInResult(); + var prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null; - if (!isBuilding && fromGeometry === 'area') { - // ensure that areas keep area geometry - entityTags.area = 'yes'; - } + while (true) { + // no segment found, thus no ring can enclose us + if (!prevSeg) return null; // no segments below prev segment found, thus the ring of the prev + // segment must loop back around and enclose us - var replacement = osmNode({ loc: extractedLoc, tags: pointTags }); - graph = graph.replace(replacement); + if (!prevPrevSeg) return prevSeg.ringOut; // if the two segments are of different rings, the ring of the prev + // segment must either loop around us or the ring of the prev prev + // seg, which would make us and the ring of the prev peers - extractedNodeID = replacement.id; + if (prevPrevSeg.ringOut !== prevSeg.ringOut) { + if (prevPrevSeg.ringOut.enclosingRing() !== prevSeg.ringOut) { + return prevSeg.ringOut; + } else return prevSeg.ringOut.enclosingRing(); + } // two segments are from the same ring, so this was a penisula + // of that ring. iterate downward, keep searching - return graph.replace(entity.update({tags: entityTags})); + + prevSeg = prevPrevSeg.prevInResult(); + prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null; + } } + }]); - action.getExtractedNodeID = function() { - return extractedNodeID; - }; + return RingOut; + }(); - return action; - } + var PolyOut = /*#__PURE__*/function () { + function PolyOut(exteriorRing) { + _classCallCheck(this, PolyOut); - // Join ways at the end node they share. - // - // This is the inverse of `iD.actionSplit`. - // - // Reference: - // https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as - // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java - // - function actionJoin(ids) { + this.exteriorRing = exteriorRing; + exteriorRing.poly = this; + this.interiorRings = []; + } - function groupEntitiesByGeometry(graph) { - var entities = ids.map(function(id) { return graph.entity(id); }); - return Object.assign( - { line: [] }, - utilArrayGroupBy(entities, function(entity) { return entity.geometry(graph); }) - ); + _createClass(PolyOut, [{ + key: "addInterior", + value: function addInterior(ring) { + this.interiorRings.push(ring); + ring.poly = this; } + }, { + key: "getGeom", + value: function getGeom() { + var geom = [this.exteriorRing.getGeom()]; // exterior ring was all (within rounding error of angle calc) colinear points + if (geom[0] === null) return null; - var action = function(graph) { - var ways = ids.map(graph.entity, graph); - var survivorID = ways[0].id; + for (var i = 0, iMax = this.interiorRings.length; i < iMax; i++) { + var ringGeom = this.interiorRings[i].getGeom(); // interior ring was all (within rounding error of angle calc) colinear points - // if any of the ways are sided (e.g. coastline, cliff, kerb) - // sort them first so they establish the overall order - #6033 - ways.sort(function(a, b) { - var aSided = a.isSided(); - var bSided = b.isSided(); - return (aSided && !bSided) ? -1 - : (bSided && !aSided) ? 1 - : 0; - }); + if (ringGeom === null) continue; + geom.push(ringGeom); + } - // Prefer to keep an existing way. - for (var i = 0; i < ways.length; i++) { - if (!ways[i].isNew()) { - survivorID = ways[i].id; - break; - } - } + return geom; + } + }]); - var sequences = osmJoinWays(ways, graph); - var joined = sequences[0]; + return PolyOut; + }(); - // We might need to reverse some of these ways before joining them. #4688 - // `joined.actions` property will contain any actions we need to apply. - graph = sequences.actions.reduce(function(g, action) { return action(g); }, graph); + var MultiPolyOut = /*#__PURE__*/function () { + function MultiPolyOut(rings) { + _classCallCheck(this, MultiPolyOut); - var survivor = graph.entity(survivorID); - survivor = survivor.update({ nodes: joined.nodes.map(function(n) { return n.id; }) }); - graph = graph.replace(survivor); + this.rings = rings; + this.polys = this._composePolys(rings); + } - joined.forEach(function(way) { - if (way.id === survivorID) { return; } + _createClass(MultiPolyOut, [{ + key: "getGeom", + value: function getGeom() { + var geom = []; - graph.parentRelations(way).forEach(function(parent) { - graph = graph.replace(parent.replaceMember(way, survivor)); - }); + for (var i = 0, iMax = this.polys.length; i < iMax; i++) { + var polyGeom = this.polys[i].getGeom(); // exterior ring was all (within rounding error of angle calc) colinear points - survivor = survivor.mergeTags(way.tags); + if (polyGeom === null) continue; + geom.push(polyGeom); + } - graph = graph.replace(survivor); - graph = actionDeleteWay(way.id)(graph); - }); + return geom; + } + }, { + key: "_composePolys", + value: function _composePolys(rings) { + var polys = []; + + for (var i = 0, iMax = rings.length; i < iMax; i++) { + var ring = rings[i]; + if (ring.poly) continue; + if (ring.isExteriorRing()) polys.push(new PolyOut(ring));else { + var enclosingRing = ring.enclosingRing(); + if (!enclosingRing.poly) polys.push(new PolyOut(enclosingRing)); + enclosingRing.poly.addInterior(ring); + } + } - // Finds if the join created a single-member multipolygon, - // and if so turns it into a basic area instead - function checkForSimpleMultipolygon() { - if (!survivor.isClosed()) { return; } + return polys; + } + }]); - var multipolygons = graph.parentMultipolygons(survivor).filter(function(multipolygon) { - // find multipolygons where the survivor is the only member - return multipolygon.members.length === 1; - }); + return MultiPolyOut; + }(); + /** + * NOTE: We must be careful not to change any segments while + * they are in the SplayTree. AFAIK, there's no way to tell + * the tree to rebalance itself - thus before splitting + * a segment that's in the tree, we remove it from the tree, + * do the split, then re-insert it. (Even though splitting a + * segment *shouldn't* change its correct position in the + * sweep line tree, the reality is because of rounding errors, + * it sometimes does.) + */ - // skip if this is the single member of multiple multipolygons - if (multipolygons.length !== 1) { return; } - var multipolygon = multipolygons[0]; + var SweepLine = /*#__PURE__*/function () { + function SweepLine(queue) { + var comparator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Segment.compare; - for (var key in survivor.tags) { - if (multipolygon.tags[key] && - // don't collapse if tags cannot be cleanly merged - multipolygon.tags[key] !== survivor.tags[key]) { return; } - } + _classCallCheck(this, SweepLine); - survivor = survivor.mergeTags(multipolygon.tags); - graph = graph.replace(survivor); - graph = actionDeleteRelation(multipolygon.id, true /* allow untagged members */)(graph); + this.queue = queue; + this.tree = new Tree(comparator); + this.segments = []; + } - var tags = Object.assign({}, survivor.tags); - if (survivor.geometry(graph) !== 'area') { - // ensure the feature persists as an area - tags.area = 'yes'; - } - delete tags.type; // remove type=multipolygon - survivor = survivor.update({ tags: tags }); - graph = graph.replace(survivor); - } - checkForSimpleMultipolygon(); + _createClass(SweepLine, [{ + key: "process", + value: function process(event) { + var segment = event.segment; + var newEvents = []; // if we've already been consumed by another segment, + // clean up our body parts and get out - return graph; - }; + if (event.consumedBy) { + if (event.isLeft) this.queue.remove(event.otherSE);else this.tree.remove(segment); + return newEvents; + } - // Returns the number of nodes the resultant way is expected to have - action.resultingWayNodesLength = function(graph) { - return ids.reduce(function(count, id) { - return count + graph.entity(id).nodes.length; - }, 0) - ids.length - 1; - }; + var node = event.isLeft ? this.tree.insert(segment) : this.tree.find(segment); + if (!node) throw new Error("Unable to find segment #".concat(segment.id, " ") + "[".concat(segment.leftSE.point.x, ", ").concat(segment.leftSE.point.y, "] -> ") + "[".concat(segment.rightSE.point.x, ", ").concat(segment.rightSE.point.y, "] ") + 'in SweepLine tree. Please submit a bug report.'); + var prevNode = node; + var nextNode = node; + var prevSeg = undefined; + var nextSeg = undefined; // skip consumed segments still in tree + while (prevSeg === undefined) { + prevNode = this.tree.prev(prevNode); + if (prevNode === null) prevSeg = null;else if (prevNode.key.consumedBy === undefined) prevSeg = prevNode.key; + } // skip consumed segments still in tree - action.disabled = function(graph) { - var geometries = groupEntitiesByGeometry(graph); - if (ids.length < 2 || ids.length !== geometries.line.length) { - return 'not_eligible'; - } - var joined = osmJoinWays(ids.map(graph.entity, graph), graph); - if (joined.length > 1) { - return 'not_adjacent'; - } + while (nextSeg === undefined) { + nextNode = this.tree.next(nextNode); + if (nextNode === null) nextSeg = null;else if (nextNode.key.consumedBy === undefined) nextSeg = nextNode.key; + } - // Loop through all combinations of path-pairs - // to check potential intersections between all pairs - for (var i = 0; i < ids.length - 1; i++) { - for (var j = i + 1; j < ids.length; j++) { - var path1 = graph.childNodes(graph.entity(ids[i])) - .map(function(e) { return e.loc; }); - var path2 = graph.childNodes(graph.entity(ids[j])) - .map(function(e) { return e.loc; }); - var intersections = geoPathIntersections(path1, path2); + if (event.isLeft) { + // Check for intersections against the previous segment in the sweep line + var prevMySplitter = null; - // Check if intersections are just nodes lying on top of - // each other/the line, as opposed to crossing it - var common = utilArrayIntersection( - joined[0].nodes.map(function(n) { return n.loc.toString(); }), - intersections.map(function(n) { return n.toString(); }) - ); - if (common.length !== intersections.length) { - return 'paths_intersect'; - } - } - } + if (prevSeg) { + var prevInter = prevSeg.getIntersection(segment); - var nodeIds = joined[0].nodes.map(function(n) { return n.id; }).slice(1, -1); - var relation; - var tags = {}; - var conflicting = false; + if (prevInter !== null) { + if (!segment.isAnEndpoint(prevInter)) prevMySplitter = prevInter; - joined[0].forEach(function(way) { - var parents = graph.parentRelations(way); - parents.forEach(function(parent) { - if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; })) { - relation = parent; - } - }); + if (!prevSeg.isAnEndpoint(prevInter)) { + var newEventsFromSplit = this._splitSafely(prevSeg, prevInter); - for (var k in way.tags) { - if (!(k in tags)) { - tags[k] = way.tags[k]; - } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) { - conflicting = true; - } + for (var i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) { + newEvents.push(newEventsFromSplit[i]); + } } - }); - - if (relation) { - return 'restriction'; - } + } + } // Check for intersections against the next segment in the sweep line - if (conflicting) { - return 'conflicting_tags'; - } - }; + var nextMySplitter = null; - return action; - } + if (nextSeg) { + var nextInter = nextSeg.getIntersection(segment); - function actionMerge(ids) { + if (nextInter !== null) { + if (!segment.isAnEndpoint(nextInter)) nextMySplitter = nextInter; - function groupEntitiesByGeometry(graph) { - var entities = ids.map(function(id) { return graph.entity(id); }); - return Object.assign( - { point: [], area: [], line: [], relation: [] }, - utilArrayGroupBy(entities, function(entity) { return entity.geometry(graph); }) - ); - } + if (!nextSeg.isAnEndpoint(nextInter)) { + var _newEventsFromSplit = this._splitSafely(nextSeg, nextInter); + for (var _i = 0, _iMax = _newEventsFromSplit.length; _i < _iMax; _i++) { + newEvents.push(_newEventsFromSplit[_i]); + } + } + } + } // For simplicity, even if we find more than one intersection we only + // spilt on the 'earliest' (sweep-line style) of the intersections. + // The other intersection will be handled in a future process(). - var action = function(graph) { - var geometries = groupEntitiesByGeometry(graph); - var target = geometries.area[0] || geometries.line[0]; - var points = geometries.point; - points.forEach(function(point) { - target = target.mergeTags(point.tags); - graph = graph.replace(target); + if (prevMySplitter !== null || nextMySplitter !== null) { + var mySplitter = null; + if (prevMySplitter === null) mySplitter = nextMySplitter;else if (nextMySplitter === null) mySplitter = prevMySplitter;else { + var cmpSplitters = SweepEvent.comparePoints(prevMySplitter, nextMySplitter); + mySplitter = cmpSplitters <= 0 ? prevMySplitter : nextMySplitter; + } // Rounding errors can cause changes in ordering, + // so remove afected segments and right sweep events before splitting - graph.parentRelations(point).forEach(function(parent) { - graph = graph.replace(parent.replaceMember(point, target)); - }); + this.queue.remove(segment.rightSE); + newEvents.push(segment.rightSE); - var nodes = utilArrayUniq(graph.childNodes(target)); - var removeNode = point; + var _newEventsFromSplit2 = segment.split(mySplitter); - for (var i = 0; i < nodes.length; i++) { - var node = nodes[i]; - if (graph.parentWays(node).length > 1 || - graph.parentRelations(node).length || - node.hasInterestingTags()) { - continue; - } + for (var _i2 = 0, _iMax2 = _newEventsFromSplit2.length; _i2 < _iMax2; _i2++) { + newEvents.push(_newEventsFromSplit2[_i2]); + } + } - // Found an uninteresting child node on the target way. - // Move orig point into its place to preserve point's history. #3683 - graph = graph.replace(point.update({ tags: {}, loc: node.loc })); - target = target.replaceNode(node.id, point.id); - graph = graph.replace(target); - removeNode = node; - break; + if (newEvents.length > 0) { + // We found some intersections, so re-do the current event to + // make sure sweep line ordering is totally consistent for later + // use with the segment 'prev' pointers + this.tree.remove(segment); + newEvents.push(event); + } else { + // done with left event + this.segments.push(segment); + segment.prev = prevSeg; + } + } else { + // event.isRight + // since we're about to be removed from the sweep line, check for + // intersections between our previous and next segments + if (prevSeg && nextSeg) { + var inter = prevSeg.getIntersection(nextSeg); + + if (inter !== null) { + if (!prevSeg.isAnEndpoint(inter)) { + var _newEventsFromSplit3 = this._splitSafely(prevSeg, inter); + + for (var _i3 = 0, _iMax3 = _newEventsFromSplit3.length; _i3 < _iMax3; _i3++) { + newEvents.push(_newEventsFromSplit3[_i3]); + } } - graph = graph.remove(removeNode); - }); + if (!nextSeg.isAnEndpoint(inter)) { + var _newEventsFromSplit4 = this._splitSafely(nextSeg, inter); - if (target.tags.area === 'yes') { - var tags = Object.assign({}, target.tags); // shallow copy - delete tags.area; - if (osmTagSuggestingArea(tags)) { - // remove the `area` tag if area geometry is now implied - #3851 - target = target.update({ tags: tags }); - graph = graph.replace(target); + for (var _i4 = 0, _iMax4 = _newEventsFromSplit4.length; _i4 < _iMax4; _i4++) { + newEvents.push(_newEventsFromSplit4[_i4]); + } } + } } - return graph; - }; + this.tree.remove(segment); + } + return newEvents; + } + /* Safely split a segment that is currently in the datastructures + * IE - a segment other than the one that is currently being processed. */ - action.disabled = function(graph) { - var geometries = groupEntitiesByGeometry(graph); - if (geometries.point.length === 0 || - (geometries.area.length + geometries.line.length) !== 1 || - geometries.relation.length !== 0) { - return 'not_eligible'; - } - }; + }, { + key: "_splitSafely", + value: function _splitSafely(seg, pt) { + // Rounding errors can cause changes in ordering, + // so remove afected segments and right sweep events before splitting + // removeNode() doesn't work, so have re-find the seg + // https://github.com/w8r/splay-tree/pull/5 + this.tree.remove(seg); + var rightSE = seg.rightSE; + this.queue.remove(rightSE); + var newEvents = seg.split(pt); + newEvents.push(rightSE); // splitting can trigger consumption + if (seg.consumedBy === undefined) this.tree.insert(seg); + return newEvents; + } + }]); - return action; - } + return SweepLine; + }(); - // `actionMergeNodes` is just a combination of: - // - // 1. move all the nodes to a common location - // 2. `actionConnect` them + var POLYGON_CLIPPING_MAX_QUEUE_SIZE = typeof process !== 'undefined' && process.env.POLYGON_CLIPPING_MAX_QUEUE_SIZE || 1000000; + var POLYGON_CLIPPING_MAX_SWEEPLINE_SEGMENTS = typeof process !== 'undefined' && process.env.POLYGON_CLIPPING_MAX_SWEEPLINE_SEGMENTS || 1000000; - function actionMergeNodes(nodeIDs, loc) { + var Operation = /*#__PURE__*/function () { + function Operation() { + _classCallCheck(this, Operation); + } - // If there is a single "interesting" node, use that as the location. - // Otherwise return the average location of all the nodes. - function chooseLoc(graph) { - if (!nodeIDs.length) { return null; } - var sum = [0,0]; - var interestingCount = 0; - var interestingLoc; - - for (var i = 0; i < nodeIDs.length; i++) { - var node = graph.entity(nodeIDs[i]); - if (node.hasInterestingTags()) { - interestingLoc = (++interestingCount === 1) ? node.loc : null; - } - sum = geoVecAdd(sum, node.loc); - } + _createClass(Operation, [{ + key: "run", + value: function run(type, geom, moreGeoms) { + operation.type = type; + rounder.reset(); + /* Convert inputs to MultiPoly objects */ - return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length); - } + var multipolys = [new MultiPolyIn(geom, true)]; + for (var i = 0, iMax = moreGeoms.length; i < iMax; i++) { + multipolys.push(new MultiPolyIn(moreGeoms[i], false)); + } - var action = function(graph) { - if (nodeIDs.length < 2) { return graph; } - var toLoc = loc; - if (!toLoc) { - toLoc = chooseLoc(graph); - } + operation.numMultiPolys = multipolys.length; + /* BBox optimization for difference operation + * If the bbox of a multipolygon that's part of the clipping doesn't + * intersect the bbox of the subject at all, we can just drop that + * multiploygon. */ - for (var i = 0; i < nodeIDs.length; i++) { - var node = graph.entity(nodeIDs[i]); - if (node.loc !== toLoc) { - graph = graph.replace(node.move(toLoc)); - } - } + if (operation.type === 'difference') { + // in place removal + var subject = multipolys[0]; + var _i = 1; - return actionConnect(nodeIDs)(graph); - }; + while (_i < multipolys.length) { + if (getBboxOverlap(multipolys[_i].bbox, subject.bbox) !== null) _i++;else multipolys.splice(_i, 1); + } + } + /* BBox optimization for intersection operation + * If we can find any pair of multipolygons whose bbox does not overlap, + * then the result will be empty. */ - action.disabled = function(graph) { - if (nodeIDs.length < 2) { return 'not_eligible'; } + if (operation.type === 'intersection') { + // TODO: this is O(n^2) in number of polygons. By sorting the bboxes, + // it could be optimized to O(n * ln(n)) + for (var _i2 = 0, _iMax = multipolys.length; _i2 < _iMax; _i2++) { + var mpA = multipolys[_i2]; - for (var i = 0; i < nodeIDs.length; i++) { - var entity = graph.entity(nodeIDs[i]); - if (entity.type !== 'node') { return 'not_eligible'; } + for (var j = _i2 + 1, jMax = multipolys.length; j < jMax; j++) { + if (getBboxOverlap(mpA.bbox, multipolys[j].bbox) === null) return []; + } } + } + /* Put segment endpoints in a priority queue */ - return actionConnect(nodeIDs).disabled(graph); - }; - return action; - } + var queue = new Tree(SweepEvent.compare); - function osmChangeset() { - if (!(this instanceof osmChangeset)) { - return (new osmChangeset()).initialize(arguments); - } else if (arguments.length) { - this.initialize(arguments); - } - } + for (var _i3 = 0, _iMax2 = multipolys.length; _i3 < _iMax2; _i3++) { + var sweepEvents = multipolys[_i3].getSweepEvents(); + for (var _j = 0, _jMax = sweepEvents.length; _j < _jMax; _j++) { + queue.insert(sweepEvents[_j]); - osmEntity.changeset = osmChangeset; + if (queue.size > POLYGON_CLIPPING_MAX_QUEUE_SIZE) { + // prevents an infinite loop, an otherwise common manifestation of bugs + throw new Error('Infinite loop when putting segment endpoints in a priority queue ' + '(queue size too big). Please file a bug report.'); + } + } + } + /* Pass the sweep line over those endpoints */ - osmChangeset.prototype = Object.create(osmEntity.prototype); - Object.assign(osmChangeset.prototype, { + var sweepLine = new SweepLine(queue); + var prevQueueSize = queue.size; + var node = queue.pop(); - type: 'changeset', + while (node) { + var evt = node.key; + if (queue.size === prevQueueSize) { + // prevents an infinite loop, an otherwise common manifestation of bugs + var seg = evt.segment; + throw new Error("Unable to pop() ".concat(evt.isLeft ? 'left' : 'right', " SweepEvent ") + "[".concat(evt.point.x, ", ").concat(evt.point.y, "] from segment #").concat(seg.id, " ") + "[".concat(seg.leftSE.point.x, ", ").concat(seg.leftSE.point.y, "] -> ") + "[".concat(seg.rightSE.point.x, ", ").concat(seg.rightSE.point.y, "] from queue. ") + 'Please file a bug report.'); + } - extent: function() { - return new geoExtent(); - }, + if (queue.size > POLYGON_CLIPPING_MAX_QUEUE_SIZE) { + // prevents an infinite loop, an otherwise common manifestation of bugs + throw new Error('Infinite loop when passing sweep line over endpoints ' + '(queue size too big). Please file a bug report.'); + } + if (sweepLine.segments.length > POLYGON_CLIPPING_MAX_SWEEPLINE_SEGMENTS) { + // prevents an infinite loop, an otherwise common manifestation of bugs + throw new Error('Infinite loop when passing sweep line over endpoints ' + '(too many sweep line segments). Please file a bug report.'); + } - geometry: function() { - return 'changeset'; - }, + var newEvents = sweepLine.process(evt); + for (var _i4 = 0, _iMax3 = newEvents.length; _i4 < _iMax3; _i4++) { + var _evt = newEvents[_i4]; + if (_evt.consumedBy === undefined) queue.insert(_evt); + } - asJXON: function() { - return { - osm: { - changeset: { - tag: Object.keys(this.tags).map(function(k) { - return { '@k': k, '@v': this.tags[k] }; - }, this), - '@version': 0.6, - '@generator': 'iD' - } - } - }; - }, + prevQueueSize = queue.size; + node = queue.pop(); + } // free some memory we don't need anymore - // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange) - // XML. Returns a string. - osmChangeJXON: function(changes) { - var changeset_id = this.id; + rounder.reset(); + /* Collect and compile segments we're keeping into a multipolygon */ - function nest(x, order) { - var groups = {}; - for (var i = 0; i < x.length; i++) { - var tagName = Object.keys(x[i])[0]; - if (!groups[tagName]) { groups[tagName] = []; } - groups[tagName].push(x[i][tagName]); - } - var ordered = {}; - order.forEach(function(o) { - if (groups[o]) { ordered[o] = groups[o]; } - }); - return ordered; - } + var ringsOut = RingOut.factory(sweepLine.segments); + var result = new MultiPolyOut(ringsOut); + return result.getGeom(); + } + }]); + return Operation; + }(); // singleton available by import - // sort relations in a changeset by dependencies - function sort(changes) { - // find a referenced relation in the current changeset - function resolve(item) { - return relations.find(function(relation) { - return item.keyAttributes.type === 'relation' - && item.keyAttributes.ref === relation['@id']; - }); - } + var operation = new Operation(); - // a new item is an item that has not been already processed - function isNew(item) { - return !sorted[ item['@id'] ] && !processing.find(function(proc) { - return proc['@id'] === item['@id']; - }); - } + var union = function union(geom) { + for (var _len = arguments.length, moreGeoms = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + moreGeoms[_key - 1] = arguments[_key]; + } - var processing = []; - var sorted = {}; - var relations = changes.relation; + return operation.run('union', geom, moreGeoms); + }; - if (!relations) { return changes; } + var intersection$1 = function intersection(geom) { + for (var _len2 = arguments.length, moreGeoms = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + moreGeoms[_key2 - 1] = arguments[_key2]; + } - for (var i = 0; i < relations.length; i++) { - var relation = relations[i]; + return operation.run('intersection', geom, moreGeoms); + }; - // skip relation if already sorted - if (!sorted[relation['@id']]) { - processing.push(relation); - } + var xor = function xor(geom) { + for (var _len3 = arguments.length, moreGeoms = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + moreGeoms[_key3 - 1] = arguments[_key3]; + } - while (processing.length > 0) { - var next = processing[0], - deps = next.member.map(resolve).filter(Boolean).filter(isNew); - if (deps.length === 0) { - sorted[next['@id']] = next; - processing.shift(); - } else { - processing = deps.concat(processing); - } - } - } + return operation.run('xor', geom, moreGeoms); + }; - changes.relation = Object.values(sorted); - return changes; - } + var difference = function difference(subjectGeom) { + for (var _len4 = arguments.length, clippingGeoms = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { + clippingGeoms[_key4 - 1] = arguments[_key4]; + } - function rep(entity) { - return entity.asJXON(changeset_id); - } + return operation.run('difference', subjectGeom, clippingGeoms); + }; - return { - osmChange: { - '@version': 0.6, - '@generator': 'iD', - 'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])), - 'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']), - 'delete': Object.assign(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), { '@if-unused': true }) - } - }; - }, + var index = { + union: union, + intersection: intersection$1, + xor: xor, + difference: difference + }; + var geojsonPrecision = {exports: {}}; - asGeoJSON: function() { - return {}; + (function () { + function parse(t, coordinatePrecision, extrasPrecision) { + function point(p) { + return p.map(function (e, index) { + if (index < 2) { + return 1 * e.toFixed(coordinatePrecision); + } else { + return 1 * e.toFixed(extrasPrecision); + } + }); } - }); - - function osmNote() { - if (!(this instanceof osmNote)) { - return (new osmNote()).initialize(arguments); - } else if (arguments.length) { - this.initialize(arguments); + function multi(l) { + return l.map(point); } - } + function poly(p) { + return p.map(multi); + } - osmNote.id = function() { - return osmNote.id.next--; - }; - - - osmNote.id.next = -1; - + function multiPoly(m) { + return m.map(poly); + } - Object.assign(osmNote.prototype, { + function geometry(obj) { + if (!obj) { + return {}; + } - type: 'note', + switch (obj.type) { + case "Point": + obj.coordinates = point(obj.coordinates); + return obj; - initialize: function(sources) { - for (var i = 0; i < sources.length; ++i) { - var source = sources[i]; - for (var prop in source) { - if (Object.prototype.hasOwnProperty.call(source, prop)) { - if (source[prop] === undefined) { - delete this[prop]; - } else { - this[prop] = source[prop]; - } - } - } - } + case "LineString": + case "MultiPoint": + obj.coordinates = multi(obj.coordinates); + return obj; - if (!this.id) { - this.id = osmNote.id() + ''; // as string - } + case "Polygon": + case "MultiLineString": + obj.coordinates = poly(obj.coordinates); + return obj; - return this; - }, + case "MultiPolygon": + obj.coordinates = multiPoly(obj.coordinates); + return obj; - extent: function() { - return new geoExtent(this.loc); - }, + case "GeometryCollection": + obj.geometries = obj.geometries.map(geometry); + return obj; - update: function(attrs) { - return osmNote(this, attrs); // {v: 1 + (this.v || 0)} - }, + default: + return {}; + } + } - isNew: function() { - return this.id < 0; - }, + function feature(obj) { + obj.geometry = geometry(obj.geometry); + return obj; + } - move: function(loc) { - return this.update({ loc: loc }); + function featureCollection(f) { + f.features = f.features.map(feature); + return f; } - }); + function geometryCollection(g) { + g.geometries = g.geometries.map(geometry); + return g; + } - function osmRelation() { - if (!(this instanceof osmRelation)) { - return (new osmRelation()).initialize(arguments); - } else if (arguments.length) { - this.initialize(arguments); + if (!t) { + return t; } - } + switch (t.type) { + case "Feature": + return feature(t); - osmEntity.relation = osmRelation; + case "GeometryCollection": + return geometryCollection(t); - osmRelation.prototype = Object.create(osmEntity.prototype); + case "FeatureCollection": + return featureCollection(t); + case "Point": + case "LineString": + case "Polygon": + case "MultiPoint": + case "MultiPolygon": + case "MultiLineString": + return geometry(t); - osmRelation.creationOrder = function(a, b) { - var aId = parseInt(osmEntity.id.toOSM(a.id), 10); - var bId = parseInt(osmEntity.id.toOSM(b.id), 10); + default: + return t; + } + } - if (aId < 0 || bId < 0) { return aId - bId; } - return bId - aId; - }; + geojsonPrecision.exports = parse; + geojsonPrecision.exports.parse = parse; + })(); + var precision = geojsonPrecision.exports; - Object.assign(osmRelation.prototype, { - type: 'relation', - members: [], + var $$k = _export; + var fails$5 = fails$V; + var toObject$1 = toObject$i; + var toPrimitive = toPrimitive$3; + var FORCED$5 = fails$5(function () { + return new Date(NaN).toJSON() !== null + || Date.prototype.toJSON.call({ toISOString: function () { return 1; } }) !== 1; + }); - copy: function(resolver, copies) { - if (copies[this.id]) { return copies[this.id]; } + // `Date.prototype.toJSON` method + // https://tc39.es/ecma262/#sec-date.prototype.tojson + $$k({ target: 'Date', proto: true, forced: FORCED$5 }, { + // eslint-disable-next-line no-unused-vars -- required for `.length` + toJSON: function toJSON(key) { + var O = toObject$1(this); + var pv = toPrimitive(O, 'number'); + return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString(); + } + }); - var copy = osmEntity.prototype.copy.call(this, resolver, copies); + var $$j = _export; + var call = functionCall; - var members = this.members.map(function(member) { - return Object.assign({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id }); - }); + // `URL.prototype.toJSON` method + // https://url.spec.whatwg.org/#dom-url-tojson + $$j({ target: 'URL', proto: true, enumerable: true }, { + toJSON: function toJSON() { + return call(URL.prototype.toString, this); + } + }); - copy = copy.update({members: members}); - copies[this.id] = copy; + function isObject$3(obj) { + return _typeof(obj) === 'object' && obj !== null; + } - return copy; - }, + function forEach(obj, cb) { + if (Array.isArray(obj)) { + obj.forEach(cb); + } else if (isObject$3(obj)) { + Object.keys(obj).forEach(function (key) { + var val = obj[key]; + cb(val, key); + }); + } + } + function getTreeDepth(obj) { + var depth = 0; - extent: function(resolver, memo) { - return resolver.transient(this, 'extent', function() { - if (memo && memo[this.id]) { return geoExtent(); } - memo = memo || {}; - memo[this.id] = true; + if (Array.isArray(obj) || isObject$3(obj)) { + forEach(obj, function (val) { + if (Array.isArray(val) || isObject$3(val)) { + var tmpDepth = getTreeDepth(val); - var extent = geoExtent(); - for (var i = 0; i < this.members.length; i++) { - var member = resolver.hasEntity(this.members[i].id); - if (member) { - extent._extend(member.extent(resolver, memo)); - } - } - return extent; - }); - }, + if (tmpDepth > depth) { + depth = tmpDepth; + } + } + }); + return depth + 1; + } + return depth; + } - geometry: function(graph) { - return graph.transient(this, 'geometry', function() { - return this.isMultipolygon() ? 'area' : 'relation'; - }); - }, + function stringify(obj, options) { + options = options || {}; + var indent = JSON.stringify([1], null, get(options, 'indent', 2)).slice(2, -3); + var addMargin = get(options, 'margins', false); + var addArrayMargin = get(options, 'arrayMargins', false); + var addObjectMargin = get(options, 'objectMargins', false); + var maxLength = indent === '' ? Infinity : get(options, 'maxLength', 80); + var maxNesting = get(options, 'maxNesting', Infinity); + return function _stringify(obj, currentIndent, reserved) { + if (obj && typeof obj.toJSON === 'function') { + obj = obj.toJSON(); + } + var string = JSON.stringify(obj); - isDegenerate: function() { - return this.members.length === 0; - }, + if (string === undefined) { + return string; + } + var length = maxLength - currentIndent.length - reserved; + var treeDepth = getTreeDepth(obj); - // Return an array of members, each extended with an 'index' property whose value - // is the member index. - indexedMembers: function() { - var result = new Array(this.members.length); - for (var i = 0; i < this.members.length; i++) { - result[i] = Object.assign({}, this.members[i], {index: i}); - } - return result; - }, + if (treeDepth <= maxNesting && string.length <= length) { + var prettified = prettify(string, { + addMargin: addMargin, + addArrayMargin: addArrayMargin, + addObjectMargin: addObjectMargin + }); + if (prettified.length <= length) { + return prettified; + } + } - // Return the first member with the given role. A copy of the member object - // is returned, extended with an 'index' property whose value is the member index. - memberByRole: function(role) { - for (var i = 0; i < this.members.length; i++) { - if (this.members[i].role === role) { - return Object.assign({}, this.members[i], {index: i}); - } - } - }, + if (isObject$3(obj)) { + var nextIndent = currentIndent + indent; + var items = []; + var delimiters; - // Same as memberByRole, but returns all members with the given role - membersByRole: function(role) { - var result = []; - for (var i = 0; i < this.members.length; i++) { - if (this.members[i].role === role) { - result.push(Object.assign({}, this.members[i], {index: i})); - } - } - return result; - }, + var comma = function comma(array, index) { + return index === array.length - 1 ? 0 : 1; + }; - // Return the first member with the given id. A copy of the member object - // is returned, extended with an 'index' property whose value is the member index. - memberById: function(id) { - for (var i = 0; i < this.members.length; i++) { - if (this.members[i].id === id) { - return Object.assign({}, this.members[i], {index: i}); - } + if (Array.isArray(obj)) { + for (var index = 0; index < obj.length; index++) { + items.push(_stringify(obj[index], nextIndent, comma(obj, index)) || 'null'); } - }, + delimiters = '[]'; + } else { + Object.keys(obj).forEach(function (key, index, array) { + var keyPart = JSON.stringify(key) + ': '; - // Return the first member with the given id and role. A copy of the member object - // is returned, extended with an 'index' property whose value is the member index. - memberByIdAndRole: function(id, role) { - for (var i = 0; i < this.members.length; i++) { - if (this.members[i].id === id && this.members[i].role === role) { - return Object.assign({}, this.members[i], {index: i}); - } - } - }, - + var value = _stringify(obj[key], nextIndent, keyPart.length + comma(array, index)); - addMember: function(member, index) { - var members = this.members.slice(); - members.splice(index === undefined ? members.length : index, 0, member); - return this.update({members: members}); - }, + if (value !== undefined) { + items.push(keyPart + value); + } + }); + delimiters = '{}'; + } + if (items.length > 0) { + return [delimiters[0], indent + items.join(',\n' + nextIndent), delimiters[1]].join('\n' + currentIndent); + } + } - updateMember: function(member, index) { - var members = this.members.slice(); - members.splice(index, 1, Object.assign({}, members[index], member)); - return this.update({members: members}); - }, + return string; + }(obj, '', 0); + } // Note: This regex matches even invalid JSON strings, but since we’re + // working on the output of `JSON.stringify` we know that only valid strings + // are present (unless the user supplied a weird `options.indent` but in + // that case we don’t care since the output would be invalid anyway). - removeMember: function(index) { - var members = this.members.slice(); - members.splice(index, 1); - return this.update({members: members}); - }, + var stringOrChar = /("(?:[^\\"]|\\.)*")|[:,\][}{]/g; + function prettify(string, options) { + options = options || {}; + var tokens = { + '{': '{', + '}': '}', + '[': '[', + ']': ']', + ',': ', ', + ':': ': ' + }; - removeMembersWithID: function(id) { - var members = this.members.filter(function(m) { return m.id !== id; }); - return this.update({members: members}); - }, + if (options.addMargin || options.addObjectMargin) { + tokens['{'] = '{ '; + tokens['}'] = ' }'; + } - moveMember: function(fromIndex, toIndex) { - var members = this.members.slice(); - members.splice(toIndex, 0, members.splice(fromIndex, 1)[0]); - return this.update({members: members}); - }, + if (options.addMargin || options.addArrayMargin) { + tokens['['] = '[ '; + tokens[']'] = ' ]'; + } + return string.replace(stringOrChar, function (match, string) { + return string ? match : tokens[match]; + }); + } - // Wherever a member appears with id `needle.id`, replace it with a member - // with id `replacement.id`, type `replacement.type`, and the original role, - // By default, adding a duplicate member (by id and role) is prevented. - // Return an updated relation. - replaceMember: function(needle, replacement, keepDuplicates) { - if (!this.memberById(needle.id)) { return this; } + function get(options, name, defaultValue) { + return name in options ? options[name] : defaultValue; + } - var members = []; + var jsonStringifyPrettyCompact = stringify; - for (var i = 0; i < this.members.length; i++) { - var member = this.members[i]; - if (member.id !== needle.id) { - members.push(member); - } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) { - members.push({ id: replacement.id, type: replacement.type, role: member.role }); - } - } + var _default = /*#__PURE__*/function () { + // constructor + // + // `fc` Optional FeatureCollection of known features + // + // Optionally pass a GeoJSON FeatureCollection of known features which we can refer to later. + // Each feature must have a filename-like `id`, for example: `something.geojson` + // + // { + // "type": "FeatureCollection" + // "features": [ + // { + // "type": "Feature", + // "id": "philly_metro.geojson", + // "properties": { … }, + // "geometry": { … } + // } + // ] + // } + function _default(fc) { + var _this = this; - return this.update({ members: members }); - }, + _classCallCheck$1(this, _default); + // The _cache retains resolved features, so if you ask for the same thing multiple times + // we don't repeat the expensive resolving/clipping operations. + // + // Each feature has a stable identifier that is used as the cache key. + // The identifiers look like: + // - for point locations, the stringified point: e.g. '[8.67039,49.41882]' + // - for geojson locations, the geojson id: e.g. 'de-hamburg.geojson' + // - for countrycoder locations, feature.id property: e.g. 'Q2' (countrycoder uses Wikidata identifiers) + // - for aggregated locationSets, +[include]-[exclude]: e.g '+[Q2]-[Q18,Q27611]' + this._cache = {}; // When strict mode = true, throw on invalid locations or locationSets. + // When strict mode = false, return `null` for invalid locations or locationSets. - asJXON: function(changeset_id) { - var r = { - relation: { - '@id': this.osmId(), - '@version': this.version || 0, - member: this.members.map(function(member) { - return { - keyAttributes: { - type: member.type, - role: member.role, - ref: osmEntity.id.toOSM(member.id) - } - }; - }, this), - tag: Object.keys(this.tags).map(function(k) { - return { keyAttributes: { k: k, v: this.tags[k] } }; - }, this) - } - }; - if (changeset_id) { - r.relation['@changeset'] = changeset_id; - } - return r; - }, + this._strict = true; // process input FeatureCollection + if (fc && fc.type === 'FeatureCollection' && Array.isArray(fc.features)) { + fc.features.forEach(function (feature) { + feature.properties = feature.properties || {}; + var props = feature.properties; // Get `id` from either `id` or `properties` - asGeoJSON: function(resolver) { - return resolver.transient(this, 'GeoJSON', function () { - if (this.isMultipolygon()) { - return { - type: 'MultiPolygon', - coordinates: this.multipolygon(resolver) - }; - } else { - return { - type: 'FeatureCollection', - properties: this.tags, - features: this.members.map(function (member) { - return Object.assign({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver)); - }) - }; - } - }); - }, + var id = feature.id || props.id; + if (!id || !/^\S+\.geojson$/i.test(id)) return; // Ensure `id` exists and is lowercase + id = id.toLowerCase(); + feature.id = id; + props.id = id; // Ensure `area` property exists - area: function(resolver) { - return resolver.transient(this, 'area', function() { - return d3_geoArea(this.asGeoJSON(resolver)); - }); - }, + if (!props.area) { + var area = geojsonArea.geometry(feature.geometry) / 1e6; // m² to km² + props.area = Number(area.toFixed(2)); + } - isMultipolygon: function() { - return this.tags.type === 'multipolygon'; - }, + _this._cache[id] = feature; + }); + } // Replace CountryCoder world geometry to be a polygon covering the world. - isComplete: function(resolver) { - for (var i = 0; i < this.members.length; i++) { - if (!resolver.hasEntity(this.members[i].id)) { - return false; - } - } - return true; - }, + var world = _cloneDeep(feature$1('Q2')); + world.geometry = { + type: 'Polygon', + coordinates: [[[-180, -90], [180, -90], [180, 90], [-180, 90], [-180, -90]]] + }; + world.id = 'Q2'; + world.properties.id = 'Q2'; + world.properties.area = geojsonArea.geometry(world.geometry) / 1e6; // m² to km² - hasFromViaTo: function() { - return ( - this.members.some(function(m) { return m.role === 'from'; }) && - this.members.some(function(m) { return m.role === 'via'; }) && - this.members.some(function(m) { return m.role === 'to'; }) - ); - }, + this._cache.Q2 = world; + } // validateLocation + // `location` The location to validate + // + // Pass a `location` value to validate + // + // Returns a result like: + // { + // type: 'point', 'geojson', or 'countrycoder' + // location: the queried location + // id: the stable identifier for the feature + // } + // or `null` if the location is invalid + // - isRestriction: function() { - return !!(this.tags.type && this.tags.type.match(/^restriction:?/)); - }, + _createClass$1(_default, [{ + key: "validateLocation", + value: function validateLocation(location) { + if (Array.isArray(location) && (location.length === 2 || location.length === 3)) { + // [lon, lat] or [lon, lat, radius] point? + var lon = location[0]; + var lat = location[1]; + var radius = location[2]; + if (Number.isFinite(lon) && lon >= -180 && lon <= 180 && Number.isFinite(lat) && lat >= -90 && lat <= 90 && (location.length === 2 || Number.isFinite(radius) && radius > 0)) { + var id = '[' + location.toString() + ']'; + return { + type: 'point', + location: location, + id: id + }; + } + } else if (typeof location === 'string' && /^\S+\.geojson$/i.test(location)) { + // a .geojson filename? + var _id = location.toLowerCase(); - isValidRestriction: function() { - if (!this.isRestriction()) { return false; } + if (this._cache[_id]) { + return { + type: 'geojson', + location: location, + id: _id + }; + } + } else if (typeof location === 'string' || typeof location === 'number') { + // a country-coder value? + var feature = feature$1(location); - var froms = this.members.filter(function(m) { return m.role === 'from'; }); - var vias = this.members.filter(function(m) { return m.role === 'via'; }); - var tos = this.members.filter(function(m) { return m.role === 'to'; }); + if (feature) { + // Use wikidata QID as the identifier, since that seems to be the one + // property that everything in CountryCoder is guaranteed to have. + var _id2 = feature.properties.wikidata; + return { + type: 'countrycoder', + location: location, + id: _id2 + }; + } + } - if (froms.length !== 1 && this.tags.restriction !== 'no_entry') { return false; } - if (froms.some(function(m) { return m.type !== 'way'; })) { return false; } + if (this._strict) { + throw new Error("validateLocation: Invalid location: \"".concat(location, "\".")); + } else { + return null; + } + } // resolveLocation + // `location` The location to resolve + // + // Pass a `location` value to resolve + // + // Returns a result like: + // { + // type: 'point', 'geojson', or 'countrycoder' + // location: the queried location + // id: a stable identifier for the feature + // feature: the resolved GeoJSON feature + // } + // or `null` if the location is invalid + // - if (tos.length !== 1 && this.tags.restriction !== 'no_exit') { return false; } - if (tos.some(function(m) { return m.type !== 'way'; })) { return false; } + }, { + key: "resolveLocation", + value: function resolveLocation(location) { + var valid = this.validateLocation(location); + if (!valid) return null; + var id = valid.id; // Return a result from cache if we can + + if (this._cache[id]) { + return Object.assign(valid, { + feature: this._cache[id] + }); + } // A [lon,lat] coordinate pair? - if (vias.length === 0) { return false; } - if (vias.length > 1 && vias.some(function(m) { return m.type !== 'way'; })) { return false; } - return true; - }, + if (valid.type === 'point') { + var lon = location[0]; + var lat = location[1]; + var radius = location[2] || 25; // km + var EDGES = 10; + var PRECISION = 3; + var area = Math.PI * radius * radius; + var feature = this._cache[id] = precision({ + type: 'Feature', + id: id, + properties: { + id: id, + area: Number(area.toFixed(2)) + }, + geometry: circleToPolygon([lon, lat], radius * 1000, EDGES) // km to m + + }, PRECISION); + return Object.assign(valid, { + feature: feature + }); // A .geojson filename? + } else if (valid.type === 'geojson') ; else if (valid.type === 'countrycoder') { + var _feature = _cloneDeep(feature$1(id)); + + var props = _feature.properties; // -> This block of code is weird and requires some explanation. <- + // CountryCoder includes higher level features which are made up of members. + // These features don't have their own geometry, but CountryCoder provides an + // `aggregateFeature` method to combine these members into a MultiPolygon. + // In the past, Turf/JSTS/martinez could not handle the aggregated features, + // so we'd iteratively union them all together. (this was slow) + // But now mfogel/polygon-clipping handles these MultiPolygons like a boss. + // This approach also has the benefit of removing all the internal boaders and + // simplifying the regional polygons a lot. + + if (Array.isArray(props.members)) { + var aggregate = aggregateFeature(id); + aggregate.geometry.coordinates = _clip([aggregate], 'UNION').geometry.coordinates; + _feature.geometry = aggregate.geometry; + } // Ensure `area` property exists + + + if (!props.area) { + var _area = geojsonArea.geometry(_feature.geometry) / 1e6; // m² to km² + + + props.area = Number(_area.toFixed(2)); + } // Ensure `id` property exists + + + _feature.id = id; + props.id = id; + this._cache[id] = _feature; + return Object.assign(valid, { + feature: _feature + }); + } - // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm], - // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings. + if (this._strict) { + throw new Error("resolveLocation: Couldn't resolve location \"".concat(location, "\".")); + } else { + return null; + } + } // validateLocationSet + // `locationSet` the locationSet to validate // - // This corresponds to the structure needed for rendering a multipolygon path using a - // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry. + // Pass a locationSet Object to validate like: + // { + // include: [ Array of locations ], + // exclude: [ Array of locations ] + // } // - // In the case of invalid geometries, this function will still return a result which - // includes the nodes of all way members, but some Nds may be unclosed and some inner - // rings not matched with the intended outer ring. + // Returns a result like: + // { + // type: 'locationset' + // locationSet: the queried locationSet + // id: the stable identifier for the feature + // } + // or `null` if the locationSet is invalid // - multipolygon: function(resolver) { - var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); }); - var inners = this.members.filter(function(m) { return 'inner' === m.role; }); - - outers = osmJoinWays(outers, resolver); - inners = osmJoinWays(inners, resolver); - - var sequenceToLineString = function(sequence) { - if (sequence.nodes.length > 2 && - sequence.nodes[0] !== sequence.nodes[sequence.nodes.length - 1]) { - // close unclosed parts to ensure correct area rendering - #2945 - sequence.nodes.push(sequence.nodes[0]); - } - return sequence.nodes.map(function(node) { return node.loc; }); - }; - - outers = outers.map(sequenceToLineString); - inners = inners.map(sequenceToLineString); - var result = outers.map(function(o) { - // Heuristic for detecting counterclockwise winding order. Assumes - // that OpenStreetMap polygons are not hemisphere-spanning. - return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o]; - }); + }, { + key: "validateLocationSet", + value: function validateLocationSet(locationSet) { + locationSet = locationSet || {}; + var validator = this.validateLocation.bind(this); + var include = (locationSet.include || []).map(validator).filter(Boolean); + var exclude = (locationSet.exclude || []).map(validator).filter(Boolean); + + if (!include.length) { + if (this._strict) { + throw new Error("validateLocationSet: LocationSet includes nothing."); + } else { + // non-strict mode, replace an empty locationSet with one that includes "the world" + locationSet.include = ['Q2']; + include = [{ + type: 'countrycoder', + location: 'Q2', + id: 'Q2' + }]; + } + } // Generate stable identifier + + + include.sort(_sortLocations); + var id = '+[' + include.map(function (d) { + return d.id; + }).join(',') + ']'; + + if (exclude.length) { + exclude.sort(_sortLocations); + id += '-[' + exclude.map(function (d) { + return d.id; + }).join(',') + ']'; + } - function findOuter(inner) { - var o, outer; + return { + type: 'locationset', + locationSet: locationSet, + id: id + }; + } // resolveLocationSet + // `locationSet` the locationSet to resolve + // + // Pass a locationSet Object to validate like: + // { + // include: [ Array of locations ], + // exclude: [ Array of locations ] + // } + // + // Returns a result like: + // { + // type: 'locationset' + // locationSet: the queried locationSet + // id: the stable identifier for the feature + // feature: the resolved GeoJSON feature + // } + // or `null` if the locationSet is invalid + // - for (o = 0; o < outers.length; o++) { - outer = outers[o]; - if (geoPolygonContainsPolygon(outer, inner)) - { return o; } - } + }, { + key: "resolveLocationSet", + value: function resolveLocationSet(locationSet) { + locationSet = locationSet || {}; + var valid = this.validateLocationSet(locationSet); + if (!valid) return null; + var id = valid.id; // Return a result from cache if we can + + if (this._cache[id]) { + return Object.assign(valid, { + feature: this._cache[id] + }); + } - for (o = 0; o < outers.length; o++) { - outer = outers[o]; - if (geoPolygonIntersectsPolygon(outer, inner, false)) - { return o; } - } - } + var resolver = this.resolveLocation.bind(this); + var includes = (locationSet.include || []).map(resolver).filter(Boolean); + var excludes = (locationSet.exclude || []).map(resolver).filter(Boolean); // Return quickly if it's a single included location.. - for (var i = 0; i < inners.length; i++) { - var inner = inners[i]; + if (includes.length === 1 && excludes.length === 0) { + return Object.assign(valid, { + feature: includes[0].feature + }); + } // Calculate unions - if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) { - inner = inner.reverse(); - } - var o = findOuter(inners[i]); - if (o !== undefined) { - result[o].push(inners[i]); - } else { - result.push([inners[i]]); // Invalid geometry - } - } + var includeGeoJSON = _clip(includes.map(function (d) { + return d.feature; + }), 'UNION'); - return result; - } - }); + var excludeGeoJSON = _clip(excludes.map(function (d) { + return d.feature; + }), 'UNION'); // Calculate difference, update `area` and return result - var QAItem = function QAItem(loc, service, itemType, id, props) { - // Store required properties - this.loc = loc; - this.service = service.title; - this.itemType = itemType; - // All issues must have an ID for selection, use generic if none specified - this.id = id ? id : ("" + (QAItem.id())); + var resultGeoJSON = excludeGeoJSON ? _clip([includeGeoJSON, excludeGeoJSON], 'DIFFERENCE') : includeGeoJSON; + var area = geojsonArea.geometry(resultGeoJSON.geometry) / 1e6; // m² to km² - this.update(props); + resultGeoJSON.id = id; + resultGeoJSON.properties = { + id: id, + area: Number(area.toFixed(2)) + }; + this._cache[id] = resultGeoJSON; + return Object.assign(valid, { + feature: resultGeoJSON + }); + } // strict + // - // Some QA services have marker icons to differentiate issues - if (service && typeof service.getIcon === 'function') { - this.icon = service.getIcon(itemType); - } + }, { + key: "strict", + value: function strict(val) { + if (val === undefined) { + // get + return this._strict; + } else { + // set + this._strict = val; + return this; + } + } // cache + // convenience method to access the internal cache - return this; - }; + }, { + key: "cache", + value: function cache() { + return this._cache; + } // stringify + // convenience method to prettyStringify the given object - QAItem.prototype.update = function update (props) { - var this$1 = this; + }, { + key: "stringify", + value: function stringify(obj, options) { + return jsonStringifyPrettyCompact(obj, options); + } + }]); + + return _default; + }(); // Wrap the mfogel/polygon-clipping library and return a GeoJSON feature. + + function _clip(features, which) { + if (!Array.isArray(features) || !features.length) return null; + var fn = { + UNION: index.union, + DIFFERENCE: index.difference + }[which]; + var args = features.map(function (feature) { + return feature.geometry.coordinates; + }); + var coords = fn.apply(null, args); + return { + type: 'Feature', + properties: {}, + geometry: { + type: whichType(coords), + coordinates: coords + } + }; // is this a Polygon or a MultiPolygon? - // You can't override this inital information - var ref = this; - var loc = ref.loc; - var service = ref.service; - var itemType = ref.itemType; - var id = ref.id; + function whichType(coords) { + var a = Array.isArray(coords); + var b = a && Array.isArray(coords[0]); + var c = b && Array.isArray(coords[0][0]); + var d = c && Array.isArray(coords[0][0][0]); + return d ? 'MultiPolygon' : 'Polygon'; + } + } - Object.keys(props).forEach(function (prop) { return this$1[prop] = props[prop]; }); + function _cloneDeep(obj) { + return JSON.parse(JSON.stringify(obj)); + } // Sorting the location lists is ok because they end up unioned together. + // This sorting makes it possible to generate a deterministic id. - this.loc = loc; - this.service = service; - this.itemType = itemType; - this.id = id; - return this; - }; + function _sortLocations(a, b) { + var rank = { + countrycoder: 1, + geojson: 2, + point: 3 + }; + var aRank = rank[a.type]; + var bRank = rank[b.type]; + return aRank > bRank ? 1 : aRank < bRank ? -1 : a.id.localeCompare(b.id); + } - // Generic handling for newly created QAItems - QAItem.id = function id () { - return this.nextId--; - }; - QAItem.nextId = -1; + var $$i = _export; - // Split a way at the given node. - // - // Optionally, split only the given ways, if multiple ways share - // the given node. - // - // This is the inverse of `iD.actionJoin`. - // - // For testing convenience, accepts an ID to assign to the new way. - // Normally, this will be undefined and the way will automatically - // be assigned a new ID. - // - // Reference: - // https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as - // - function actionSplit(nodeId, newWayIds) { - var _wayIDs; + // `Number.MAX_SAFE_INTEGER` constant + // https://tc39.es/ecma262/#sec-number.max_safe_integer + $$i({ target: 'Number', stat: true }, { + MAX_SAFE_INTEGER: 0x1FFFFFFFFFFFFF + }); - // The IDs of the ways actually created by running this action - var createdWayIDs = []; + var aesJs = {exports: {}}; - // If the way is closed, we need to search for a partner node - // to split the way at. - // - // The following looks for a node that is both far away from - // the initial node in terms of way segment length and nearby - // in terms of beeline-distance. This assures that areas get - // split on the most "natural" points (independent of the number - // of nodes). - // For example: bone-shaped areas get split across their waist - // line, circles across the diameter. - function splitArea(nodes, idxA, graph) { - var lengths = new Array(nodes.length); - var length; - var i; - var best = 0; - var idxB; + (function (module, exports) { + (function (root) { - function wrap(index) { - return utilWrap(index, nodes.length); - } + function checkInt(value) { + return parseInt(value) === value; + } - function dist(nA, nB) { - var locA = graph.entity(nA).loc; - var locB = graph.entity(nB).loc; - var epsilon = 1e-6; - return (locA && locB) ? geoSphericalDistance(locA, locB) : epsilon; - } + function checkInts(arrayish) { + if (!checkInt(arrayish.length)) { + return false; + } - // calculate lengths - length = 0; - for (i = wrap(idxA + 1); i !== idxA; i = wrap(i + 1)) { - length += dist(nodes[i], nodes[wrap(i - 1)]); - lengths[i] = length; + for (var i = 0; i < arrayish.length; i++) { + if (!checkInt(arrayish[i]) || arrayish[i] < 0 || arrayish[i] > 255) { + return false; } + } - length = 0; - for (i = wrap(idxA - 1); i !== idxA; i = wrap(i - 1)) { - length += dist(nodes[i], nodes[wrap(i + 1)]); - if (length < lengths[i]) { - lengths[i] = length; - } - } + return true; + } - // determine best opposite node to split - for (i = 0; i < nodes.length; i++) { - var cost = lengths[i] / dist(nodes[idxA], nodes[i]); - if (cost > best) { - idxB = i; - best = cost; - } + function coerceArray(arg, copy) { + // ArrayBuffer view + if (arg.buffer && arg.name === 'Uint8Array') { + if (copy) { + if (arg.slice) { + arg = arg.slice(); + } else { + arg = Array.prototype.slice.call(arg); + } } - return idxB; - } + return arg; + } // It's an array; check it is a valid representation of a byte - function split(graph, wayA, newWayId) { - var wayB = osmWay({ id: newWayId, tags: wayA.tags }); // `wayB` is the NEW way - var origNodes = wayA.nodes.slice(); - var nodesA; - var nodesB; - var isArea = wayA.isArea(); - var isOuter = osmIsOldMultipolygonOuterMember(wayA, graph); + if (Array.isArray(arg)) { + if (!checkInts(arg)) { + throw new Error('Array contains invalid value: ' + arg); + } - if (wayA.isClosed()) { - var nodes = wayA.nodes.slice(0, -1); - var idxA = nodes.indexOf(nodeId); - var idxB = splitArea(nodes, idxA, graph); + return new Uint8Array(arg); + } // Something else, but behaves like an array (maybe a Buffer? Arguments?) - if (idxB < idxA) { - nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1)); - nodesB = nodes.slice(idxB, idxA + 1); - } else { - nodesA = nodes.slice(idxA, idxB + 1); - nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1)); - } - } else { - var idx = wayA.nodes.indexOf(nodeId, 1); - nodesA = wayA.nodes.slice(0, idx + 1); - nodesB = wayA.nodes.slice(idx); - } - - wayA = wayA.update({ nodes: nodesA }); - wayB = wayB.update({ nodes: nodesB }); - - graph = graph.replace(wayA); - graph = graph.replace(wayB); - - graph.parentRelations(wayA).forEach(function(relation) { - var member; - - // Turn restrictions - make sure: - // 1. Splitting a FROM/TO way - only `wayA` OR `wayB` remains in relation - // (whichever one is connected to the VIA node/ways) - // 2. Splitting a VIA way - `wayB` remains in relation as a VIA way - if (relation.hasFromViaTo()) { - var f = relation.memberByRole('from'); - var v = relation.membersByRole('via'); - var t = relation.memberByRole('to'); - var i; - - // 1. split a FROM/TO - if (f.id === wayA.id || t.id === wayA.id) { - var keepB = false; - if (v.length === 1 && v[0].type === 'node') { // check via node - keepB = wayB.contains(v[0].id); - } else { // check via way(s) - for (i = 0; i < v.length; i++) { - if (v[i].type === 'way') { - var wayVia = graph.hasEntity(v[i].id); - if (wayVia && utilArrayIntersection(wayB.nodes, wayVia.nodes).length) { - keepB = true; - break; - } - } - } - } - if (keepB) { - relation = relation.replaceMember(wayA, wayB); - graph = graph.replace(relation); - } + if (checkInt(arg.length) && checkInts(arg)) { + return new Uint8Array(arg); + } - // 2. split a VIA - } else { - for (i = 0; i < v.length; i++) { - if (v[i].type === 'way' && v[i].id === wayA.id) { - member = { - id: wayB.id, - type: 'way', - role: 'via' - }; - graph = actionAddMember(relation.id, member, v[i].index + 1)(graph); - break; - } - } - } + throw new Error('unsupported array-like object'); + } - // All other relations (Routes, Multipolygons, etc): - // 1. Both `wayA` and `wayB` remain in the relation - // 2. But must be inserted as a pair (see `actionAddMember` for details) - } else { - if (relation === isOuter) { - graph = graph.replace(relation.mergeTags(wayA.tags)); - graph = graph.replace(wayA.update({ tags: {} })); - graph = graph.replace(wayB.update({ tags: {} })); - } + function createArray(length) { + return new Uint8Array(length); + } - member = { - id: wayB.id, - type: 'way', - role: relation.memberById(wayA.id).role - }; + function copyArray(sourceArray, targetArray, targetStart, sourceStart, sourceEnd) { + if (sourceStart != null || sourceEnd != null) { + if (sourceArray.slice) { + sourceArray = sourceArray.slice(sourceStart, sourceEnd); + } else { + sourceArray = Array.prototype.slice.call(sourceArray, sourceStart, sourceEnd); + } + } - var insertPair = { - originalID: wayA.id, - insertedID: wayB.id, - nodes: origNodes - }; + targetArray.set(sourceArray, targetStart); + } - graph = actionAddMember(relation.id, member, undefined, insertPair)(graph); - } - }); + var convertUtf8 = function () { + function toBytes(text) { + var result = [], + i = 0; + text = encodeURI(text); - if (!isOuter && isArea) { - var multipolygon = osmRelation({ - tags: Object.assign({}, wayA.tags, { type: 'multipolygon' }), - members: [ - { id: wayA.id, role: 'outer', type: 'way' }, - { id: wayB.id, role: 'outer', type: 'way' } - ] - }); + while (i < text.length) { + var c = text.charCodeAt(i++); // if it is a % sign, encode the following 2 bytes as a hex value - graph = graph.replace(multipolygon); - graph = graph.replace(wayA.update({ tags: {} })); - graph = graph.replace(wayB.update({ tags: {} })); + if (c === 37) { + result.push(parseInt(text.substr(i, 2), 16)); + i += 2; // otherwise, just the actual byte + } else { + result.push(c); + } } - createdWayIDs.push(wayB.id); + return coerceArray(result); + } - return graph; - } + function fromBytes(bytes) { + var result = [], + i = 0; + + while (i < bytes.length) { + var c = bytes[i]; - var action = function(graph) { - var candidates = action.ways(graph); - createdWayIDs = []; - for (var i = 0; i < candidates.length; i++) { - graph = split(graph, candidates[i], newWayIds && newWayIds[i]); + if (c < 128) { + result.push(String.fromCharCode(c)); + i++; + } else if (c > 191 && c < 224) { + result.push(String.fromCharCode((c & 0x1f) << 6 | bytes[i + 1] & 0x3f)); + i += 2; + } else { + result.push(String.fromCharCode((c & 0x0f) << 12 | (bytes[i + 1] & 0x3f) << 6 | bytes[i + 2] & 0x3f)); + i += 3; + } } - return graph; - }; - action.getCreatedWayIDs = function() { - return createdWayIDs; - }; + return result.join(''); + } - action.ways = function(graph) { - var node = graph.entity(nodeId); - var parents = graph.parentWays(node); - var hasLines = parents.some(function(parent) { - return parent.geometry(graph) === 'line'; - }); + return { + toBytes: toBytes, + fromBytes: fromBytes + }; + }(); - return parents.filter(function(parent) { - if (_wayIDs && _wayIDs.indexOf(parent.id) === -1) - { return false; } + var convertHex = function () { + function toBytes(text) { + var result = []; - if (!_wayIDs && hasLines && parent.geometry(graph) !== 'line') - { return false; } + for (var i = 0; i < text.length; i += 2) { + result.push(parseInt(text.substr(i, 2), 16)); + } - if (parent.isClosed()) { - return true; - } + return result; + } // http://ixti.net/development/javascript/2011/11/11/base64-encodedecode-of-utf8-in-browser-with-js.html - for (var i = 1; i < parent.nodes.length - 1; i++) { - if (parent.nodes[i] === nodeId) { - return true; - } - } - return false; - }); - }; + var Hex = '0123456789abcdef'; + function fromBytes(bytes) { + var result = []; - action.disabled = function(graph) { - var candidates = action.ways(graph); - if (candidates.length === 0 || (_wayIDs && _wayIDs.length !== candidates.length)) { - return 'not_eligible'; + for (var i = 0; i < bytes.length; i++) { + var v = bytes[i]; + result.push(Hex[(v & 0xf0) >> 4] + Hex[v & 0x0f]); } - }; - - - action.limitWays = function(val) { - if (!arguments.length) { return _wayIDs; } - _wayIDs = val; - return action; - }; - - return action; - } - - function coreGraph(other, mutable) { - if (!(this instanceof coreGraph)) { return new coreGraph(other, mutable); } + return result.join(''); + } - if (other instanceof coreGraph) { - var base = other.base(); - this.entities = Object.assign(Object.create(base.entities), other.entities); - this._parentWays = Object.assign(Object.create(base.parentWays), other._parentWays); - this._parentRels = Object.assign(Object.create(base.parentRels), other._parentRels); + return { + toBytes: toBytes, + fromBytes: fromBytes + }; + }(); // Number of rounds by keysize - } else { - this.entities = Object.create({}); - this._parentWays = Object.create({}); - this._parentRels = Object.create({}); - this.rebase(other || [], [this]); - } - this.transients = {}; - this._childNodes = {}; - this.frozen = !mutable; - } + var numberOfRounds = { + 16: 10, + 24: 12, + 32: 14 + }; // Round constant words + var rcon = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91]; // S-box and Inverse S-box (S is for Substitution) - coreGraph.prototype = { + var S = [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]; + var Si = [0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]; // Transformations for encryption - hasEntity: function(id) { - return this.entities[id]; - }, + var T1 = [0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a]; + var T2 = [0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616]; + var T3 = [0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16]; + var T4 = [0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c]; // Transformations for decryption + var T5 = [0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742]; + var T6 = [0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857]; + var T7 = [0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8]; + var T8 = [0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0]; // Transformations for decryption key expansion - entity: function(id) { - var entity = this.entities[id]; + var U1 = [0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]; + var U2 = [0x00000000, 0x0b0e090d, 0x161c121a, 0x1d121b17, 0x2c382434, 0x27362d39, 0x3a24362e, 0x312a3f23, 0x58704868, 0x537e4165, 0x4e6c5a72, 0x4562537f, 0x74486c5c, 0x7f466551, 0x62547e46, 0x695a774b, 0xb0e090d0, 0xbbee99dd, 0xa6fc82ca, 0xadf28bc7, 0x9cd8b4e4, 0x97d6bde9, 0x8ac4a6fe, 0x81caaff3, 0xe890d8b8, 0xe39ed1b5, 0xfe8ccaa2, 0xf582c3af, 0xc4a8fc8c, 0xcfa6f581, 0xd2b4ee96, 0xd9bae79b, 0x7bdb3bbb, 0x70d532b6, 0x6dc729a1, 0x66c920ac, 0x57e31f8f, 0x5ced1682, 0x41ff0d95, 0x4af10498, 0x23ab73d3, 0x28a57ade, 0x35b761c9, 0x3eb968c4, 0x0f9357e7, 0x049d5eea, 0x198f45fd, 0x12814cf0, 0xcb3bab6b, 0xc035a266, 0xdd27b971, 0xd629b07c, 0xe7038f5f, 0xec0d8652, 0xf11f9d45, 0xfa119448, 0x934be303, 0x9845ea0e, 0x8557f119, 0x8e59f814, 0xbf73c737, 0xb47dce3a, 0xa96fd52d, 0xa261dc20, 0xf6ad766d, 0xfda37f60, 0xe0b16477, 0xebbf6d7a, 0xda955259, 0xd19b5b54, 0xcc894043, 0xc787494e, 0xaedd3e05, 0xa5d33708, 0xb8c12c1f, 0xb3cf2512, 0x82e51a31, 0x89eb133c, 0x94f9082b, 0x9ff70126, 0x464de6bd, 0x4d43efb0, 0x5051f4a7, 0x5b5ffdaa, 0x6a75c289, 0x617bcb84, 0x7c69d093, 0x7767d99e, 0x1e3daed5, 0x1533a7d8, 0x0821bccf, 0x032fb5c2, 0x32058ae1, 0x390b83ec, 0x241998fb, 0x2f1791f6, 0x8d764dd6, 0x867844db, 0x9b6a5fcc, 0x906456c1, 0xa14e69e2, 0xaa4060ef, 0xb7527bf8, 0xbc5c72f5, 0xd50605be, 0xde080cb3, 0xc31a17a4, 0xc8141ea9, 0xf93e218a, 0xf2302887, 0xef223390, 0xe42c3a9d, 0x3d96dd06, 0x3698d40b, 0x2b8acf1c, 0x2084c611, 0x11aef932, 0x1aa0f03f, 0x07b2eb28, 0x0cbce225, 0x65e6956e, 0x6ee89c63, 0x73fa8774, 0x78f48e79, 0x49deb15a, 0x42d0b857, 0x5fc2a340, 0x54ccaa4d, 0xf741ecda, 0xfc4fe5d7, 0xe15dfec0, 0xea53f7cd, 0xdb79c8ee, 0xd077c1e3, 0xcd65daf4, 0xc66bd3f9, 0xaf31a4b2, 0xa43fadbf, 0xb92db6a8, 0xb223bfa5, 0x83098086, 0x8807898b, 0x9515929c, 0x9e1b9b91, 0x47a17c0a, 0x4caf7507, 0x51bd6e10, 0x5ab3671d, 0x6b99583e, 0x60975133, 0x7d854a24, 0x768b4329, 0x1fd13462, 0x14df3d6f, 0x09cd2678, 0x02c32f75, 0x33e91056, 0x38e7195b, 0x25f5024c, 0x2efb0b41, 0x8c9ad761, 0x8794de6c, 0x9a86c57b, 0x9188cc76, 0xa0a2f355, 0xabacfa58, 0xb6bee14f, 0xbdb0e842, 0xd4ea9f09, 0xdfe49604, 0xc2f68d13, 0xc9f8841e, 0xf8d2bb3d, 0xf3dcb230, 0xeecea927, 0xe5c0a02a, 0x3c7a47b1, 0x37744ebc, 0x2a6655ab, 0x21685ca6, 0x10426385, 0x1b4c6a88, 0x065e719f, 0x0d507892, 0x640a0fd9, 0x6f0406d4, 0x72161dc3, 0x791814ce, 0x48322bed, 0x433c22e0, 0x5e2e39f7, 0x552030fa, 0x01ec9ab7, 0x0ae293ba, 0x17f088ad, 0x1cfe81a0, 0x2dd4be83, 0x26dab78e, 0x3bc8ac99, 0x30c6a594, 0x599cd2df, 0x5292dbd2, 0x4f80c0c5, 0x448ec9c8, 0x75a4f6eb, 0x7eaaffe6, 0x63b8e4f1, 0x68b6edfc, 0xb10c0a67, 0xba02036a, 0xa710187d, 0xac1e1170, 0x9d342e53, 0x963a275e, 0x8b283c49, 0x80263544, 0xe97c420f, 0xe2724b02, 0xff605015, 0xf46e5918, 0xc544663b, 0xce4a6f36, 0xd3587421, 0xd8567d2c, 0x7a37a10c, 0x7139a801, 0x6c2bb316, 0x6725ba1b, 0x560f8538, 0x5d018c35, 0x40139722, 0x4b1d9e2f, 0x2247e964, 0x2949e069, 0x345bfb7e, 0x3f55f273, 0x0e7fcd50, 0x0571c45d, 0x1863df4a, 0x136dd647, 0xcad731dc, 0xc1d938d1, 0xdccb23c6, 0xd7c52acb, 0xe6ef15e8, 0xede11ce5, 0xf0f307f2, 0xfbfd0eff, 0x92a779b4, 0x99a970b9, 0x84bb6bae, 0x8fb562a3, 0xbe9f5d80, 0xb591548d, 0xa8834f9a, 0xa38d4697]; + var U3 = [0x00000000, 0x0d0b0e09, 0x1a161c12, 0x171d121b, 0x342c3824, 0x3927362d, 0x2e3a2436, 0x23312a3f, 0x68587048, 0x65537e41, 0x724e6c5a, 0x7f456253, 0x5c74486c, 0x517f4665, 0x4662547e, 0x4b695a77, 0xd0b0e090, 0xddbbee99, 0xcaa6fc82, 0xc7adf28b, 0xe49cd8b4, 0xe997d6bd, 0xfe8ac4a6, 0xf381caaf, 0xb8e890d8, 0xb5e39ed1, 0xa2fe8cca, 0xaff582c3, 0x8cc4a8fc, 0x81cfa6f5, 0x96d2b4ee, 0x9bd9bae7, 0xbb7bdb3b, 0xb670d532, 0xa16dc729, 0xac66c920, 0x8f57e31f, 0x825ced16, 0x9541ff0d, 0x984af104, 0xd323ab73, 0xde28a57a, 0xc935b761, 0xc43eb968, 0xe70f9357, 0xea049d5e, 0xfd198f45, 0xf012814c, 0x6bcb3bab, 0x66c035a2, 0x71dd27b9, 0x7cd629b0, 0x5fe7038f, 0x52ec0d86, 0x45f11f9d, 0x48fa1194, 0x03934be3, 0x0e9845ea, 0x198557f1, 0x148e59f8, 0x37bf73c7, 0x3ab47dce, 0x2da96fd5, 0x20a261dc, 0x6df6ad76, 0x60fda37f, 0x77e0b164, 0x7aebbf6d, 0x59da9552, 0x54d19b5b, 0x43cc8940, 0x4ec78749, 0x05aedd3e, 0x08a5d337, 0x1fb8c12c, 0x12b3cf25, 0x3182e51a, 0x3c89eb13, 0x2b94f908, 0x269ff701, 0xbd464de6, 0xb04d43ef, 0xa75051f4, 0xaa5b5ffd, 0x896a75c2, 0x84617bcb, 0x937c69d0, 0x9e7767d9, 0xd51e3dae, 0xd81533a7, 0xcf0821bc, 0xc2032fb5, 0xe132058a, 0xec390b83, 0xfb241998, 0xf62f1791, 0xd68d764d, 0xdb867844, 0xcc9b6a5f, 0xc1906456, 0xe2a14e69, 0xefaa4060, 0xf8b7527b, 0xf5bc5c72, 0xbed50605, 0xb3de080c, 0xa4c31a17, 0xa9c8141e, 0x8af93e21, 0x87f23028, 0x90ef2233, 0x9de42c3a, 0x063d96dd, 0x0b3698d4, 0x1c2b8acf, 0x112084c6, 0x3211aef9, 0x3f1aa0f0, 0x2807b2eb, 0x250cbce2, 0x6e65e695, 0x636ee89c, 0x7473fa87, 0x7978f48e, 0x5a49deb1, 0x5742d0b8, 0x405fc2a3, 0x4d54ccaa, 0xdaf741ec, 0xd7fc4fe5, 0xc0e15dfe, 0xcdea53f7, 0xeedb79c8, 0xe3d077c1, 0xf4cd65da, 0xf9c66bd3, 0xb2af31a4, 0xbfa43fad, 0xa8b92db6, 0xa5b223bf, 0x86830980, 0x8b880789, 0x9c951592, 0x919e1b9b, 0x0a47a17c, 0x074caf75, 0x1051bd6e, 0x1d5ab367, 0x3e6b9958, 0x33609751, 0x247d854a, 0x29768b43, 0x621fd134, 0x6f14df3d, 0x7809cd26, 0x7502c32f, 0x5633e910, 0x5b38e719, 0x4c25f502, 0x412efb0b, 0x618c9ad7, 0x6c8794de, 0x7b9a86c5, 0x769188cc, 0x55a0a2f3, 0x58abacfa, 0x4fb6bee1, 0x42bdb0e8, 0x09d4ea9f, 0x04dfe496, 0x13c2f68d, 0x1ec9f884, 0x3df8d2bb, 0x30f3dcb2, 0x27eecea9, 0x2ae5c0a0, 0xb13c7a47, 0xbc37744e, 0xab2a6655, 0xa621685c, 0x85104263, 0x881b4c6a, 0x9f065e71, 0x920d5078, 0xd9640a0f, 0xd46f0406, 0xc372161d, 0xce791814, 0xed48322b, 0xe0433c22, 0xf75e2e39, 0xfa552030, 0xb701ec9a, 0xba0ae293, 0xad17f088, 0xa01cfe81, 0x832dd4be, 0x8e26dab7, 0x993bc8ac, 0x9430c6a5, 0xdf599cd2, 0xd25292db, 0xc54f80c0, 0xc8448ec9, 0xeb75a4f6, 0xe67eaaff, 0xf163b8e4, 0xfc68b6ed, 0x67b10c0a, 0x6aba0203, 0x7da71018, 0x70ac1e11, 0x539d342e, 0x5e963a27, 0x498b283c, 0x44802635, 0x0fe97c42, 0x02e2724b, 0x15ff6050, 0x18f46e59, 0x3bc54466, 0x36ce4a6f, 0x21d35874, 0x2cd8567d, 0x0c7a37a1, 0x017139a8, 0x166c2bb3, 0x1b6725ba, 0x38560f85, 0x355d018c, 0x22401397, 0x2f4b1d9e, 0x642247e9, 0x692949e0, 0x7e345bfb, 0x733f55f2, 0x500e7fcd, 0x5d0571c4, 0x4a1863df, 0x47136dd6, 0xdccad731, 0xd1c1d938, 0xc6dccb23, 0xcbd7c52a, 0xe8e6ef15, 0xe5ede11c, 0xf2f0f307, 0xfffbfd0e, 0xb492a779, 0xb999a970, 0xae84bb6b, 0xa38fb562, 0x80be9f5d, 0x8db59154, 0x9aa8834f, 0x97a38d46]; + var U4 = [0x00000000, 0x090d0b0e, 0x121a161c, 0x1b171d12, 0x24342c38, 0x2d392736, 0x362e3a24, 0x3f23312a, 0x48685870, 0x4165537e, 0x5a724e6c, 0x537f4562, 0x6c5c7448, 0x65517f46, 0x7e466254, 0x774b695a, 0x90d0b0e0, 0x99ddbbee, 0x82caa6fc, 0x8bc7adf2, 0xb4e49cd8, 0xbde997d6, 0xa6fe8ac4, 0xaff381ca, 0xd8b8e890, 0xd1b5e39e, 0xcaa2fe8c, 0xc3aff582, 0xfc8cc4a8, 0xf581cfa6, 0xee96d2b4, 0xe79bd9ba, 0x3bbb7bdb, 0x32b670d5, 0x29a16dc7, 0x20ac66c9, 0x1f8f57e3, 0x16825ced, 0x0d9541ff, 0x04984af1, 0x73d323ab, 0x7ade28a5, 0x61c935b7, 0x68c43eb9, 0x57e70f93, 0x5eea049d, 0x45fd198f, 0x4cf01281, 0xab6bcb3b, 0xa266c035, 0xb971dd27, 0xb07cd629, 0x8f5fe703, 0x8652ec0d, 0x9d45f11f, 0x9448fa11, 0xe303934b, 0xea0e9845, 0xf1198557, 0xf8148e59, 0xc737bf73, 0xce3ab47d, 0xd52da96f, 0xdc20a261, 0x766df6ad, 0x7f60fda3, 0x6477e0b1, 0x6d7aebbf, 0x5259da95, 0x5b54d19b, 0x4043cc89, 0x494ec787, 0x3e05aedd, 0x3708a5d3, 0x2c1fb8c1, 0x2512b3cf, 0x1a3182e5, 0x133c89eb, 0x082b94f9, 0x01269ff7, 0xe6bd464d, 0xefb04d43, 0xf4a75051, 0xfdaa5b5f, 0xc2896a75, 0xcb84617b, 0xd0937c69, 0xd99e7767, 0xaed51e3d, 0xa7d81533, 0xbccf0821, 0xb5c2032f, 0x8ae13205, 0x83ec390b, 0x98fb2419, 0x91f62f17, 0x4dd68d76, 0x44db8678, 0x5fcc9b6a, 0x56c19064, 0x69e2a14e, 0x60efaa40, 0x7bf8b752, 0x72f5bc5c, 0x05bed506, 0x0cb3de08, 0x17a4c31a, 0x1ea9c814, 0x218af93e, 0x2887f230, 0x3390ef22, 0x3a9de42c, 0xdd063d96, 0xd40b3698, 0xcf1c2b8a, 0xc6112084, 0xf93211ae, 0xf03f1aa0, 0xeb2807b2, 0xe2250cbc, 0x956e65e6, 0x9c636ee8, 0x877473fa, 0x8e7978f4, 0xb15a49de, 0xb85742d0, 0xa3405fc2, 0xaa4d54cc, 0xecdaf741, 0xe5d7fc4f, 0xfec0e15d, 0xf7cdea53, 0xc8eedb79, 0xc1e3d077, 0xdaf4cd65, 0xd3f9c66b, 0xa4b2af31, 0xadbfa43f, 0xb6a8b92d, 0xbfa5b223, 0x80868309, 0x898b8807, 0x929c9515, 0x9b919e1b, 0x7c0a47a1, 0x75074caf, 0x6e1051bd, 0x671d5ab3, 0x583e6b99, 0x51336097, 0x4a247d85, 0x4329768b, 0x34621fd1, 0x3d6f14df, 0x267809cd, 0x2f7502c3, 0x105633e9, 0x195b38e7, 0x024c25f5, 0x0b412efb, 0xd7618c9a, 0xde6c8794, 0xc57b9a86, 0xcc769188, 0xf355a0a2, 0xfa58abac, 0xe14fb6be, 0xe842bdb0, 0x9f09d4ea, 0x9604dfe4, 0x8d13c2f6, 0x841ec9f8, 0xbb3df8d2, 0xb230f3dc, 0xa927eece, 0xa02ae5c0, 0x47b13c7a, 0x4ebc3774, 0x55ab2a66, 0x5ca62168, 0x63851042, 0x6a881b4c, 0x719f065e, 0x78920d50, 0x0fd9640a, 0x06d46f04, 0x1dc37216, 0x14ce7918, 0x2bed4832, 0x22e0433c, 0x39f75e2e, 0x30fa5520, 0x9ab701ec, 0x93ba0ae2, 0x88ad17f0, 0x81a01cfe, 0xbe832dd4, 0xb78e26da, 0xac993bc8, 0xa59430c6, 0xd2df599c, 0xdbd25292, 0xc0c54f80, 0xc9c8448e, 0xf6eb75a4, 0xffe67eaa, 0xe4f163b8, 0xedfc68b6, 0x0a67b10c, 0x036aba02, 0x187da710, 0x1170ac1e, 0x2e539d34, 0x275e963a, 0x3c498b28, 0x35448026, 0x420fe97c, 0x4b02e272, 0x5015ff60, 0x5918f46e, 0x663bc544, 0x6f36ce4a, 0x7421d358, 0x7d2cd856, 0xa10c7a37, 0xa8017139, 0xb3166c2b, 0xba1b6725, 0x8538560f, 0x8c355d01, 0x97224013, 0x9e2f4b1d, 0xe9642247, 0xe0692949, 0xfb7e345b, 0xf2733f55, 0xcd500e7f, 0xc45d0571, 0xdf4a1863, 0xd647136d, 0x31dccad7, 0x38d1c1d9, 0x23c6dccb, 0x2acbd7c5, 0x15e8e6ef, 0x1ce5ede1, 0x07f2f0f3, 0x0efffbfd, 0x79b492a7, 0x70b999a9, 0x6bae84bb, 0x62a38fb5, 0x5d80be9f, 0x548db591, 0x4f9aa883, 0x4697a38d]; - //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376 - if (!entity) { - entity = this.entities.__proto__[id]; // eslint-disable-line no-proto - } + function convertToInt32(bytes) { + var result = []; - if (!entity) { - throw new Error('entity ' + id + ' not found'); - } - return entity; - }, + for (var i = 0; i < bytes.length; i += 4) { + result.push(bytes[i] << 24 | bytes[i + 1] << 16 | bytes[i + 2] << 8 | bytes[i + 3]); + } + return result; + } - geometry: function(id) { - return this.entity(id).geometry(this); - }, + var AES = function AES(key) { + if (!(this instanceof AES)) { + throw Error('AES must be instanitated with `new`'); + } + Object.defineProperty(this, 'key', { + value: coerceArray(key, true) + }); - transient: function(entity, key, fn) { - var id = entity.id; - var transients = this.transients[id] || (this.transients[id] = {}); + this._prepare(); + }; - if (transients[key] !== undefined) { - return transients[key]; - } + AES.prototype._prepare = function () { + var rounds = numberOfRounds[this.key.length]; - transients[key] = fn.call(entity); + if (rounds == null) { + throw new Error('invalid key size (must be 16, 24 or 32 bytes)'); + } // encryption round keys - return transients[key]; - }, + this._Ke = []; // decryption round keys - parentWays: function(entity) { - var parents = this._parentWays[entity.id]; - var result = []; - if (parents) { - parents.forEach(function(id) { - result.push(this.entity(id)); - }, this); - } - return result; - }, + this._Kd = []; + for (var i = 0; i <= rounds; i++) { + this._Ke.push([0, 0, 0, 0]); - isPoi: function(entity) { - var parents = this._parentWays[entity.id]; - return !parents || parents.size === 0; - }, + this._Kd.push([0, 0, 0, 0]); + } + var roundKeyCount = (rounds + 1) * 4; + var KC = this.key.length / 4; // convert the key into ints - isShared: function(entity) { - var parents = this._parentWays[entity.id]; - return parents && parents.size > 1; - }, + var tk = convertToInt32(this.key); // copy values into round key arrays + var index; - parentRelations: function(entity) { - var parents = this._parentRels[entity.id]; - var result = []; - if (parents) { - parents.forEach(function(id) { - result.push(this.entity(id)); - }, this); - } - return result; - }, + for (var i = 0; i < KC; i++) { + index = i >> 2; + this._Ke[index][i % 4] = tk[i]; + this._Kd[rounds - index][i % 4] = tk[i]; + } // key expansion (fips-197 section 5.2) - parentMultipolygons: function(entity) { - return this.parentRelations(entity).filter(function(relation) { - return relation.isMultipolygon(); - }); - }, + var rconpointer = 0; + var t = KC, + tt; - childNodes: function(entity) { - if (this._childNodes[entity.id]) { return this._childNodes[entity.id]; } - if (!entity.nodes) { return []; } + while (t < roundKeyCount) { + tt = tk[KC - 1]; + tk[0] ^= S[tt >> 16 & 0xFF] << 24 ^ S[tt >> 8 & 0xFF] << 16 ^ S[tt & 0xFF] << 8 ^ S[tt >> 24 & 0xFF] ^ rcon[rconpointer] << 24; + rconpointer += 1; // key expansion (for non-256 bit) - var nodes = []; - for (var i = 0; i < entity.nodes.length; i++) { - nodes[i] = this.entity(entity.nodes[i]); - } + if (KC != 8) { + for (var i = 1; i < KC; i++) { + tk[i] ^= tk[i - 1]; + } // key expansion for 256-bit keys is "slightly different" (fips-197) - this._childNodes[entity.id] = nodes; - return this._childNodes[entity.id]; - }, + } else { + for (var i = 1; i < KC / 2; i++) { + tk[i] ^= tk[i - 1]; + } + tt = tk[KC / 2 - 1]; + tk[KC / 2] ^= S[tt & 0xFF] ^ S[tt >> 8 & 0xFF] << 8 ^ S[tt >> 16 & 0xFF] << 16 ^ S[tt >> 24 & 0xFF] << 24; - base: function() { - return { - 'entities': Object.getPrototypeOf(this.entities), - 'parentWays': Object.getPrototypeOf(this._parentWays), - 'parentRels': Object.getPrototypeOf(this._parentRels) - }; - }, + for (var i = KC / 2 + 1; i < KC; i++) { + tk[i] ^= tk[i - 1]; + } + } // copy values into round key arrays - // Unlike other graph methods, rebase mutates in place. This is because it - // is used only during the history operation that merges newly downloaded - // data into each state. To external consumers, it should appear as if the - // graph always contained the newly downloaded data. - rebase: function(entities, stack, force) { - var base = this.base(); - var i, j, k, id; - - for (i = 0; i < entities.length; i++) { - var entity = entities[i]; - - if (!entity.visible || (!force && base.entities[entity.id])) - { continue; } - - // Merging data into the base graph - base.entities[entity.id] = entity; - this._updateCalculated(undefined, entity, base.parentWays, base.parentRels); - - // Restore provisionally-deleted nodes that are discovered to have an extant parent - if (entity.type === 'way') { - for (j = 0; j < entity.nodes.length; j++) { - id = entity.nodes[j]; - for (k = 1; k < stack.length; k++) { - var ents = stack[k].entities; - if (ents.hasOwnProperty(id) && ents[id] === undefined) { - delete ents[id]; - } - } - } - } - } + var i = 0, + r, + c; - for (i = 0; i < stack.length; i++) { - stack[i]._updateRebased(); + while (i < KC && t < roundKeyCount) { + r = t >> 2; + c = t % 4; + this._Ke[r][c] = tk[i]; + this._Kd[rounds - r][c] = tk[i++]; + t++; } - }, - + } // inverse-cipher-ify the decryption round key (fips-197 section 5.3) - _updateRebased: function() { - var base = this.base(); - Object.keys(this._parentWays).forEach(function(child) { - if (base.parentWays[child]) { - base.parentWays[child].forEach(function(id) { - if (!this.entities.hasOwnProperty(id)) { - this._parentWays[child].add(id); - } - }, this); - } - }, this); + for (var r = 1; r < rounds; r++) { + for (var c = 0; c < 4; c++) { + tt = this._Kd[r][c]; + this._Kd[r][c] = U1[tt >> 24 & 0xFF] ^ U2[tt >> 16 & 0xFF] ^ U3[tt >> 8 & 0xFF] ^ U4[tt & 0xFF]; + } + } + }; - Object.keys(this._parentRels).forEach(function(child) { - if (base.parentRels[child]) { - base.parentRels[child].forEach(function(id) { - if (!this.entities.hasOwnProperty(id)) { - this._parentRels[child].add(id); - } - }, this); - } - }, this); + AES.prototype.encrypt = function (plaintext) { + if (plaintext.length != 16) { + throw new Error('invalid plaintext size (must be 16 bytes)'); + } - this.transients = {}; + var rounds = this._Ke.length - 1; + var a = [0, 0, 0, 0]; // convert plaintext to (ints ^ key) - // this._childNodes is not updated, under the assumption that - // ways are always downloaded with their child nodes. - }, + var t = convertToInt32(plaintext); + for (var i = 0; i < 4; i++) { + t[i] ^= this._Ke[0][i]; + } // apply round transforms - // Updates calculated properties (parentWays, parentRels) for the specified change - _updateCalculated: function(oldentity, entity, parentWays, parentRels) { - parentWays = parentWays || this._parentWays; - parentRels = parentRels || this._parentRels; - - var type = entity && entity.type || oldentity && oldentity.type; - var removed, added, i; - - if (type === 'way') { // Update parentWays - if (oldentity && entity) { - removed = utilArrayDifference(oldentity.nodes, entity.nodes); - added = utilArrayDifference(entity.nodes, oldentity.nodes); - } else if (oldentity) { - removed = oldentity.nodes; - added = []; - } else if (entity) { - removed = []; - added = entity.nodes; - } - for (i = 0; i < removed.length; i++) { - // make a copy of prototype property, store as own property, and update.. - parentWays[removed[i]] = new Set(parentWays[removed[i]]); - parentWays[removed[i]].delete(oldentity.id); - } - for (i = 0; i < added.length; i++) { - // make a copy of prototype property, store as own property, and update.. - parentWays[added[i]] = new Set(parentWays[added[i]]); - parentWays[added[i]].add(entity.id); - } - } else if (type === 'relation') { // Update parentRels - - // diff only on the IDs since the same entity can be a member multiple times with different roles - var oldentityMemberIDs = oldentity ? oldentity.members.map(function(m) { return m.id; }) : []; - var entityMemberIDs = entity ? entity.members.map(function(m) { return m.id; }) : []; - - if (oldentity && entity) { - removed = utilArrayDifference(oldentityMemberIDs, entityMemberIDs); - added = utilArrayDifference(entityMemberIDs, oldentityMemberIDs); - } else if (oldentity) { - removed = oldentityMemberIDs; - added = []; - } else if (entity) { - removed = []; - added = entityMemberIDs; - } - for (i = 0; i < removed.length; i++) { - // make a copy of prototype property, store as own property, and update.. - parentRels[removed[i]] = new Set(parentRels[removed[i]]); - parentRels[removed[i]].delete(oldentity.id); - } - for (i = 0; i < added.length; i++) { - // make a copy of prototype property, store as own property, and update.. - parentRels[added[i]] = new Set(parentRels[added[i]]); - parentRels[added[i]].add(entity.id); - } + for (var r = 1; r < rounds; r++) { + for (var i = 0; i < 4; i++) { + a[i] = T1[t[i] >> 24 & 0xff] ^ T2[t[(i + 1) % 4] >> 16 & 0xff] ^ T3[t[(i + 2) % 4] >> 8 & 0xff] ^ T4[t[(i + 3) % 4] & 0xff] ^ this._Ke[r][i]; } - }, + t = a.slice(); + } // the last round is special - replace: function(entity) { - if (this.entities[entity.id] === entity) { return this; } - return this.update(function() { - this._updateCalculated(this.entities[entity.id], entity); - this.entities[entity.id] = entity; - }); - }, + var result = createArray(16), + tt; + for (var i = 0; i < 4; i++) { + tt = this._Ke[rounds][i]; + result[4 * i] = (S[t[i] >> 24 & 0xff] ^ tt >> 24) & 0xff; + result[4 * i + 1] = (S[t[(i + 1) % 4] >> 16 & 0xff] ^ tt >> 16) & 0xff; + result[4 * i + 2] = (S[t[(i + 2) % 4] >> 8 & 0xff] ^ tt >> 8) & 0xff; + result[4 * i + 3] = (S[t[(i + 3) % 4] & 0xff] ^ tt) & 0xff; + } - remove: function(entity) { - return this.update(function() { - this._updateCalculated(entity, undefined); - this.entities[entity.id] = undefined; - }); - }, + return result; + }; + AES.prototype.decrypt = function (ciphertext) { + if (ciphertext.length != 16) { + throw new Error('invalid ciphertext size (must be 16 bytes)'); + } - revert: function(id) { - var baseEntity = this.base().entities[id]; - var headEntity = this.entities[id]; - if (headEntity === baseEntity) { return this; } + var rounds = this._Kd.length - 1; + var a = [0, 0, 0, 0]; // convert plaintext to (ints ^ key) - return this.update(function() { - this._updateCalculated(headEntity, baseEntity); - delete this.entities[id]; - }); - }, + var t = convertToInt32(ciphertext); + for (var i = 0; i < 4; i++) { + t[i] ^= this._Kd[0][i]; + } // apply round transforms - update: function() { - var arguments$1 = arguments; - var graph = this.frozen ? coreGraph(this, true) : this; - for (var i = 0; i < arguments.length; i++) { - arguments$1[i].call(graph, graph); + for (var r = 1; r < rounds; r++) { + for (var i = 0; i < 4; i++) { + a[i] = T5[t[i] >> 24 & 0xff] ^ T6[t[(i + 3) % 4] >> 16 & 0xff] ^ T7[t[(i + 2) % 4] >> 8 & 0xff] ^ T8[t[(i + 1) % 4] & 0xff] ^ this._Kd[r][i]; } - if (this.frozen) { graph.frozen = true; } - - return graph; - }, + t = a.slice(); + } // the last round is special - // Obliterates any existing entities - load: function(entities) { - var base = this.base(); - this.entities = Object.create(base.entities); + var result = createArray(16), + tt; - for (var i in entities) { - this.entities[i] = entities[i]; - this._updateCalculated(base.entities[i], this.entities[i]); - } + for (var i = 0; i < 4; i++) { + tt = this._Kd[rounds][i]; + result[4 * i] = (Si[t[i] >> 24 & 0xff] ^ tt >> 24) & 0xff; + result[4 * i + 1] = (Si[t[(i + 3) % 4] >> 16 & 0xff] ^ tt >> 16) & 0xff; + result[4 * i + 2] = (Si[t[(i + 2) % 4] >> 8 & 0xff] ^ tt >> 8) & 0xff; + result[4 * i + 3] = (Si[t[(i + 1) % 4] & 0xff] ^ tt) & 0xff; + } - return this; - } - }; + return result; + }; + /** + * Mode Of Operation - Electonic Codebook (ECB) + */ - function osmTurn(turn) { - if (!(this instanceof osmTurn)) { - return new osmTurn(turn); - } - Object.assign(this, turn); - } + var ModeOfOperationECB = function ModeOfOperationECB(key) { + if (!(this instanceof ModeOfOperationECB)) { + throw Error('AES must be instanitated with `new`'); + } - function osmIntersection(graph, startVertexId, maxDistance) { - maxDistance = maxDistance || 30; // in meters - var vgraph = coreGraph(); // virtual graph - var i, j, k; + this.description = "Electronic Code Block"; + this.name = "ecb"; + this._aes = new AES(key); + }; + ModeOfOperationECB.prototype.encrypt = function (plaintext) { + plaintext = coerceArray(plaintext); - function memberOfRestriction(entity) { - return graph.parentRelations(entity) - .some(function(r) { return r.isRestriction(); }); - } - - function isRoad(way) { - if (way.isArea() || way.isDegenerate()) { return false; } - var roads = { - 'motorway': true, - 'motorway_link': true, - 'trunk': true, - 'trunk_link': true, - 'primary': true, - 'primary_link': true, - 'secondary': true, - 'secondary_link': true, - 'tertiary': true, - 'tertiary_link': true, - 'residential': true, - 'unclassified': true, - 'living_street': true, - 'service': true, - 'road': true, - 'track': true - }; - return roads[way.tags.highway]; - } + if (plaintext.length % 16 !== 0) { + throw new Error('invalid plaintext size (must be multiple of 16 bytes)'); + } + var ciphertext = createArray(plaintext.length); + var block = createArray(16); - var startNode = graph.entity(startVertexId); - var checkVertices = [startNode]; - var checkWays; - var vertices = []; - var vertexIds = []; - var vertex; - var ways = []; - var wayIds = []; - var way; - var nodes = []; - var node; - var parents = []; - var parent; + for (var i = 0; i < plaintext.length; i += 16) { + copyArray(plaintext, block, 0, i, i + 16); + block = this._aes.encrypt(block); + copyArray(block, ciphertext, i); + } - // `actions` will store whatever actions must be performed to satisfy - // preconditions for adding a turn restriction to this intersection. - // - Remove any existing degenerate turn restrictions (missing from/to, etc) - // - Reverse oneways so that they are drawn in the forward direction - // - Split ways on key vertices - var actions = []; + return ciphertext; + }; + ModeOfOperationECB.prototype.decrypt = function (ciphertext) { + ciphertext = coerceArray(ciphertext); - // STEP 1: walk the graph outwards from starting vertex to search - // for more key vertices and ways to include in the intersection.. - - while (checkVertices.length) { - vertex = checkVertices.pop(); - - // check this vertex for parent ways that are roads - checkWays = graph.parentWays(vertex); - var hasWays = false; - for (i = 0; i < checkWays.length; i++) { - way = checkWays[i]; - if (!isRoad(way) && !memberOfRestriction(way)) { continue; } - - ways.push(way); // it's a road, or it's already in a turn restriction - hasWays = true; - - // check the way's children for more key vertices - nodes = utilArrayUniq(graph.childNodes(way)); - for (j = 0; j < nodes.length; j++) { - node = nodes[j]; - if (node === vertex) { continue; } // same thing - if (vertices.indexOf(node) !== -1) { continue; } // seen it already - if (geoSphericalDistance(node.loc, startNode.loc) > maxDistance) { continue; } // too far from start - - // a key vertex will have parents that are also roads - var hasParents = false; - parents = graph.parentWays(node); - for (k = 0; k < parents.length; k++) { - parent = parents[k]; - if (parent === way) { continue; } // same thing - if (ways.indexOf(parent) !== -1) { continue; } // seen it already - if (!isRoad(parent)) { continue; } // not a road - hasParents = true; - break; - } + if (ciphertext.length % 16 !== 0) { + throw new Error('invalid ciphertext size (must be multiple of 16 bytes)'); + } - if (hasParents) { - checkVertices.push(node); - } - } - } + var plaintext = createArray(ciphertext.length); + var block = createArray(16); - if (hasWays) { - vertices.push(vertex); - } - } + for (var i = 0; i < ciphertext.length; i += 16) { + copyArray(ciphertext, block, 0, i, i + 16); + block = this._aes.decrypt(block); + copyArray(block, plaintext, i); + } - vertices = utilArrayUniq(vertices); - ways = utilArrayUniq(ways); + return plaintext; + }; + /** + * Mode Of Operation - Cipher Block Chaining (CBC) + */ - // STEP 2: Build a virtual graph containing only the entities in the intersection.. - // Everything done after this step should act on the virtual graph - // Any actions that must be performed later to the main graph go in `actions` array - ways.forEach(function(way) { - graph.childNodes(way).forEach(function(node) { - vgraph = vgraph.replace(node); - }); + var ModeOfOperationCBC = function ModeOfOperationCBC(key, iv) { + if (!(this instanceof ModeOfOperationCBC)) { + throw Error('AES must be instanitated with `new`'); + } - vgraph = vgraph.replace(way); + this.description = "Cipher Block Chaining"; + this.name = "cbc"; - graph.parentRelations(way).forEach(function(relation) { - if (relation.isRestriction()) { - if (relation.isValidRestriction(graph)) { - vgraph = vgraph.replace(relation); - } else if (relation.isComplete(graph)) { - actions.push(actionDeleteRelation(relation.id)); - } - } - }); - }); + if (!iv) { + iv = createArray(16); + } else if (iv.length != 16) { + throw new Error('invalid initialation vector size (must be 16 bytes)'); + } + this._lastCipherblock = coerceArray(iv, true); + this._aes = new AES(key); + }; - // STEP 3: Force all oneways to be drawn in the forward direction - ways.forEach(function(w) { - var way = vgraph.entity(w.id); - if (way.tags.oneway === '-1') { - var action = actionReverse(way.id, { reverseOneway: true }); - actions.push(action); - vgraph = action(vgraph); - } - }); + ModeOfOperationCBC.prototype.encrypt = function (plaintext) { + plaintext = coerceArray(plaintext); + if (plaintext.length % 16 !== 0) { + throw new Error('invalid plaintext size (must be multiple of 16 bytes)'); + } - // STEP 4: Split ways on key vertices - var origCount = osmEntity.id.next.way; - vertices.forEach(function(v) { - // This is an odd way to do it, but we need to find all the ways that - // will be split here, then split them one at a time to ensure that these - // actions can be replayed on the main graph exactly in the same order. - // (It is unintuitive, but the order of ways returned from graph.parentWays() - // is arbitrary, depending on how the main graph and vgraph were built) - var splitAll = actionSplit(v.id); - if (!splitAll.disabled(vgraph)) { - splitAll.ways(vgraph).forEach(function(way) { - var splitOne = actionSplit(v.id).limitWays([way.id]); - actions.push(splitOne); - vgraph = splitOne(vgraph); - }); - } - }); + var ciphertext = createArray(plaintext.length); + var block = createArray(16); - // In here is where we should also split the intersection at nearby junction. - // for https://github.com/mapbox/iD-internal/issues/31 - // nearbyVertices.forEach(function(v) { - // }); + for (var i = 0; i < plaintext.length; i += 16) { + copyArray(plaintext, block, 0, i, i + 16); - // Reasons why we reset the way id count here: - // 1. Continuity with way ids created by the splits so that we can replay - // these actions later if the user decides to create a turn restriction - // 2. Avoids churning way ids just by hovering over a vertex - // and displaying the turn restriction editor - osmEntity.id.next.way = origCount; + for (var j = 0; j < 16; j++) { + block[j] ^= this._lastCipherblock[j]; + } + this._lastCipherblock = this._aes.encrypt(block); + copyArray(this._lastCipherblock, ciphertext, i); + } - // STEP 5: Update arrays to point to vgraph entities - vertexIds = vertices.map(function(v) { return v.id; }); - vertices = []; - ways = []; + return ciphertext; + }; - vertexIds.forEach(function(id) { - var vertex = vgraph.entity(id); - var parents = vgraph.parentWays(vertex); - vertices.push(vertex); - ways = ways.concat(parents); - }); + ModeOfOperationCBC.prototype.decrypt = function (ciphertext) { + ciphertext = coerceArray(ciphertext); - vertices = utilArrayUniq(vertices); - ways = utilArrayUniq(ways); + if (ciphertext.length % 16 !== 0) { + throw new Error('invalid ciphertext size (must be multiple of 16 bytes)'); + } - vertexIds = vertices.map(function(v) { return v.id; }); - wayIds = ways.map(function(w) { return w.id; }); + var plaintext = createArray(ciphertext.length); + var block = createArray(16); + for (var i = 0; i < ciphertext.length; i += 16) { + copyArray(ciphertext, block, 0, i, i + 16); + block = this._aes.decrypt(block); - // STEP 6: Update the ways with some metadata that will be useful for - // walking the intersection graph later and rendering turn arrows. + for (var j = 0; j < 16; j++) { + plaintext[i + j] = block[j] ^ this._lastCipherblock[j]; + } - function withMetadata(way, vertexIds) { - var __oneWay = way.isOneWay(); + copyArray(ciphertext, this._lastCipherblock, 0, i, i + 16); + } - // which affixes are key vertices? - var __first = (vertexIds.indexOf(way.first()) !== -1); - var __last = (vertexIds.indexOf(way.last()) !== -1); + return plaintext; + }; + /** + * Mode Of Operation - Cipher Feedback (CFB) + */ - // what roles is this way eligible for? - var __via = (__first && __last); - var __from = ((__first && !__oneWay) || __last); - var __to = (__first || (__last && !__oneWay)); - return way.update({ - __first: __first, - __last: __last, - __from: __from, - __via: __via, - __to: __to, - __oneWay: __oneWay - }); - } + var ModeOfOperationCFB = function ModeOfOperationCFB(key, iv, segmentSize) { + if (!(this instanceof ModeOfOperationCFB)) { + throw Error('AES must be instanitated with `new`'); + } - ways = []; - wayIds.forEach(function(id) { - var way = withMetadata(vgraph.entity(id), vertexIds); - vgraph = vgraph.replace(way); - ways.push(way); - }); + this.description = "Cipher Feedback"; + this.name = "cfb"; + if (!iv) { + iv = createArray(16); + } else if (iv.length != 16) { + throw new Error('invalid initialation vector size (must be 16 size)'); + } - // STEP 7: Simplify - This is an iterative process where we: - // 1. Find trivial vertices with only 2 parents - // 2. trim off the leaf way from those vertices and remove from vgraph + if (!segmentSize) { + segmentSize = 1; + } - var keepGoing; - var removeWayIds = []; - var removeVertexIds = []; + this.segmentSize = segmentSize; + this._shiftRegister = coerceArray(iv, true); + this._aes = new AES(key); + }; - do { - keepGoing = false; - checkVertices = vertexIds.slice(); + ModeOfOperationCFB.prototype.encrypt = function (plaintext) { + if (plaintext.length % this.segmentSize != 0) { + throw new Error('invalid plaintext size (must be segmentSize bytes)'); + } - for (i = 0; i < checkVertices.length; i++) { - var vertexId = checkVertices[i]; - vertex = vgraph.hasEntity(vertexId); + var encrypted = coerceArray(plaintext, true); + var xorSegment; - if (!vertex) { - if (vertexIds.indexOf(vertexId) !== -1) { - vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one - } - removeVertexIds.push(vertexId); - continue; - } + for (var i = 0; i < encrypted.length; i += this.segmentSize) { + xorSegment = this._aes.encrypt(this._shiftRegister); - parents = vgraph.parentWays(vertex); - if (parents.length < 3) { - if (vertexIds.indexOf(vertexId) !== -1) { - vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one - } - } + for (var j = 0; j < this.segmentSize; j++) { + encrypted[i + j] ^= xorSegment[j]; + } // Shift the register - if (parents.length === 2) { // vertex with 2 parents is trivial - var a = parents[0]; - var b = parents[1]; - var aIsLeaf = a && !a.__via; - var bIsLeaf = b && !b.__via; - var leaf, survivor; - - if (aIsLeaf && !bIsLeaf) { - leaf = a; - survivor = b; - } else if (!aIsLeaf && bIsLeaf) { - leaf = b; - survivor = a; - } - if (leaf && survivor) { - survivor = withMetadata(survivor, vertexIds); // update survivor way - vgraph = vgraph.replace(survivor).remove(leaf); // update graph - removeWayIds.push(leaf.id); - keepGoing = true; - } - } + copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize); + copyArray(encrypted, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize); + } - parents = vgraph.parentWays(vertex); + return encrypted; + }; - if (parents.length < 2) { // vertex is no longer a key vertex - if (vertexIds.indexOf(vertexId) !== -1) { - vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one - } - removeVertexIds.push(vertexId); - keepGoing = true; - } + ModeOfOperationCFB.prototype.decrypt = function (ciphertext) { + if (ciphertext.length % this.segmentSize != 0) { + throw new Error('invalid ciphertext size (must be segmentSize bytes)'); + } - if (parents.length < 1) { // vertex is no longer attached to anything - vgraph = vgraph.remove(vertex); - } + var plaintext = coerceArray(ciphertext, true); + var xorSegment; - } - } while (keepGoing); + for (var i = 0; i < plaintext.length; i += this.segmentSize) { + xorSegment = this._aes.encrypt(this._shiftRegister); + for (var j = 0; j < this.segmentSize; j++) { + plaintext[i + j] ^= xorSegment[j]; + } // Shift the register - vertices = vertices - .filter(function(vertex) { return removeVertexIds.indexOf(vertex.id) === -1; }) - .map(function(vertex) { return vgraph.entity(vertex.id); }); - ways = ways - .filter(function(way) { return removeWayIds.indexOf(way.id) === -1; }) - .map(function(way) { return vgraph.entity(way.id); }); + copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize); + copyArray(ciphertext, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize); + } - // OK! Here is our intersection.. - var intersection = { - graph: vgraph, - actions: actions, - vertices: vertices, - ways: ways, + return plaintext; }; + /** + * Mode Of Operation - Output Feedback (OFB) + */ + var ModeOfOperationOFB = function ModeOfOperationOFB(key, iv) { + if (!(this instanceof ModeOfOperationOFB)) { + throw Error('AES must be instanitated with `new`'); + } - // Get all the valid turns through this intersection given a starting way id. - // This operates on the virtual graph for everything. - // - // Basically, walk through all possible paths from starting way, - // honoring the existing turn restrictions as we go (watch out for loops!) - // - // For each path found, generate and return a `osmTurn` datastructure. - // - intersection.turns = function(fromWayId, maxViaWay) { - if (!fromWayId) { return []; } - if (!maxViaWay) { maxViaWay = 0; } - - var vgraph = intersection.graph; - var keyVertexIds = intersection.vertices.map(function(v) { return v.id; }); - - var start = vgraph.entity(fromWayId); - if (!start || !(start.__from || start.__via)) { return []; } - - // maxViaWay=0 from-*-to (0 vias) - // maxViaWay=1 from-*-via-*-to (1 via max) - // maxViaWay=2 from-*-via-*-via-*-to (2 vias max) - var maxPathLength = (maxViaWay * 2) + 3; - var turns = []; - - step(start); - return turns; - - - // traverse the intersection graph and find all the valid paths - function step(entity, currPath, currRestrictions, matchedRestriction) { - currPath = (currPath || []).slice(); // shallow copy - if (currPath.length >= maxPathLength) { return; } - currPath.push(entity.id); - currRestrictions = (currRestrictions || []).slice(); // shallow copy - var i, j; - - if (entity.type === 'node') { - var parents = vgraph.parentWays(entity); - var nextWays = []; - - // which ways can we step into? - for (i = 0; i < parents.length; i++) { - var way = parents[i]; - - // if next way is a oneway incoming to this vertex, skip - if (way.__oneWay && way.nodes[0] !== entity.id) { continue; } - - // if we have seen it before (allowing for an initial u-turn), skip - if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) { continue; } - - // Check all "current" restrictions (where we've already walked the `FROM`) - var restrict = undefined; - for (j = 0; j < currRestrictions.length; j++) { - var restriction = currRestrictions[j]; - var f = restriction.memberByRole('from'); - var v = restriction.membersByRole('via'); - var t = restriction.memberByRole('to'); - var isOnly = /^only_/.test(restriction.tags.restriction); - - // Does the current path match this turn restriction? - var matchesFrom = (f.id === fromWayId); - var matchesViaTo = false; - var isAlongOnlyPath = false; - - if (t.id === way.id) { // match TO - - if (v.length === 1 && v[0].type === 'node') { // match VIA node - matchesViaTo = (v[0].id === entity.id && ( - (matchesFrom && currPath.length === 2) || - (!matchesFrom && currPath.length > 2) - )); - - } else { // match all VIA ways - var pathVias = []; - for (k = 2; k < currPath.length; k +=2 ) { // k = 2 skips FROM - pathVias.push(currPath[k]); // (path goes way-node-way...) - } - var restrictionVias = []; - for (k = 0; k < v.length; k++) { - if (v[k].type === 'way') { - restrictionVias.push(v[k].id); - } - } - var diff = utilArrayDifference(pathVias, restrictionVias); - matchesViaTo = !diff.length; - } - - } else if (isOnly) { - for (k = 0; k < v.length; k++) { - // way doesn't match TO, but is one of the via ways along the path of an "only" - if (v[k].type === 'way' && v[k].id === way.id) { - isAlongOnlyPath = true; - break; - } - } - } - - if (matchesViaTo) { - if (isOnly) { - restrict = { id: restriction.id, direct: matchesFrom, from: f.id, only: true, end: true }; - } else { - restrict = { id: restriction.id, direct: matchesFrom, from: f.id, no: true, end: true }; - } - } else { // indirect - caused by a different nearby restriction - if (isAlongOnlyPath) { - restrict = { id: restriction.id, direct: false, from: f.id, only: true, end: false }; - } else if (isOnly) { - restrict = { id: restriction.id, direct: false, from: f.id, no: true, end: true }; - } - } - - // stop looking if we find a "direct" restriction (matching FROM, VIA, TO) - if (restrict && restrict.direct) - { break; } - } - - nextWays.push({ way: way, restrict: restrict }); - } - - nextWays.forEach(function(nextWay) { - step(nextWay.way, currPath, currRestrictions, nextWay.restrict); - }); - - - } else { // entity.type === 'way' - if (currPath.length >= 3) { // this is a "complete" path.. - var turnPath = currPath.slice(); // shallow copy + this.description = "Output Feedback"; + this.name = "ofb"; - // an indirect restriction - only include the partial path (starting at FROM) - if (matchedRestriction && matchedRestriction.direct === false) { - for (i = 0; i < turnPath.length; i++) { - if (turnPath[i] === matchedRestriction.from) { - turnPath = turnPath.slice(i); - break; - } - } - } + if (!iv) { + iv = createArray(16); + } else if (iv.length != 16) { + throw new Error('invalid initialation vector size (must be 16 bytes)'); + } - var turn = pathToTurn(turnPath); - if (turn) { - if (matchedRestriction) { - turn.restrictionID = matchedRestriction.id; - turn.no = matchedRestriction.no; - turn.only = matchedRestriction.only; - turn.direct = matchedRestriction.direct; - } - turns.push(osmTurn(turn)); - } + this._lastPrecipher = coerceArray(iv, true); + this._lastPrecipherIndex = 16; + this._aes = new AES(key); + }; - if (currPath[0] === currPath[2]) { return; } // if we made a u-turn - stop here - } + ModeOfOperationOFB.prototype.encrypt = function (plaintext) { + var encrypted = coerceArray(plaintext, true); - if (matchedRestriction && matchedRestriction.end) { return; } // don't advance any further + for (var i = 0; i < encrypted.length; i++) { + if (this._lastPrecipherIndex === 16) { + this._lastPrecipher = this._aes.encrypt(this._lastPrecipher); + this._lastPrecipherIndex = 0; + } - // which nodes can we step into? - var n1 = vgraph.entity(entity.first()); - var n2 = vgraph.entity(entity.last()); - var dist = geoSphericalDistance(n1.loc, n2.loc); - var nextNodes = []; + encrypted[i] ^= this._lastPrecipher[this._lastPrecipherIndex++]; + } - if (currPath.length > 1) { - if (dist > maxDistance) { return; } // the next node is too far - if (!entity.__via) { return; } // this way is a leaf / can't be a via - } + return encrypted; + }; // Decryption is symetric - if (!entity.__oneWay && // bidirectional.. - keyVertexIds.indexOf(n1.id) !== -1 && // key vertex.. - currPath.indexOf(n1.id) === -1) { // haven't seen it yet.. - nextNodes.push(n1); // can advance to first node - } - if (keyVertexIds.indexOf(n2.id) !== -1 && // key vertex.. - currPath.indexOf(n2.id) === -1) { // haven't seen it yet.. - nextNodes.push(n2); // can advance to last node - } - nextNodes.forEach(function(nextNode) { - // gather restrictions FROM this way - var fromRestrictions = vgraph.parentRelations(entity).filter(function(r) { - if (!r.isRestriction()) { return false; } - - var f = r.memberByRole('from'); - if (!f || f.id !== entity.id) { return false; } - - var isOnly = /^only_/.test(r.tags.restriction); - if (!isOnly) { return true; } - - // `only_` restrictions only matter along the direction of the VIA - #4849 - var isOnlyVia = false; - var v = r.membersByRole('via'); - if (v.length === 1 && v[0].type === 'node') { // via node - isOnlyVia = (v[0].id === nextNode.id); - } else { // via way(s) - for (var i = 0; i < v.length; i++) { - if (v[i].type !== 'way') { continue; } - var viaWay = vgraph.entity(v[i].id); - if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) { - isOnlyVia = true; - break; - } - } - } - return isOnlyVia; - }); + ModeOfOperationOFB.prototype.decrypt = ModeOfOperationOFB.prototype.encrypt; + /** + * Counter object for CTR common mode of operation + */ - step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false); - }); - } - } + var Counter = function Counter(initialValue) { + if (!(this instanceof Counter)) { + throw Error('Counter must be instanitated with `new`'); + } // We allow 0, but anything false-ish uses the default 1 - // assumes path is alternating way-node-way of odd length - function pathToTurn(path) { - if (path.length < 3) { return; } - var fromWayId, fromNodeId, fromVertexId; - var toWayId, toNodeId, toVertexId; - var viaWayIds, viaNodeId, isUturn; + if (initialValue !== 0 && !initialValue) { + initialValue = 1; + } - fromWayId = path[0]; - toWayId = path[path.length - 1]; + if (typeof initialValue === 'number') { + this._counter = createArray(16); + this.setValue(initialValue); + } else { + this.setBytes(initialValue); + } + }; - if (path.length === 3 && fromWayId === toWayId) { // u turn - var way = vgraph.entity(fromWayId); - if (way.__oneWay) { return null; } + Counter.prototype.setValue = function (value) { + if (typeof value !== 'number' || parseInt(value) != value) { + throw new Error('invalid counter value (must be an integer)'); + } // We cannot safely handle numbers beyond the safe range for integers - isUturn = true; - viaNodeId = fromVertexId = toVertexId = path[1]; - fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId); - } else { - isUturn = false; - fromVertexId = path[1]; - fromNodeId = adjacentNode(fromWayId, fromVertexId); - toVertexId = path[path.length - 2]; - toNodeId = adjacentNode(toWayId, toVertexId); - - if (path.length === 3) { - viaNodeId = path[1]; - } else { - viaWayIds = path.filter(function(entityId) { return entityId[0] === 'w'; }); - viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1); // remove first, last - } - } + if (value > Number.MAX_SAFE_INTEGER) { + throw new Error('integer value out of safe range'); + } - return { - key: path.join('_'), - path: path, - from: { node: fromNodeId, way: fromWayId, vertex: fromVertexId }, - via: { node: viaNodeId, ways: viaWayIds }, - to: { node: toNodeId, way: toWayId, vertex: toVertexId }, - u: isUturn - }; + for (var index = 15; index >= 0; --index) { + this._counter[index] = value % 256; + value = parseInt(value / 256); + } + }; + Counter.prototype.setBytes = function (bytes) { + bytes = coerceArray(bytes, true); - function adjacentNode(wayId, affixId) { - var nodes = vgraph.entity(wayId).nodes; - return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2]; - } - } + if (bytes.length != 16) { + throw new Error('invalid counter bytes size (must be 16 bytes)'); + } + this._counter = bytes; }; - return intersection; - } + Counter.prototype.increment = function () { + for (var i = 15; i >= 0; i--) { + if (this._counter[i] === 255) { + this._counter[i] = 0; + } else { + this._counter[i]++; + break; + } + } + }; + /** + * Mode Of Operation - Counter (CTR) + */ - function osmInferRestriction(graph, turn, projection) { - var fromWay = graph.entity(turn.from.way); - var fromNode = graph.entity(turn.from.node); - var fromVertex = graph.entity(turn.from.vertex); - var toWay = graph.entity(turn.to.way); - var toNode = graph.entity(turn.to.node); - var toVertex = graph.entity(turn.to.vertex); + var ModeOfOperationCTR = function ModeOfOperationCTR(key, counter) { + if (!(this instanceof ModeOfOperationCTR)) { + throw Error('AES must be instanitated with `new`'); + } - var fromOneWay = (fromWay.tags.oneway === 'yes'); - var toOneWay = (toWay.tags.oneway === 'yes'); - var angle = (geoAngle(fromVertex, fromNode, projection) - - geoAngle(toVertex, toNode, projection)) * 180 / Math.PI; + this.description = "Counter"; + this.name = "ctr"; - while (angle < 0) - { angle += 360; } + if (!(counter instanceof Counter)) { + counter = new Counter(counter); + } - if (fromNode === toNode) - { return 'no_u_turn'; } - if ((angle < 23 || angle > 336) && fromOneWay && toOneWay) - { return 'no_u_turn'; } // wider tolerance for u-turn if both ways are oneway - if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex) - { return 'no_u_turn'; } // even wider tolerance for u-turn if there is a via way (from !== to) - if (angle < 158) - { return 'no_right_turn'; } - if (angle > 202) - { return 'no_left_turn'; } + this._counter = counter; + this._remainingCounter = null; + this._remainingCounterIndex = 16; + this._aes = new AES(key); + }; - return 'no_straight_on'; - } + ModeOfOperationCTR.prototype.encrypt = function (plaintext) { + var encrypted = coerceArray(plaintext, true); - function actionMergePolygon(ids, newRelationId) { + for (var i = 0; i < encrypted.length; i++) { + if (this._remainingCounterIndex === 16) { + this._remainingCounter = this._aes.encrypt(this._counter._counter); + this._remainingCounterIndex = 0; - function groupEntities(graph) { - var entities = ids.map(function (id) { return graph.entity(id); }); - var geometryGroups = utilArrayGroupBy(entities, function(entity) { - if (entity.type === 'way' && entity.isClosed()) { - return 'closedWay'; - } else if (entity.type === 'relation' && entity.isMultipolygon()) { - return 'multipolygon'; - } else { - return 'other'; - } - }); + this._counter.increment(); + } - return Object.assign( - { closedWay: [], multipolygon: [], other: [] }, - geometryGroups - ); - } + encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++]; + } + return encrypted; + }; // Decryption is symetric - var action = function(graph) { - var entities = groupEntities(graph); - // An array representing all the polygons that are part of the multipolygon. - // - // Each element is itself an array of objects with an id property, and has a - // locs property which is an array of the locations forming the polygon. - var polygons = entities.multipolygon.reduce(function(polygons, m) { - return polygons.concat(osmJoinWays(m.members, graph)); - }, []).concat(entities.closedWay.map(function(d) { - var member = [{id: d.id}]; - member.nodes = graph.childNodes(d); - return member; - })); + ModeOfOperationCTR.prototype.decrypt = ModeOfOperationCTR.prototype.encrypt; /////////////////////// + // Padding + // See:https://tools.ietf.org/html/rfc2315 - // contained is an array of arrays of boolean values, - // where contained[j][k] is true iff the jth way is - // contained by the kth way. - var contained = polygons.map(function(w, i) { - return polygons.map(function(d, n) { - if (i === n) { return null; } - return geoPolygonContainsPolygon( - d.nodes.map(function(n) { return n.loc; }), - w.nodes.map(function(n) { return n.loc; }) - ); - }); - }); + function pkcs7pad(data) { + data = coerceArray(data, true); + var padder = 16 - data.length % 16; + var result = createArray(data.length + padder); + copyArray(data, result); - // Sort all polygons as either outer or inner ways - var members = []; - var outer = true; + for (var i = data.length; i < result.length; i++) { + result[i] = padder; + } - while (polygons.length) { - extractUncontained(polygons); - polygons = polygons.filter(isContained); - contained = contained.filter(isContained).map(filterContained); - } + return result; + } - function isContained(d, i) { - return contained[i].some(function(val) { return val; }); - } + function pkcs7strip(data) { + data = coerceArray(data, true); - function filterContained(d) { - return d.filter(isContained); - } + if (data.length < 16) { + throw new Error('PKCS#7 invalid length'); + } - function extractUncontained(polygons) { - polygons.forEach(function(d, i) { - if (!isContained(d, i)) { - d.forEach(function(member) { - members.push({ - type: 'way', - id: member.id, - role: outer ? 'outer' : 'inner' - }); - }); - } - }); - outer = !outer; - } + var padder = data[data.length - 1]; - // Move all tags to one relation - var relation = entities.multipolygon[0] || - osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }}); + if (padder > 16) { + throw new Error('PKCS#7 padding byte out of range'); + } - entities.multipolygon.slice(1).forEach(function(m) { - relation = relation.mergeTags(m.tags); - graph = graph.remove(m); - }); + var length = data.length - padder; - entities.closedWay.forEach(function(way) { - function isThisOuter(m) { - return m.id === way.id && m.role !== 'inner'; - } - if (members.some(isThisOuter)) { - relation = relation.mergeTags(way.tags); - graph = graph.replace(way.update({ tags: {} })); - } - }); + for (var i = 0; i < padder; i++) { + if (data[length + i] !== padder) { + throw new Error('PKCS#7 invalid padding byte'); + } + } - return graph.replace(relation.update({ - members: members, - tags: utilObjectOmit(relation.tags, ['area']) - })); - }; + var result = createArray(length); + copyArray(data, result, 0, 0, length); + return result; + } /////////////////////// + // Exporting + // The block cipher - action.disabled = function(graph) { - var entities = groupEntities(graph); - if (entities.other.length > 0 || - entities.closedWay.length + entities.multipolygon.length < 2) { - return 'not_eligible'; - } - if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); })) { - return 'incomplete_relation'; + var aesjs = { + AES: AES, + Counter: Counter, + ModeOfOperation: { + ecb: ModeOfOperationECB, + cbc: ModeOfOperationCBC, + cfb: ModeOfOperationCFB, + ofb: ModeOfOperationOFB, + ctr: ModeOfOperationCTR + }, + utils: { + hex: convertHex, + utf8: convertUtf8 + }, + padding: { + pkcs7: { + pad: pkcs7pad, + strip: pkcs7strip } + }, + _arrayTest: { + coerceArray: coerceArray, + createArray: createArray, + copyArray: copyArray + } + }; // node.js - if (!entities.multipolygon.length) { - var sharedMultipolygons = []; - entities.closedWay.forEach(function(way, i) { - if (i === 0) { - sharedMultipolygons = graph.parentMultipolygons(way); - } else { - sharedMultipolygons = utilArrayIntersection(sharedMultipolygons, graph.parentMultipolygons(way)); - } - }); - sharedMultipolygons = sharedMultipolygons.filter(function(relation) { - return relation.members.length === entities.closedWay.length; - }); - if (sharedMultipolygons.length) { - // don't create a new multipolygon if it'd be redundant - return 'not_eligible'; - } - } else if (entities.closedWay.some(function(way) { - return utilArrayIntersection(graph.parentMultipolygons(way), entities.multipolygon).length; - })) { - // don't add a way to a multipolygon again if it's already a member - return 'not_eligible'; - } - }; + { + module.exports = aesjs; // RequireJS/AMD + // http://www.requirejs.org/docs/api.html + // https://github.com/amdjs/amdjs-api/wiki/AMD + } + })(); + })(aesJs); + var aesjs = aesJs.exports; - return action; - } + // We can use keys that are 128 bits (16 bytes), 192 bits (24 bytes) or 256 bits (32 bytes). + // To generate a random key: window.crypto.getRandomValues(new Uint8Array(16)); + // This default signing key is built into iD and can be used to mask/unmask sensitive values. - // do not edit .js files directly - edit src/index.jst + var DEFAULT_128 = [250, 157, 60, 79, 142, 134, 229, 129, 138, 126, 210, 129, 29, 71, 160, 208]; + function utilAesEncrypt(text, key) { + key = key || DEFAULT_128; + var textBytes = aesjs.utils.utf8.toBytes(text); + var aesCtr = new aesjs.ModeOfOperation.ctr(key); + var encryptedBytes = aesCtr.encrypt(textBytes); + var encryptedHex = aesjs.utils.hex.fromBytes(encryptedBytes); + return encryptedHex; + } + function utilAesDecrypt(encryptedHex, key) { + key = key || DEFAULT_128; + var encryptedBytes = aesjs.utils.hex.toBytes(encryptedHex); + var aesCtr = new aesjs.ModeOfOperation.ctr(key); + var decryptedBytes = aesCtr.decrypt(encryptedBytes); + var text = aesjs.utils.utf8.fromBytes(decryptedBytes); + return text; + } + function utilCleanTags(tags) { + var out = {}; + for (var k in tags) { + if (!k) continue; + var v = tags[k]; - var fastDeepEqual = function equal(a, b) { - if (a === b) { return true; } + if (v !== undefined) { + out[k] = cleanValue(k, v); + } + } - if (a && b && typeof a == 'object' && typeof b == 'object') { - if (a.constructor !== b.constructor) { return false; } + return out; - var length, i, keys; - if (Array.isArray(a)) { - length = a.length; - if (length != b.length) { return false; } - for (i = length; i-- !== 0;) - { if (!equal(a[i], b[i])) { return false; } } - return true; + function cleanValue(k, v) { + function keepSpaces(k) { + return /_hours|_times|:conditional$/.test(k); } + function skip(k) { + return /^(description|note|fixme)$/.test(k); + } + if (skip(k)) return v; + var cleaned = v.split(';').map(function (s) { + return s.trim(); + }).join(keepSpaces(k) ? '; ' : ';'); // The code below is not intended to validate websites and emails. + // It is only intended to prevent obvious copy-paste errors. (#2323) + // clean website- and email-like tags - if (a.constructor === RegExp) { return a.source === b.source && a.flags === b.flags; } - if (a.valueOf !== Object.prototype.valueOf) { return a.valueOf() === b.valueOf(); } - if (a.toString !== Object.prototype.toString) { return a.toString() === b.toString(); } + if (k.indexOf('website') !== -1 || k.indexOf('email') !== -1 || cleaned.indexOf('http') === 0) { + cleaned = cleaned.replace(/[\u200B-\u200F\uFEFF]/g, ''); // strip LRM and other zero width chars + } - keys = Object.keys(a); - length = keys.length; - if (length !== Object.keys(b).length) { return false; } + return cleaned; + } + } - for (i = length; i-- !== 0;) - { if (!Object.prototype.hasOwnProperty.call(b, keys[i])) { return false; } } + var _detected; - for (i = length; i-- !== 0;) { - var key = keys[i]; + function utilDetect(refresh) { + if (_detected && !refresh) return _detected; + _detected = {}; + var ua = navigator.userAgent; + var m = null; + /* Browser */ - if (!equal(a[key], b[key])) { return false; } - } + m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i); // Edge - return true; + if (m !== null) { + _detected.browser = m[1]; + _detected.version = m[2]; } - // true if both NaN, false otherwise - return a!==a && b!==b; - }; - - // Text diff algorithm following Hunt and McIlroy 1976. - // J. W. Hunt and M. D. McIlroy, An algorithm for differential buffer - // comparison, Bell Telephone Laboratories CSTR #41 (1976) - // http://www.cs.dartmouth.edu/~doug/ - // https://en.wikipedia.org/wiki/Longest_common_subsequence_problem - // - // Expects two arrays, finds longest common sequence - function LCS(buffer1, buffer2) { + if (!_detected.browser) { + m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i); // IE11 - var equivalenceClasses = {}; - for (var j = 0; j < buffer2.length; j++) { - var item = buffer2[j]; - if (equivalenceClasses[item]) { - equivalenceClasses[item].push(j); - } else { - equivalenceClasses[item] = [j]; + if (m !== null) { + _detected.browser = 'msie'; + _detected.version = m[1]; } } - var NULLRESULT = { buffer1index: -1, buffer2index: -1, chain: null }; - var candidates = [NULLRESULT]; - - for (var i = 0; i < buffer1.length; i++) { - var item$1 = buffer1[i]; - var buffer2indices = equivalenceClasses[item$1] || []; - var r = 0; - var c = candidates[0]; + if (!_detected.browser) { + m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i); // Opera 15+ - for (var jx = 0; jx < buffer2indices.length; jx++) { - var j$1 = buffer2indices[jx]; + if (m !== null) { + _detected.browser = 'Opera'; + _detected.version = m[2]; + } + } - var s = (void 0); - for (s = r; s < candidates.length; s++) { - if ((candidates[s].buffer2index < j$1) && ((s === candidates.length - 1) || (candidates[s + 1].buffer2index > j$1))) { - break; - } - } + if (!_detected.browser) { + m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i); - if (s < candidates.length) { - var newCandidate = { buffer1index: i, buffer2index: j$1, chain: candidates[s] }; - if (r === candidates.length) { - candidates.push(c); - } else { - candidates[r] = c; - } - r = s + 1; - c = newCandidate; - if (r === candidates.length) { - break; // no point in examining further (j)s - } - } + if (m !== null) { + _detected.browser = m[1]; + _detected.version = m[2]; + m = ua.match(/version\/([\.\d]+)/i); + if (m !== null) _detected.version = m[1]; } - - candidates[r] = c; } - // At this point, we know the LCS: it's in the reverse of the - // linked-list through .chain of candidates[candidates.length - 1]. - - return candidates[candidates.length - 1]; - } + if (!_detected.browser) { + _detected.browser = navigator.appName; + _detected.version = navigator.appVersion; + } // keep major.minor version only.. - // We apply the LCS to give a simple representation of the - // offsets and lengths of mismatched chunks in the input - // buffers. This is used by diff3MergeRegions. - function diffIndices(buffer1, buffer2) { - var lcs = LCS(buffer1, buffer2); - var result = []; - var tail1 = buffer1.length; - var tail2 = buffer2.length; + _detected.version = _detected.version.split(/\W/).slice(0, 2).join('.'); // detect other browser capabilities + // Legacy Opera has incomplete svg style support. See #715 - for (var candidate = lcs; candidate !== null; candidate = candidate.chain) { - var mismatchLength1 = tail1 - candidate.buffer1index - 1; - var mismatchLength2 = tail2 - candidate.buffer2index - 1; - tail1 = candidate.buffer1index; - tail2 = candidate.buffer2index; + _detected.opera = _detected.browser.toLowerCase() === 'opera' && parseFloat(_detected.version) < 15; - if (mismatchLength1 || mismatchLength2) { - result.push({ - buffer1: [tail1 + 1, mismatchLength1], - buffer1Content: buffer1.slice(tail1 + 1, tail1 + 1 + mismatchLength1), - buffer2: [tail2 + 1, mismatchLength2], - buffer2Content: buffer2.slice(tail2 + 1, tail2 + 1 + mismatchLength2) - }); - } + if (_detected.browser.toLowerCase() === 'msie') { + _detected.ie = true; + _detected.browser = 'Internet Explorer'; + _detected.support = parseFloat(_detected.version) >= 11; + } else { + _detected.ie = false; + _detected.support = true; } - result.reverse(); - return result; - } - - - // Given three buffers, A, O, and B, where both A and B are - // independently derived from O, returns a fairly complicated - // internal representation of merge decisions it's taken. The - // interested reader may wish to consult - // - // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce. - // 'A Formal Investigation of ' In Arvind and Prasad, - // editors, Foundations of Software Technology and Theoretical - // Computer Science (FSTTCS), December 2007. - // - // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf) - // - function diff3MergeRegions(a, o, b) { + _detected.filedrop = window.FileReader && 'ondrop' in window; + _detected.download = !(_detected.ie || _detected.browser.toLowerCase() === 'edge'); + _detected.cssfilters = !(_detected.ie || _detected.browser.toLowerCase() === 'edge'); + /* Platform */ - // "hunks" are array subsets where `a` or `b` are different from `o` - // https://www.gnu.org/software/diffutils/manual/html_node/diff3-Hunks.html - var hunks = []; - function addHunk(h, ab) { - hunks.push({ - ab: ab, - oStart: h.buffer1[0], - oLength: h.buffer1[1], // length of o to remove - abStart: h.buffer2[0], - abLength: h.buffer2[1] // length of a/b to insert - // abContent: (ab === 'a' ? a : b).slice(h.buffer2[0], h.buffer2[0] + h.buffer2[1]) - }); + if (/Win/.test(ua)) { + _detected.os = 'win'; + _detected.platform = 'Windows'; + } else if (/Mac/.test(ua)) { + _detected.os = 'mac'; + _detected.platform = 'Macintosh'; + } else if (/X11/.test(ua) || /Linux/.test(ua)) { + _detected.os = 'linux'; + _detected.platform = 'Linux'; + } else { + _detected.os = 'win'; + _detected.platform = 'Unknown'; } - diffIndices(o, a).forEach(function (item) { return addHunk(item, 'a'); }); - diffIndices(o, b).forEach(function (item) { return addHunk(item, 'b'); }); - hunks.sort(function (x,y) { return x.oStart - y.oStart; }); + _detected.isMobileWebKit = (/\b(iPad|iPhone|iPod)\b/.test(ua) || // HACK: iPadOS 13+ requests desktop sites by default by using a Mac user agent, + // so assume any "mac" with multitouch is actually iOS + navigator.platform === 'MacIntel' && 'maxTouchPoints' in navigator && navigator.maxTouchPoints > 1) && /WebKit/.test(ua) && !/Edge/.test(ua) && !window.MSStream; + /* Locale */ + // An array of locales requested by the browser in priority order. - var results = []; - var currOffset = 0; + _detected.browserLocales = Array.from(new Set( // remove duplicates + [navigator.language].concat(navigator.languages || []).concat([// old property for backwards compatibility + navigator.userLanguage]) // remove any undefined values + .filter(Boolean))); + /* Host */ - function advanceTo(endOffset) { - if (endOffset > currOffset) { - results.push({ - stable: true, - buffer: 'o', - bufferStart: currOffset, - bufferLength: endOffset - currOffset, - bufferContent: o.slice(currOffset, endOffset) - }); - currOffset = endOffset; - } + var loc = window.top.location; + var origin = loc.origin; + + if (!origin) { + // for unpatched IE11 + origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port : ''); } - while (hunks.length) { - var hunk = hunks.shift(); - var regionStart = hunk.oStart; - var regionEnd = hunk.oStart + hunk.oLength; - var regionHunks = [hunk]; - advanceTo(regionStart); + _detected.host = origin + loc.pathname; + return _detected; + } - // Try to pull next overlapping hunk into this region - while (hunks.length) { - var nextHunk = hunks[0]; - var nextHunkStart = nextHunk.oStart; - if (nextHunkStart > regionEnd) { break; } // no overlap + // Like selection.property('value', ...), but avoids no-op value sets, + // which can result in layout/repaint thrashing in some situations. - regionEnd = Math.max(regionEnd, nextHunkStart + nextHunk.oLength); - regionHunks.push(hunks.shift()); + /** @returns {string} */ + function utilGetSetValue(selection, value) { + function d3_selection_value(value) { + function valueNull() { + delete this.value; } - if (regionHunks.length === 1) { - // Only one hunk touches this region, meaning that there is no conflict here. - // Either `a` or `b` is inserting into a region of `o` unchanged by the other. - if (hunk.abLength > 0) { - var buffer = (hunk.ab === 'a' ? a : b); - results.push({ - stable: true, - buffer: hunk.ab, - bufferStart: hunk.abStart, - bufferLength: hunk.abLength, - bufferContent: buffer.slice(hunk.abStart, hunk.abStart + hunk.abLength) - }); - } - } else { - // A true a/b conflict. Determine the bounds involved from `a`, `o`, and `b`. - // Effectively merge all the `a` hunks into one giant hunk, then do the - // same for the `b` hunks; then, correct for skew in the regions of `o` - // that each side changed, and report appropriate spans for the three sides. - var bounds = { - a: [a.length, -1, o.length, -1], - b: [b.length, -1, o.length, -1] - }; - while (regionHunks.length) { - hunk = regionHunks.shift(); - var oStart = hunk.oStart; - var oEnd = oStart + hunk.oLength; - var abStart = hunk.abStart; - var abEnd = abStart + hunk.abLength; - var b$1 = bounds[hunk.ab]; - b$1[0] = Math.min(abStart, b$1[0]); - b$1[1] = Math.max(abEnd, b$1[1]); - b$1[2] = Math.min(oStart, b$1[2]); - b$1[3] = Math.max(oEnd, b$1[3]); + function valueConstant() { + if (this.value !== value) { + this.value = value; } + } - var aStart = bounds.a[0] + (regionStart - bounds.a[2]); - var aEnd = bounds.a[1] + (regionEnd - bounds.a[3]); - var bStart = bounds.b[0] + (regionStart - bounds.b[2]); - var bEnd = bounds.b[1] + (regionEnd - bounds.b[3]); + function valueFunction() { + var x = value.apply(this, arguments); - var result = { - stable: false, - aStart: aStart, - aLength: aEnd - aStart, - aContent: a.slice(aStart, aEnd), - oStart: regionStart, - oLength: regionEnd - regionStart, - oContent: o.slice(regionStart, regionEnd), - bStart: bStart, - bLength: bEnd - bStart, - bContent: b.slice(bStart, bEnd) - }; - results.push(result); + if (x === null || x === undefined) { + delete this.value; + } else if (this.value !== x) { + this.value = x; + } } - currOffset = regionEnd; + + return value === null || value === undefined ? valueNull : typeof value === 'function' ? valueFunction : valueConstant; } - advanceTo(o.length); + if (arguments.length === 1) { + return selection.property('value'); + } - return results; + return selection.each(d3_selection_value(value)); } + function utilKeybinding(namespace) { + var _keybindings = {}; - // Applies the output of diff3MergeRegions to actually - // construct the merged buffer; the returned result alternates - // between 'ok' and 'conflict' blocks. - // A "false conflict" is where `a` and `b` both change the same from `o` - function diff3Merge(a, o, b, options) { - var defaults = { - excludeFalseConflicts: true, - stringSeparator: /\s+/ - }; - options = Object.assign(defaults, options); + function testBindings(d3_event, isCapturing) { + var didMatch = false; + var bindings = Object.keys(_keybindings).map(function (id) { + return _keybindings[id]; + }); + var i, binding; // Most key shortcuts will accept either lower or uppercase ('h' or 'H'), + // so we don't strictly match on the shift key, but we prioritize + // shifted keybindings first, and fallback to unshifted only if no match. + // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z') + // priority match shifted keybindings first - var aString = (typeof a === 'string'); - var oString = (typeof o === 'string'); - var bString = (typeof b === 'string'); + for (i = 0; i < bindings.length; i++) { + binding = bindings[i]; + if (!binding.event.modifiers.shiftKey) continue; // no shift - if (aString) { a = a.split(options.stringSeparator); } - if (oString) { o = o.split(options.stringSeparator); } - if (bString) { b = b.split(options.stringSeparator); } + if (!!binding.capture !== isCapturing) continue; - var results = []; - var regions = diff3MergeRegions(a, o, b); + if (matches(d3_event, binding, true)) { + binding.callback(d3_event); + didMatch = true; // match a max of one binding per event - var okBuffer = []; - function flushOk() { - if (okBuffer.length) { - results.push({ ok: okBuffer }); + break; + } } - okBuffer = []; - } - function isFalseConflict(a, b) { - if (a.length !== b.length) { return false; } - for (var i = 0; i < a.length; i++) { - if (a[i] !== b[i]) { return false; } - } - return true; - } + if (didMatch) return; // then unshifted keybindings - regions.forEach(function (region) { - if (region.stable) { - okBuffer.push.apply(okBuffer, region.bufferContent); - } else { - if (options.excludeFalseConflicts && isFalseConflict(region.aContent, region.bContent)) { - okBuffer.push.apply(okBuffer, region.aContent); - } else { - flushOk(); - results.push({ - conflict: { - a: region.aContent, - aIndex: region.aStart, - o: region.oContent, - oIndex: region.oStart, - b: region.bContent, - bIndex: region.bStart - } - }); + for (i = 0; i < bindings.length; i++) { + binding = bindings[i]; + if (binding.event.modifiers.shiftKey) continue; // shift + + if (!!binding.capture !== isCapturing) continue; + + if (matches(d3_event, binding, false)) { + binding.callback(d3_event); + break; } } - }); - flushOk(); - return results; - } + function matches(d3_event, binding, testShift) { + var event = d3_event; + var isMatch = false; + var tryKeyCode = true; // Prefer a match on `KeyboardEvent.key` - function actionMergeRemoteChanges(id, localGraph, remoteGraph, discardTags, formatUser) { - discardTags = discardTags || {}; - var _option = 'safe'; // 'safe', 'force_local', 'force_remote' - var _conflicts = []; + if (event.key !== undefined) { + tryKeyCode = event.key.charCodeAt(0) > 255; // outside ISO-Latin-1 + isMatch = true; - function user(d) { - return (typeof formatUser === 'function') ? formatUser(d) : d; - } + if (binding.event.key === undefined) { + isMatch = false; + } else if (Array.isArray(binding.event.key)) { + if (binding.event.key.map(function (s) { + return s.toLowerCase(); + }).indexOf(event.key.toLowerCase()) === -1) { + isMatch = false; + } + } else { + if (event.key.toLowerCase() !== binding.event.key.toLowerCase()) { + isMatch = false; + } + } + } // Fallback match on `KeyboardEvent.keyCode`, can happen if: + // - browser doesn't support `KeyboardEvent.key` + // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?) - function mergeLocation(remote, target) { - function pointEqual(a, b) { - var epsilon = 1e-6; - return (Math.abs(a[0] - b[0]) < epsilon) && (Math.abs(a[1] - b[1]) < epsilon); - } + if (!isMatch && tryKeyCode) { + isMatch = event.keyCode === binding.event.keyCode; + } - if (_option === 'force_local' || pointEqual(target.loc, remote.loc)) { - return target; - } - if (_option === 'force_remote') { - return target.update({loc: remote.loc}); - } + if (!isMatch) return false; // test modifier keys + + if (!(event.ctrlKey && event.altKey)) { + // if both are set, assume AltGr and skip it - #4096 + if (event.ctrlKey !== binding.event.modifiers.ctrlKey) return false; + if (event.altKey !== binding.event.modifiers.altKey) return false; + } - _conflicts.push(_t('merge_remote_changes.conflict.location', { user: user(remote.user) })); - return target; + if (event.metaKey !== binding.event.modifiers.metaKey) return false; + if (testShift && event.shiftKey !== binding.event.modifiers.shiftKey) return false; + return true; } + } + + function capture(d3_event) { + testBindings(d3_event, true); + } + function bubble(d3_event) { + var tagName = select(d3_event.target).node().tagName; - function mergeNodes(base, remote, target) { - if (_option === 'force_local' || fastDeepEqual(target.nodes, remote.nodes)) { - return target; - } - if (_option === 'force_remote') { - return target.update({nodes: remote.nodes}); - } + if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') { + return; + } - var ccount = _conflicts.length; - var o = base.nodes || []; - var a = target.nodes || []; - var b = remote.nodes || []; - var nodes = []; - var hunks = diff3Merge(a, o, b, { excludeFalseConflicts: true }); + testBindings(d3_event, false); + } - for (var i = 0; i < hunks.length; i++) { - var hunk = hunks[i]; - if (hunk.ok) { - nodes.push.apply(nodes, hunk.ok); - } else { - // for all conflicts, we can assume c.a !== c.b - // because `diff3Merge` called with `true` option to exclude false conflicts.. - var c = hunk.conflict; - if (fastDeepEqual(c.o, c.a)) { // only changed remotely - nodes.push.apply(nodes, c.b); - } else if (fastDeepEqual(c.o, c.b)) { // only changed locally - nodes.push.apply(nodes, c.a); - } else { // changed both locally and remotely - _conflicts.push(_t('merge_remote_changes.conflict.nodelist', { user: user(remote.user) })); - break; - } - } - } + function keybinding(selection) { + selection = selection || select(document); + selection.on('keydown.capture.' + namespace, capture, true); + selection.on('keydown.bubble.' + namespace, bubble, false); + return keybinding; + } // was: keybinding.off() - return (_conflicts.length === ccount) ? target.update({nodes: nodes}) : target; - } + keybinding.unbind = function (selection) { + _keybindings = []; + selection = selection || select(document); + selection.on('keydown.capture.' + namespace, null); + selection.on('keydown.bubble.' + namespace, null); + return keybinding; + }; - function mergeChildren(targetWay, children, updates, graph) { - function isUsed(node, targetWay) { - var hasInterestingParent = graph.parentWays(node) - .some(function(way) { return way.id !== targetWay.id; }); + keybinding.clear = function () { + _keybindings = {}; + return keybinding; + }; // Remove one or more keycode bindings. - return node.hasInterestingTags() || - hasInterestingParent || - graph.parentRelations(node).length > 0; - } - var ccount = _conflicts.length; + keybinding.off = function (codes, capture) { + var arr = utilArrayUniq([].concat(codes)); - for (var i = 0; i < children.length; i++) { - var id = children[i]; - var node = graph.hasEntity(id); + for (var i = 0; i < arr.length; i++) { + var id = arr[i] + (capture ? '-capture' : '-bubble'); + delete _keybindings[id]; + } - // remove unused childNodes.. - if (targetWay.nodes.indexOf(id) === -1) { - if (node && !isUsed(node, targetWay)) { - updates.removeIds.push(id); - } - continue; - } + return keybinding; + }; // Add one or more keycode bindings. + + + keybinding.on = function (codes, callback, capture) { + if (typeof callback !== 'function') { + return keybinding.off(codes, capture); + } + + var arr = utilArrayUniq([].concat(codes)); + + for (var i = 0; i < arr.length; i++) { + var id = arr[i] + (capture ? '-capture' : '-bubble'); + var binding = { + id: id, + capture: capture, + callback: callback, + event: { + key: undefined, + // preferred + keyCode: 0, + // fallback + modifiers: { + shiftKey: false, + ctrlKey: false, + altKey: false, + metaKey: false + } + } + }; - // restore used childNodes.. - var local = localGraph.hasEntity(id); - var remote = remoteGraph.hasEntity(id); - var target; + if (_keybindings[id]) { + console.warn('warning: duplicate keybinding for "' + id + '"'); // eslint-disable-line no-console + } - if (_option === 'force_remote' && remote && remote.visible) { - updates.replacements.push(remote); + _keybindings[id] = binding; + var matches = arr[i].toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g); - } else if (_option === 'force_local' && local) { - target = osmEntity(local); - if (remote) { - target = target.update({ version: remote.version }); - } - updates.replacements.push(target); + for (var j = 0; j < matches.length; j++) { + // Normalise matching errors + if (matches[j] === '++') matches[j] = '+'; - } else if (_option === 'safe' && local && remote && local.version !== remote.version) { - target = osmEntity(local, { version: remote.version }); - if (remote.visible) { - target = mergeLocation(remote, target); - } else { - _conflicts.push(_t('merge_remote_changes.conflict.deleted', { user: user(remote.user) })); - } + if (matches[j] in utilKeybinding.modifierCodes) { + var prop = utilKeybinding.modifierProperties[utilKeybinding.modifierCodes[matches[j]]]; + binding.event.modifiers[prop] = true; + } else { + binding.event.key = utilKeybinding.keys[matches[j]] || matches[j]; - if (_conflicts.length !== ccount) { break; } - updates.replacements.push(target); - } + if (matches[j] in utilKeybinding.keyCodes) { + binding.event.keyCode = utilKeybinding.keyCodes[matches[j]]; + } } - - return targetWay; + } } + return keybinding; + }; - function updateChildren(updates, graph) { - for (var i = 0; i < updates.replacements.length; i++) { - graph = graph.replace(updates.replacements[i]); - } - if (updates.removeIds.length) { - graph = actionDeleteMultiple(updates.removeIds)(graph); - } - return graph; + return keybinding; + } + /* + * See https://github.com/keithamus/jwerty + */ + + utilKeybinding.modifierCodes = { + // Shift key, ⇧ + '⇧': 16, + shift: 16, + // CTRL key, on Mac: ⌃ + '⌃': 17, + ctrl: 17, + // ALT key, on Mac: ⌥ (Alt) + '⌥': 18, + alt: 18, + option: 18, + // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super) + '⌘': 91, + meta: 91, + cmd: 91, + 'super': 91, + win: 91 + }; + utilKeybinding.modifierProperties = { + 16: 'shiftKey', + 17: 'ctrlKey', + 18: 'altKey', + 91: 'metaKey' + }; + utilKeybinding.plusKeys = ['plus', 'ffplus', '=', 'ffequals', '≠', '±']; + utilKeybinding.minusKeys = ['_', '-', 'ffminus', 'dash', '–', '—']; + utilKeybinding.keys = { + // Backspace key, on Mac: ⌫ (Backspace) + '⌫': 'Backspace', + backspace: 'Backspace', + // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥ + '⇥': 'Tab', + '⇆': 'Tab', + tab: 'Tab', + // Return key, ↩ + '↩': 'Enter', + '↵': 'Enter', + '⏎': 'Enter', + 'return': 'Enter', + enter: 'Enter', + '⌅': 'Enter', + // Pause/Break key + 'pause': 'Pause', + 'pause-break': 'Pause', + // Caps Lock key, ⇪ + '⇪': 'CapsLock', + caps: 'CapsLock', + 'caps-lock': 'CapsLock', + // Escape key, on Mac: ⎋, on Windows: Esc + '⎋': ['Escape', 'Esc'], + escape: ['Escape', 'Esc'], + esc: ['Escape', 'Esc'], + // Space key + space: [' ', 'Spacebar'], + // Page-Up key, or pgup, on Mac: ↖ + '↖': 'PageUp', + pgup: 'PageUp', + 'page-up': 'PageUp', + // Page-Down key, or pgdown, on Mac: ↘ + '↘': 'PageDown', + pgdown: 'PageDown', + 'page-down': 'PageDown', + // END key, on Mac: ⇟ + '⇟': 'End', + end: 'End', + // HOME key, on Mac: ⇞ + '⇞': 'Home', + home: 'Home', + // Insert key, or ins + ins: 'Insert', + insert: 'Insert', + // Delete key, on Mac: ⌦ (Delete) + '⌦': ['Delete', 'Del'], + del: ['Delete', 'Del'], + 'delete': ['Delete', 'Del'], + // Left Arrow Key, or ← + '←': ['ArrowLeft', 'Left'], + left: ['ArrowLeft', 'Left'], + 'arrow-left': ['ArrowLeft', 'Left'], + // Up Arrow Key, or ↑ + '↑': ['ArrowUp', 'Up'], + up: ['ArrowUp', 'Up'], + 'arrow-up': ['ArrowUp', 'Up'], + // Right Arrow Key, or → + '→': ['ArrowRight', 'Right'], + right: ['ArrowRight', 'Right'], + 'arrow-right': ['ArrowRight', 'Right'], + // Up Arrow Key, or ↓ + '↓': ['ArrowDown', 'Down'], + down: ['ArrowDown', 'Down'], + 'arrow-down': ['ArrowDown', 'Down'], + // odities, stuff for backward compatibility (browsers and code): + // Num-Multiply, or * + '*': ['*', 'Multiply'], + star: ['*', 'Multiply'], + asterisk: ['*', 'Multiply'], + multiply: ['*', 'Multiply'], + // Num-Plus or + + '+': ['+', 'Add'], + 'plus': ['+', 'Add'], + // Num-Subtract, or - + '-': ['-', 'Subtract'], + subtract: ['-', 'Subtract'], + 'dash': ['-', 'Subtract'], + // Semicolon + semicolon: ';', + // = or equals + equals: '=', + // Comma, or , + comma: ',', + // Period, or ., or full-stop + period: '.', + 'full-stop': '.', + // Slash, or /, or forward-slash + slash: '/', + 'forward-slash': '/', + // Tick, or `, or back-quote + tick: '`', + 'back-quote': '`', + // Open bracket, or [ + 'open-bracket': '[', + // Back slash, or \ + 'back-slash': '\\', + // Close backet, or ] + 'close-bracket': ']', + // Apostrophe, or Quote, or ' + quote: '\'', + apostrophe: '\'', + // NUMPAD 0-9 + 'num-0': '0', + 'num-1': '1', + 'num-2': '2', + 'num-3': '3', + 'num-4': '4', + 'num-5': '5', + 'num-6': '6', + 'num-7': '7', + 'num-8': '8', + 'num-9': '9', + // F1-F25 + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + f13: 'F13', + f14: 'F14', + f15: 'F15', + f16: 'F16', + f17: 'F17', + f18: 'F18', + f19: 'F19', + f20: 'F20', + f21: 'F21', + f22: 'F22', + f23: 'F23', + f24: 'F24', + f25: 'F25' + }; + utilKeybinding.keyCodes = { + // Backspace key, on Mac: ⌫ (Backspace) + '⌫': 8, + backspace: 8, + // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥ + '⇥': 9, + '⇆': 9, + tab: 9, + // Return key, ↩ + '↩': 13, + '↵': 13, + '⏎': 13, + 'return': 13, + enter: 13, + '⌅': 13, + // Pause/Break key + 'pause': 19, + 'pause-break': 19, + // Caps Lock key, ⇪ + '⇪': 20, + caps: 20, + 'caps-lock': 20, + // Escape key, on Mac: ⎋, on Windows: Esc + '⎋': 27, + escape: 27, + esc: 27, + // Space key + space: 32, + // Page-Up key, or pgup, on Mac: ↖ + '↖': 33, + pgup: 33, + 'page-up': 33, + // Page-Down key, or pgdown, on Mac: ↘ + '↘': 34, + pgdown: 34, + 'page-down': 34, + // END key, on Mac: ⇟ + '⇟': 35, + end: 35, + // HOME key, on Mac: ⇞ + '⇞': 36, + home: 36, + // Insert key, or ins + ins: 45, + insert: 45, + // Delete key, on Mac: ⌦ (Delete) + '⌦': 46, + del: 46, + 'delete': 46, + // Left Arrow Key, or ← + '←': 37, + left: 37, + 'arrow-left': 37, + // Up Arrow Key, or ↑ + '↑': 38, + up: 38, + 'arrow-up': 38, + // Right Arrow Key, or → + '→': 39, + right: 39, + 'arrow-right': 39, + // Up Arrow Key, or ↓ + '↓': 40, + down: 40, + 'arrow-down': 40, + // odities, printing characters that come out wrong: + // Firefox Equals + 'ffequals': 61, + // Num-Multiply, or * + '*': 106, + star: 106, + asterisk: 106, + multiply: 106, + // Num-Plus or + + '+': 107, + 'plus': 107, + // Num-Subtract, or - + '-': 109, + subtract: 109, + // Vertical Bar / Pipe + '|': 124, + // Firefox Plus + 'ffplus': 171, + // Firefox Minus + 'ffminus': 173, + // Semicolon + ';': 186, + semicolon: 186, + // = or equals + '=': 187, + 'equals': 187, + // Comma, or , + ',': 188, + comma: 188, + // Dash / Underscore key + 'dash': 189, + // Period, or ., or full-stop + '.': 190, + period: 190, + 'full-stop': 190, + // Slash, or /, or forward-slash + '/': 191, + slash: 191, + 'forward-slash': 191, + // Tick, or `, or back-quote + '`': 192, + tick: 192, + 'back-quote': 192, + // Open bracket, or [ + '[': 219, + 'open-bracket': 219, + // Back slash, or \ + '\\': 220, + 'back-slash': 220, + // Close backet, or ] + ']': 221, + 'close-bracket': 221, + // Apostrophe, or Quote, or ' + '\'': 222, + quote: 222, + apostrophe: 222 + }; // NUMPAD 0-9 + + var i = 95, + n = 0; + + while (++i < 106) { + utilKeybinding.keyCodes['num-' + n] = i; + ++n; + } // 0-9 + + + i = 47; + n = 0; + + while (++i < 58) { + utilKeybinding.keyCodes[n] = i; + ++n; + } // F1-F25 + + + i = 111; + n = 1; + + while (++i < 136) { + utilKeybinding.keyCodes['f' + n] = i; + ++n; + } // a-z + + + i = 64; + + while (++i < 91) { + utilKeybinding.keyCodes[String.fromCharCode(i).toLowerCase()] = i; + } + + function utilObjectOmit(obj, omitKeys) { + return Object.keys(obj).reduce(function (result, key) { + if (omitKeys.indexOf(key) === -1) { + result[key] = obj[key]; // keep } + return result; + }, {}); + } - function mergeMembers(remote, target) { - if (_option === 'force_local' || fastDeepEqual(target.members, remote.members)) { - return target; - } - if (_option === 'force_remote') { - return target.update({members: remote.members}); - } + // Copies a variable number of methods from source to target. + function utilRebind(target, source) { + var i = 1, + n = arguments.length, + method; + + while (++i < n) { + target[method = arguments[i]] = d3_rebind(target, source, source[method]); + } + + return target; + } // Method is assumed to be a standard D3 getter-setter: + // If passed with no arguments, gets the value. + // If passed with arguments, sets the value and returns the target. + + function d3_rebind(target, source, method) { + return function () { + var value = method.apply(source, arguments); + return value === source ? target : value; + }; + } + + // A per-domain session mutex backed by a cookie and dead man's + // switch. If the session crashes, the mutex will auto-release + // after 5 seconds. + // This accepts a string and returns an object that complies with utilSessionMutexType + function utilSessionMutex(name) { + var mutex = {}; + var intervalID; - _conflicts.push(_t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) })); - return target; - } + function renew() { + var expires = new Date(); + expires.setSeconds(expires.getSeconds() + 5); + document.cookie = name + '=1; expires=' + expires.toUTCString() + '; sameSite=strict'; + } + mutex.lock = function () { + if (intervalID) return true; + var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1'); + if (cookie) return false; + renew(); + intervalID = window.setInterval(renew, 4000); + return true; + }; - function mergeTags(base, remote, target) { - if (_option === 'force_local' || fastDeepEqual(target.tags, remote.tags)) { - return target; - } - if (_option === 'force_remote') { - return target.update({tags: remote.tags}); - } + mutex.unlock = function () { + if (!intervalID) return; + document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT; sameSite=strict'; + clearInterval(intervalID); + intervalID = null; + }; - var ccount = _conflicts.length; - var o = base.tags || {}; - var a = target.tags || {}; - var b = remote.tags || {}; - var keys = utilArrayUnion(utilArrayUnion(Object.keys(o), Object.keys(a)), Object.keys(b)) - .filter(function(k) { return !discardTags[k]; }); - var tags = Object.assign({}, a); // shallow copy - var changed = false; + mutex.locked = function () { + return !!intervalID; + }; - for (var i = 0; i < keys.length; i++) { - var k = keys[i]; + return mutex; + } - if (o[k] !== b[k] && a[k] !== b[k]) { // changed remotely.. - if (o[k] !== a[k]) { // changed locally.. - _conflicts.push(_t('merge_remote_changes.conflict.tags', - { tag: k, local: a[k], remote: b[k], user: user(remote.user) })); + function utilTiler() { + var _size = [256, 256]; + var _scale = 256; + var _tileSize = 256; + var _zoomExtent = [0, 20]; + var _translate = [_size[0] / 2, _size[1] / 2]; + var _margin = 0; + var _skipNullIsland = false; + + function clamp(num, min, max) { + return Math.max(min, Math.min(num, max)); + } - } else { // unchanged locally, accept remote change.. - if (b.hasOwnProperty(k)) { - tags[k] = b[k]; - } else { - delete tags[k]; - } - changed = true; - } - } - } + function nearNullIsland(tile) { + var x = tile[0]; + var y = tile[1]; + var z = tile[2]; - return (changed && _conflicts.length === ccount) ? target.update({tags: tags}) : target; + if (z >= 7) { + var center = Math.pow(2, z - 1); + var width = Math.pow(2, z - 6); + var min = center - width / 2; + var max = center + width / 2 - 1; + return x >= min && x <= max && y >= min && y <= max; } + return false; + } - // `graph.base()` is the common ancestor of the two graphs. - // `localGraph` contains user's edits up to saving - // `remoteGraph` contains remote edits to modified nodes - // `graph` must be a descendent of `localGraph` and may include - // some conflict resolution actions performed on it. - // - // --- ... --- `localGraph` -- ... -- `graph` - // / - // `graph.base()` --- ... --- `remoteGraph` - // - var action = function(graph) { - var updates = { replacements: [], removeIds: [] }; - var base = graph.base().entities[id]; - var local = localGraph.entity(id); - var remote = remoteGraph.entity(id); - var target = osmEntity(local, { version: remote.version }); + function tiler() { + var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize); + var z0 = clamp(Math.round(z), _zoomExtent[0], _zoomExtent[1]); + var tileMin = 0; + var tileMax = Math.pow(2, z0) - 1; + var log2ts = Math.log(_tileSize) * Math.LOG2E; + var k = Math.pow(2, z - z0 + log2ts); + var origin = [(_translate[0] - _scale / 2) / k, (_translate[1] - _scale / 2) / k]; + var cols = range$1(clamp(Math.floor(-origin[0]) - _margin, tileMin, tileMax + 1), clamp(Math.ceil(_size[0] / k - origin[0]) + _margin, tileMin, tileMax + 1)); + var rows = range$1(clamp(Math.floor(-origin[1]) - _margin, tileMin, tileMax + 1), clamp(Math.ceil(_size[1] / k - origin[1]) + _margin, tileMin, tileMax + 1)); + var tiles = []; - // delete/undelete - if (!remote.visible) { - if (_option === 'force_remote') { - return actionDeleteMultiple([id])(graph); + for (var i = 0; i < rows.length; i++) { + var y = rows[i]; - } else if (_option === 'force_local') { - if (target.type === 'way') { - target = mergeChildren(target, utilArrayUniq(local.nodes), updates, graph); - graph = updateChildren(updates, graph); - } - return graph.replace(target); + for (var j = 0; j < cols.length; j++) { + var x = cols[j]; - } else { - _conflicts.push(_t('merge_remote_changes.conflict.deleted', { user: user(remote.user) })); - return graph; // do nothing - } + if (i >= _margin && i <= rows.length - _margin && j >= _margin && j <= cols.length - _margin) { + tiles.unshift([x, y, z0]); // tiles in view at beginning + } else { + tiles.push([x, y, z0]); // tiles in margin at the end } + } + } + + tiles.translate = origin; + tiles.scale = k; + return tiles; + } + /** + * getTiles() returns an array of tiles that cover the map view + */ - // merge - if (target.type === 'node') { - target = mergeLocation(remote, target); - } else if (target.type === 'way') { - // pull in any child nodes that may not be present locally.. - graph.rebase(remoteGraph.childNodes(remote), [graph], false); - target = mergeNodes(base, remote, target); - target = mergeChildren(target, utilArrayUnion(local.nodes, remote.nodes), updates, graph); + tiler.getTiles = function (projection) { + var origin = [projection.scale() * Math.PI - projection.translate()[0], projection.scale() * Math.PI - projection.translate()[1]]; + this.size(projection.clipExtent()[1]).scale(projection.scale() * 2 * Math.PI).translate(projection.translate()); + var tiles = tiler(); + var ts = tiles.scale; + return tiles.map(function (tile) { + if (_skipNullIsland && nearNullIsland(tile)) { + return false; + } - } else if (target.type === 'relation') { - target = mergeMembers(remote, target); - } + var x = tile[0] * ts - origin[0]; + var y = tile[1] * ts - origin[1]; + return { + id: tile.toString(), + xyz: tile, + extent: geoExtent(projection.invert([x, y + ts]), projection.invert([x + ts, y])) + }; + }).filter(Boolean); + }; + /** + * getGeoJSON() returns a FeatureCollection for debugging tiles + */ - target = mergeTags(base, remote, target); - if (!_conflicts.length) { - graph = updateChildren(updates, graph).replace(target); + tiler.getGeoJSON = function (projection) { + var features = tiler.getTiles(projection).map(function (tile) { + return { + type: 'Feature', + properties: { + id: tile.id, + name: tile.id + }, + geometry: { + type: 'Polygon', + coordinates: [tile.extent.polygon()] } - - return graph; + }; + }); + return { + type: 'FeatureCollection', + features: features }; + }; + tiler.tileSize = function (val) { + if (!arguments.length) return _tileSize; + _tileSize = val; + return tiler; + }; - action.withOption = function(opt) { - _option = opt; - return action; - }; + tiler.zoomExtent = function (val) { + if (!arguments.length) return _zoomExtent; + _zoomExtent = val; + return tiler; + }; + tiler.size = function (val) { + if (!arguments.length) return _size; + _size = val; + return tiler; + }; - action.conflicts = function() { - return _conflicts; - }; + tiler.scale = function (val) { + if (!arguments.length) return _scale; + _scale = val; + return tiler; + }; + tiler.translate = function (val) { + if (!arguments.length) return _translate; + _translate = val; + return tiler; + }; // number to extend the rows/columns beyond those covering the viewport - return action; - } - // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java - // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as - function actionMove(moveIDs, tryDelta, projection, cache) { - var _delta = tryDelta; + tiler.margin = function (val) { + if (!arguments.length) return _margin; + _margin = +val; + return tiler; + }; - function setupCache(graph) { - function canMove(nodeID) { - // Allow movement of any node that is in the selectedIDs list.. - if (moveIDs.indexOf(nodeID) !== -1) { return true; } + tiler.skipNullIsland = function (val) { + if (!arguments.length) return _skipNullIsland; + _skipNullIsland = val; + return tiler; + }; - // Allow movement of a vertex where 2 ways meet.. - var parents = graph.parentWays(graph.entity(nodeID)); - if (parents.length < 3) { return true; } + return tiler; + } - // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too.. - var parentsMoving = parents.every(function(way) { return cache.moving[way.id]; }); - if (!parentsMoving) { delete cache.moving[nodeID]; } + function utilTriggerEvent(target, type) { + target.each(function () { + var evt = document.createEvent('HTMLEvents'); + evt.initEvent(type, true, true); + this.dispatchEvent(evt); + }); + } - return parentsMoving; - } + var _mainLocations = coreLocations(); // singleton + // `coreLocations` maintains an internal index of all the boundaries/geofences used by iD. + // It's used by presets, community index, background imagery, to know where in the world these things are valid. + // These geofences should be defined by `locationSet` objects: + // + // let locationSet = { + // include: [ Array of locations ], + // exclude: [ Array of locations ] + // }; + // + // For more info see the location-conflation and country-coder projects, see: + // https://github.com/ideditor/location-conflation + // https://github.com/ideditor/country-coder + // - function cacheEntities(ids) { - for (var i = 0; i < ids.length; i++) { - var id = ids[i]; - if (cache.moving[id]) { continue; } - cache.moving[id] = true; + function coreLocations() { + var _this = {}; + var _resolvedFeatures = {}; // cache of *resolved* locationSet features - var entity = graph.hasEntity(id); - if (!entity) { continue; } + var _loco = new _default(); // instance of a location-conflation resolver - if (entity.type === 'node') { - cache.nodes.push(id); - cache.startLoc[id] = entity.loc; - } else if (entity.type === 'way') { - cache.ways.push(id); - cacheEntities(entity.nodes); - } else { - cacheEntities(entity.members.map(function(member) { - return member.id; - })); - } - } - } - function cacheIntersections(ids) { - function isEndpoint(way, id) { - return !way.isClosed() && !!way.affix(id); - } + var _wp; // instance of a which-polygon index + // pre-resolve the worldwide locationSet - for (var i = 0; i < ids.length; i++) { - var id = ids[i]; - - // consider only intersections with 1 moved and 1 unmoved way. - var childNodes = graph.childNodes(graph.entity(id)); - for (var j = 0; j < childNodes.length; j++) { - var node = childNodes[j]; - var parents = graph.parentWays(node); - if (parents.length !== 2) { continue; } - - var moved = graph.entity(id); - var unmoved = null; - for (var k = 0; k < parents.length; k++) { - var way = parents[k]; - if (!cache.moving[way.id]) { - unmoved = way; - break; - } - } - if (!unmoved) { continue; } - - // exclude ways that are overly connected.. - if (utilArrayIntersection(moved.nodes, unmoved.nodes).length > 2) { continue; } - if (moved.isArea() || unmoved.isArea()) { continue; } - - cache.intersections.push({ - nodeId: node.id, - movedId: moved.id, - unmovedId: unmoved.id, - movedIsEP: isEndpoint(moved, node.id), - unmovedIsEP: isEndpoint(unmoved, node.id) - }); - } - } - } + var world = { + locationSet: { + include: ['Q2'] + } + }; + resolveLocationSet(world); + rebuildIndex(); + var _queue = []; - if (!cache) { - cache = {}; - } - if (!cache.ok) { - cache.moving = {}; - cache.intersections = []; - cache.replacedVertex = {}; - cache.startLoc = {}; - cache.nodes = []; - cache.ways = []; + var _deferred = new Set(); - cacheEntities(moveIDs); - cacheIntersections(cache.ways); - cache.nodes = cache.nodes.filter(canMove); + var _inProcess; // Returns a Promise to process the queue - cache.ok = true; - } - } + function processQueue() { + if (!_queue.length) return Promise.resolve(); // console.log(`queue length ${_queue.length}`); - // Place a vertex where the moved vertex used to be, to preserve way shape.. - // - // Start: - // b ---- e - // / \ - // / \ - // / \ - // a c - // - // * node '*' added to preserve shape - // / \ - // / b ---- e way `b,e` moved here: - // / \ - // a c - // - // - function replaceMovedVertex(nodeId, wayId, graph, delta) { - var way = graph.entity(wayId); - var moved = graph.entity(nodeId); - var movedIndex = way.nodes.indexOf(nodeId); - var len, prevIndex, nextIndex; + var chunk = _queue.pop(); - if (way.isClosed()) { - len = way.nodes.length - 1; - prevIndex = (movedIndex + len - 1) % len; - nextIndex = (movedIndex + len + 1) % len; - } else { - len = way.nodes.length; - prevIndex = movedIndex - 1; - nextIndex = movedIndex + 1; - } + return new Promise(function (resolvePromise) { + var handle = window.requestIdleCallback(function () { + _deferred["delete"](handle); // const t0 = performance.now(); - var prev = graph.hasEntity(way.nodes[prevIndex]); - var next = graph.hasEntity(way.nodes[nextIndex]); - // Don't add orig vertex at endpoint.. - if (!prev || !next) { return graph; } + chunk.forEach(resolveLocationSet); // const t1 = performance.now(); + // console.log('chunk processed in ' + (t1 - t0) + ' ms'); - var key = wayId + '_' + nodeId; - var orig = cache.replacedVertex[key]; - if (!orig) { - orig = osmNode(); - cache.replacedVertex[key] = orig; - cache.startLoc[orig.id] = cache.startLoc[nodeId]; - } + resolvePromise(); + }); - var start, end; - if (delta) { - start = projection(cache.startLoc[nodeId]); - end = projection.invert(geoVecAdd(start, delta)); - } else { - end = cache.startLoc[nodeId]; - } - orig = orig.move(end); + _deferred.add(handle); + }).then(function () { + return processQueue(); + }); + } // Pass an Object with a `locationSet` property, + // Performs the locationSet resolution, caches the result, and sets a `locationSetID` property on the object. - var angle = Math.abs(geoAngle(orig, prev, projection) - - geoAngle(orig, next, projection)) * 180 / Math.PI; - // Don't add orig vertex if it would just make a straight line.. - if (angle > 175 && angle < 185) { return graph; } + function resolveLocationSet(obj) { + if (obj.locationSetID) return; // work was done already - // moving forward or backward along way? - var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection); - var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection); - var d1 = geoPathLength(p1); - var d2 = geoPathLength(p2); - var insertAt = (d1 <= d2) ? movedIndex : nextIndex; + try { + var locationSet = obj.locationSet; - // moving around closed loop? - if (way.isClosed() && insertAt === 0) { insertAt = len; } + if (!locationSet) { + throw new Error('object missing locationSet property'); + } - way = way.addNode(orig.id, insertAt); - return graph.replace(orig).replace(way); - } + if (!locationSet.include) { + // missing `include`, default to worldwide include + locationSet.include = ['Q2']; // https://github.com/openstreetmap/iD/pull/8305#discussion_r662344647 + } + var resolved = _loco.resolveLocationSet(locationSet); - // Remove duplicate vertex that might have been added by - // replaceMovedVertex. This is done after the unzorro checks. - function removeDuplicateVertices(wayId, graph) { - var way = graph.entity(wayId); - var epsilon = 1e-6; - var prev, curr; + var locationSetID = resolved.id; + obj.locationSetID = locationSetID; - function isInteresting(node, graph) { - return graph.parentWays(node).length > 1 || - graph.parentRelations(node).length || - node.hasInterestingTags(); - } + if (!resolved.feature.geometry.coordinates.length || !resolved.feature.properties.area) { + throw new Error("locationSet ".concat(locationSetID, " resolves to an empty feature.")); + } - for (var i = 0; i < way.nodes.length; i++) { - curr = graph.entity(way.nodes[i]); + if (!_resolvedFeatures[locationSetID]) { + // First time seeing this locationSet feature + var feature = JSON.parse(JSON.stringify(resolved.feature)); // deep clone - if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon)) { - if (!isInteresting(prev, graph)) { - way = way.removeNode(prev.id); - graph = graph.replace(way).remove(prev); - } else if (!isInteresting(curr, graph)) { - way = way.removeNode(curr.id); - graph = graph.replace(way).remove(curr); - } - } + feature.id = locationSetID; // Important: always use the locationSet `id` (`+[Q30]`), not the feature `id` (`Q30`) - prev = curr; - } + feature.properties.id = locationSetID; + _resolvedFeatures[locationSetID] = feature; // insert into cache + } + } catch (err) { + obj.locationSet = { + include: ['Q2'] + }; // default worldwide - return graph; + obj.locationSetID = '+[Q2]'; } + } // Rebuilds the whichPolygon index with whatever features have been resolved. - // Reorder nodes around intersections that have moved.. - // - // Start: way1.nodes: b,e (moving) - // a - b - c ----- d way2.nodes: a,b,c,d (static) - // | vertex: b - // e isEP1: true, isEP2, false - // - // way1 `b,e` moved here: - // a ----- c = b - d - // | - // e - // - // reorder nodes way1.nodes: b,e - // a ----- c - b - d way2.nodes: a,c,b,d - // | - // e - // - function unZorroIntersection(intersection, graph) { - var vertex = graph.entity(intersection.nodeId); - var way1 = graph.entity(intersection.movedId); - var way2 = graph.entity(intersection.unmovedId); - var isEP1 = intersection.movedIsEP; - var isEP2 = intersection.unmovedIsEP; - - // don't move the vertex if it is the endpoint of both ways. - if (isEP1 && isEP2) { return graph; } - - var nodes1 = graph.childNodes(way1).filter(function(n) { return n !== vertex; }); - var nodes2 = graph.childNodes(way2).filter(function(n) { return n !== vertex; }); - - if (way1.isClosed() && way1.first() === vertex.id) { nodes1.push(nodes1[0]); } - if (way2.isClosed() && way2.first() === vertex.id) { nodes2.push(nodes2[0]); } - - var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection); - var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection); - var loc; - - // snap vertex to nearest edge (or some point between them).. - if (!isEP1 && !isEP2) { - var epsilon = 1e-6, maxIter = 10; - for (var i = 0; i < maxIter; i++) { - loc = geoVecInterp(edge1.loc, edge2.loc, 0.5); - edge1 = geoChooseEdge(nodes1, projection(loc), projection); - edge2 = geoChooseEdge(nodes2, projection(loc), projection); - if (Math.abs(edge1.distance - edge2.distance) < epsilon) { break; } - } - } else if (!isEP1) { - loc = edge1.loc; - } else { - loc = edge2.loc; - } + function rebuildIndex() { + _wp = whichPolygon_1({ + features: Object.values(_resolvedFeatures) + }); + } // + // `mergeCustomGeoJSON` + // Accepts an FeatureCollection-like object containing custom locations + // Each feature must have a filename-like `id`, for example: `something.geojson` + // + // { + // "type": "FeatureCollection" + // "features": [ + // { + // "type": "Feature", + // "id": "philly_metro.geojson", + // "properties": { … }, + // "geometry": { … } + // } + // ] + // } + // - graph = graph.replace(vertex.move(loc)); - // if zorro happened, reorder nodes.. - if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) { - way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index); - graph = graph.replace(way1); - } - if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) { - way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index); - graph = graph.replace(way2); - } + _this.mergeCustomGeoJSON = function (fc) { + if (fc && fc.type === 'FeatureCollection' && Array.isArray(fc.features)) { + fc.features.forEach(function (feature) { + feature.properties = feature.properties || {}; + var props = feature.properties; // Get `id` from either `id` or `properties` - return graph; - } + var id = feature.id || props.id; + if (!id || !/^\S+\.geojson$/i.test(id)) return; // Ensure `id` exists and is lowercase + id = id.toLowerCase(); + feature.id = id; + props.id = id; // Ensure `area` property exists - function cleanupIntersections(graph) { - for (var i = 0; i < cache.intersections.length; i++) { - var obj = cache.intersections[i]; - graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta); - graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null); - graph = unZorroIntersection(obj, graph); - graph = removeDuplicateVertices(obj.movedId, graph); - graph = removeDuplicateVertices(obj.unmovedId, graph); + if (!props.area) { + var area = geojsonArea.geometry(feature.geometry) / 1e6; // m² to km² + + props.area = Number(area.toFixed(2)); } - return graph; + _loco._cache[id] = feature; + }); } + }; // + // `mergeLocationSets` + // Accepts an Array of Objects containing `locationSet` properties. + // The locationSets will be resolved and indexed in the background. + // [ + // { id: 'preset1', locationSet: {…} }, + // { id: 'preset2', locationSet: {…} }, + // { id: 'preset3', locationSet: {…} }, + // … + // ] + // After resolving and indexing, the Objects will be decorated with a + // `locationSetID` property. + // [ + // { id: 'preset1', locationSet: {…}, locationSetID: '+[Q2]' }, + // { id: 'preset2', locationSet: {…}, locationSetID: '+[Q30]' }, + // { id: 'preset3', locationSet: {…}, locationSetID: '+[Q2]' }, + // … + // ] + // + // Returns a Promise fulfilled when the resolving/indexing has been completed + // This will take some seconds but happen in the background during browser idle time. + // - // check if moving way endpoint can cross an unmoved way, if so limit delta.. - function limitDelta(graph) { - function moveNode(loc) { - return geoVecAdd(projection(loc), _delta); - } + _this.mergeLocationSets = function (objects) { + if (!Array.isArray(objects)) return Promise.reject('nothing to do'); // Resolve all locationSets -> geojson, processing data in chunks + // + // Because this will happen during idle callbacks, we want to choose a chunk size + // that won't make the browser stutter too badly. LocationSets that are a simple + // country coder include will resolve instantly, but ones that involve complex + // include/exclude operations will take some milliseconds longer. + // + // Some discussion and performance results on these tickets: + // https://github.com/ideditor/location-conflation/issues/26 + // https://github.com/osmlab/name-suggestion-index/issues/4784#issuecomment-742003434 - for (var i = 0; i < cache.intersections.length; i++) { - var obj = cache.intersections[i]; + _queue = _queue.concat(utilArrayChunk(objects, 200)); - // Don't limit movement if this is vertex joins 2 endpoints.. - if (obj.movedIsEP && obj.unmovedIsEP) { continue; } - // Don't limit movement if this vertex is not an endpoint anyway.. - if (!obj.movedIsEP) { continue; } + if (!_inProcess) { + _inProcess = processQueue().then(function () { + rebuildIndex(); + _inProcess = null; + return objects; + }); + } - var node = graph.entity(obj.nodeId); - var start = projection(node.loc); - var end = geoVecAdd(start, _delta); - var movedNodes = graph.childNodes(graph.entity(obj.movedId)); - var movedPath = movedNodes.map(function(n) { return moveNode(n.loc); }); - var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId)); - var unmovedPath = unmovedNodes.map(function(n) { return projection(n.loc); }); - var hits = geoPathIntersections(movedPath, unmovedPath); + return _inProcess; + }; // + // `locationSetID` + // Returns a locationSetID for a given locationSet (fallback to `+[Q2]`, world) + // (The locationset doesn't necessarily need to be resolved to compute its `id`) + // + // Arguments + // `locationSet`: A locationSet, e.g. `{ include: ['us'] }` + // Returns + // The locationSetID, e.g. `+[Q30]` + // - for (var j = 0; i < hits.length; i++) { - if (geoVecEqual(hits[j], end)) { continue; } - var edge = geoChooseEdge(unmovedNodes, end, projection); - _delta = geoVecSubtract(projection(edge.loc), start); - } - } - } + _this.locationSetID = function (locationSet) { + var locationSetID; - var action = function(graph) { - if (_delta[0] === 0 && _delta[1] === 0) { return graph; } + try { + locationSetID = _loco.validateLocationSet(locationSet).id; + } catch (err) { + locationSetID = '+[Q2]'; // the world + } - setupCache(graph); + return locationSetID; + }; // + // `feature` + // Returns the resolved GeoJSON feature for a given locationSetID (fallback to 'world') + // + // Arguments + // `locationSetID`: id of the form like `+[Q30]` (United States) + // Returns + // A GeoJSON feature: + // { + // type: 'Feature', + // id: '+[Q30]', + // properties: { id: '+[Q30]', area: 21817019.17, … }, + // geometry: { … } + // } + + + _this.feature = function (locationSetID) { + return _resolvedFeatures[locationSetID] || _resolvedFeatures['+[Q2]']; + }; // + // `locationsAt` + // Find all the resolved locationSets valid at the given location. + // Results include the area (in km²) to facilitate sorting. + // + // Arguments + // `loc`: the [lon,lat] location to query, e.g. `[-74.4813, 40.7967]` + // Returns + // Object of locationSetIDs to areas (in km²) + // { + // "+[Q2]": 511207893.3958111, + // "+[Q30]": 21817019.17, + // "+[new_jersey.geojson]": 22390.77, + // … + // } + // - if (cache.intersections.length) { - limitDelta(graph); - } - for (var i = 0; i < cache.nodes.length; i++) { - var node = graph.entity(cache.nodes[i]); - var start = projection(node.loc); - var end = geoVecAdd(start, _delta); - graph = graph.replace(node.move(projection.invert(end))); - } + _this.locationsAt = function (loc) { + var result = {}; + (_wp(loc, true) || []).forEach(function (prop) { + return result[prop.id] = prop.area; + }); + return result; + }; // + // `query` + // Execute a query directly against which-polygon + // https://github.com/mapbox/which-polygon + // + // Arguments + // `loc`: the [lon,lat] location to query, + // `multi`: `true` to return all results, `false` to return first result + // Returns + // Array of GeoJSON *properties* for the locationSet features that exist at `loc` + // - if (cache.intersections.length) { - graph = cleanupIntersections(graph); - } - return graph; - }; + _this.query = function (loc, multi) { + return _wp(loc, multi); + }; // Direct access to the location-conflation resolver - action.delta = function() { - return _delta; - }; + _this.loco = function () { + return _loco; + }; // Direct access to the which-polygon index - return action; - } + _this.wp = function () { + return _wp; + }; - function actionMoveMember(relationId, fromIndex, toIndex) { - return function(graph) { - return graph.replace(graph.entity(relationId).moveMember(fromIndex, toIndex)); - }; + return _this; } - function actionMoveNode(nodeID, toLoc) { + var $$h = _export; + var $findIndex = arrayIteration.findIndex; + var addToUnscopables$1 = addToUnscopables$6; - var action = function(graph, t) { - if (t === null || !isFinite(t)) { t = 1; } - t = Math.min(Math.max(+t, 0), 1); + var FIND_INDEX = 'findIndex'; + var SKIPS_HOLES = true; - var node = graph.entity(nodeID); - return graph.replace( - node.move(geoVecInterp(node.loc, toLoc, t)) - ); - }; + // Shouldn't skip holes + if (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES = false; }); - action.transitionable = true; + // `Array.prototype.findIndex` method + // https://tc39.es/ecma262/#sec-array.prototype.findindex + $$h({ target: 'Array', proto: true, forced: SKIPS_HOLES }, { + findIndex: function findIndex(callbackfn /* , that = undefined */) { + return $findIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } + }); - return action; - } + // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables + addToUnscopables$1(FIND_INDEX); - function actionNoop() { - return function(graph) { - return graph; - }; - } + var global$5 = global$1o; + var isRegExp = isRegexp; - function actionOrthogonalize(wayID, projection, vertexID, degThresh, ep) { - var epsilon = ep || 1e-4; - var threshold = degThresh || 13; // degrees within right or straight to alter + var TypeError$3 = global$5.TypeError; - // We test normalized dot products so we can compare as cos(angle) - var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180); - var upperThreshold = Math.cos(threshold * Math.PI / 180); + var notARegexp = function (it) { + if (isRegExp(it)) { + throw TypeError$3("The method doesn't accept regular expressions"); + } return it; + }; + var wellKnownSymbol = wellKnownSymbol$t; - var action = function(graph, t) { - if (t === null || !isFinite(t)) { t = 1; } - t = Math.min(Math.max(+t, 0), 1); + var MATCH = wellKnownSymbol('match'); - var way = graph.entity(wayID); - way = way.removeNode(''); // sanity check - remove any consecutive duplicates + var correctIsRegexpLogic = function (METHOD_NAME) { + var regexp = /./; + try { + '/./'[METHOD_NAME](regexp); + } catch (error1) { + try { + regexp[MATCH] = false; + return '/./'[METHOD_NAME](regexp); + } catch (error2) { /* empty */ } + } return false; + }; + + var $$g = _export; + var uncurryThis$7 = functionUncurryThis; + var notARegExp$2 = notARegexp; + var requireObjectCoercible$3 = requireObjectCoercible$e; + var toString$4 = toString$k; + var correctIsRegExpLogic$2 = correctIsRegexpLogic; + + var stringIndexOf = uncurryThis$7(''.indexOf); + + // `String.prototype.includes` method + // https://tc39.es/ecma262/#sec-string.prototype.includes + $$g({ target: 'String', proto: true, forced: !correctIsRegExpLogic$2('includes') }, { + includes: function includes(searchString /* , position = 0 */) { + return !!~stringIndexOf( + toString$4(requireObjectCoercible$3(this)), + toString$4(notARegExp$2(searchString)), + arguments.length > 1 ? arguments[1] : undefined + ); + } + }); - if (way.tags.nonsquare) { - var tags = Object.assign({}, way.tags); - // since we're squaring, remove indication that this is physically unsquare - delete tags.nonsquare; - way = way.update({tags: tags}); - } + /** Detect free variable `global` from Node.js. */ + var freeGlobal = (typeof global === "undefined" ? "undefined" : _typeof(global)) == 'object' && global && global.Object === Object && global; - graph = graph.replace(way); + /** Detect free variable `self`. */ - var isClosed = way.isClosed(); - var nodes = graph.childNodes(way).slice(); // shallow copy - if (isClosed) { nodes.pop(); } + var freeSelf = (typeof self === "undefined" ? "undefined" : _typeof(self)) == 'object' && self && self.Object === Object && self; + /** Used as a reference to the global object. */ - if (vertexID !== undefined) { - nodes = nodeSubset(nodes, vertexID, isClosed); - if (nodes.length !== 3) { return graph; } - } + var root = freeGlobal || freeSelf || Function('return this')(); - // note: all geometry functions here use the unclosed node/point/coord list + /** Built-in value references. */ - var nodeCount = {}; - var points = []; - var corner = { i: 0, dotp: 1 }; - var node, point, loc, score, motions, i, j; + var _Symbol = root.Symbol; - for (i = 0; i < nodes.length; i++) { - node = nodes[i]; - nodeCount[node.id] = (nodeCount[node.id] || 0) + 1; - points.push({ id: node.id, coord: projection(node.loc) }); - } + /** Used for built-in method references. */ + var objectProto$1 = Object.prototype; + /** Used to check objects for own properties. */ - if (points.length === 3) { // move only one vertex for right triangle - for (i = 0; i < 1000; i++) { - motions = points.map(calcMotion); + var hasOwnProperty$2 = objectProto$1.hasOwnProperty; + /** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ - points[corner.i].coord = geoVecAdd(points[corner.i].coord, motions[corner.i]); - score = corner.dotp; - if (score < epsilon) { - break; - } - } + var nativeObjectToString$1 = objectProto$1.toString; + /** Built-in value references. */ - node = graph.entity(nodes[corner.i].id); - loc = projection.invert(points[corner.i].coord); - graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t))); + var symToStringTag$1 = _Symbol ? _Symbol.toStringTag : undefined; + /** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ - } else { - var straights = []; - var simplified = []; - - // Remove points from nearly straight sections.. - // This produces a simplified shape to orthogonalize - for (i = 0; i < points.length; i++) { - point = points[i]; - var dotp = 0; - if (isClosed || (i > 0 && i < points.length - 1)) { - var a = points[(i - 1 + points.length) % points.length]; - var b = points[(i + 1) % points.length]; - dotp = Math.abs(geoOrthoNormalizedDotProduct(a.coord, b.coord, point.coord)); - } + function getRawTag(value) { + var isOwn = hasOwnProperty$2.call(value, symToStringTag$1), + tag = value[symToStringTag$1]; - if (dotp > upperThreshold) { - straights.push(point); - } else { - simplified.push(point); - } - } + try { + value[symToStringTag$1] = undefined; + var unmasked = true; + } catch (e) {} - // Orthogonalize the simplified shape - var bestPoints = clonePoints(simplified); - var originalPoints = clonePoints(simplified); + var result = nativeObjectToString$1.call(value); - score = Infinity; - for (i = 0; i < 1000; i++) { - motions = simplified.map(calcMotion); + if (unmasked) { + if (isOwn) { + value[symToStringTag$1] = tag; + } else { + delete value[symToStringTag$1]; + } + } - for (j = 0; j < motions.length; j++) { - simplified[j].coord = geoVecAdd(simplified[j].coord, motions[j]); - } - var newScore = geoOrthoCalcScore(simplified, isClosed, epsilon, threshold); - if (newScore < score) { - bestPoints = clonePoints(simplified); - score = newScore; - } - if (score < epsilon) { - break; - } - } + return result; + } - var bestCoords = bestPoints.map(function(p) { return p.coord; }); - if (isClosed) { bestCoords.push(bestCoords[0]); } + /** Used for built-in method references. */ + var objectProto = Object.prototype; + /** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ - // move the nodes that should move - for (i = 0; i < bestPoints.length; i++) { - point = bestPoints[i]; - if (!geoVecEqual(originalPoints[i].coord, point.coord)) { - node = graph.entity(point.id); - loc = projection.invert(point.coord); - graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t))); - } - } + var nativeObjectToString = objectProto.toString; + /** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ - // move the nodes along straight segments - for (i = 0; i < straights.length; i++) { - point = straights[i]; - if (nodeCount[point.id] > 1) { continue; } // skip self-intersections + function objectToString(value) { + return nativeObjectToString.call(value); + } - node = graph.entity(point.id); + /** `Object#toString` result references. */ - if (t === 1 && - graph.parentWays(node).length === 1 && - graph.parentRelations(node).length === 0 && - !node.hasInterestingTags() - ) { - // remove uninteresting points.. - graph = actionDeleteNode(node.id)(graph); + var nullTag = '[object Null]', + undefinedTag = '[object Undefined]'; + /** Built-in value references. */ - } else { - // move interesting points to the nearest edge.. - var choice = geoVecProject(point.coord, bestCoords); - if (choice) { - loc = projection.invert(choice.target); - graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t))); - } - } - } - } + var symToStringTag = _Symbol ? _Symbol.toStringTag : undefined; + /** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ - return graph; + function baseGetTag(value) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value); + } - function clonePoints(array) { - return array.map(function(p) { - return { id: p.id, coord: [p.coord[0], p.coord[1]] }; - }); - } + /** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ + function isObjectLike(value) { + return value != null && _typeof(value) == 'object'; + } + /** `Object#toString` result references. */ - function calcMotion(point, i, array) { - // don't try to move the endpoints of a non-closed way. - if (!isClosed && (i === 0 || i === array.length - 1)) { return [0, 0]; } - // don't try to move a node that appears more than once (self intersection) - if (nodeCount[array[i].id] > 1) { return [0, 0]; } + var symbolTag = '[object Symbol]'; + /** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ - var a = array[(i - 1 + array.length) % array.length].coord; - var origin = point.coord; - var b = array[(i + 1) % array.length].coord; - var p = geoVecSubtract(a, origin); - var q = geoVecSubtract(b, origin); + function isSymbol(value) { + return _typeof(value) == 'symbol' || isObjectLike(value) && baseGetTag(value) == symbolTag; + } - var scale = 2 * Math.min(geoVecLength(p), geoVecLength(q)); - p = geoVecNormalize(p); - q = geoVecNormalize(q); + /** + * A specialized version of `_.map` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ + function arrayMap(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length, + result = Array(length); - var dotp = (p[0] * q[0] + p[1] * q[1]); - var val = Math.abs(dotp); + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } - if (val < lowerThreshold) { // nearly orthogonal - corner.i = i; - corner.dotp = val; - var vec = geoVecNormalize(geoVecAdd(p, q)); - return geoVecScale(vec, 0.1 * dotp * scale); - } + return result; + } - return [0, 0]; // do nothing - } - }; + /** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ + var isArray$1 = Array.isArray; + /** Used as references for various `Number` constants. */ - // if we are only orthogonalizing one vertex, - // get that vertex and the previous and next - function nodeSubset(nodes, vertexID, isClosed) { - var first = isClosed ? 0 : 1; - var last = isClosed ? nodes.length : nodes.length - 1; + var INFINITY = 1 / 0; + /** Used to convert symbols to primitives and strings. */ - for (var i = first; i < last; i++) { - if (nodes[i].id === vertexID) { - return [ - nodes[(i - 1 + nodes.length) % nodes.length], - nodes[i], - nodes[(i + 1) % nodes.length] - ]; - } - } + var symbolProto = _Symbol ? _Symbol.prototype : undefined, + symbolToString = symbolProto ? symbolProto.toString : undefined; + /** + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ - return []; - } + function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + if (isArray$1(value)) { + // Recursively convert values (susceptible to call stack limits). + return arrayMap(value, baseToString) + ''; + } - action.disabled = function(graph) { - var way = graph.entity(wayID); - way = way.removeNode(''); // sanity check - remove any consecutive duplicates - graph = graph.replace(way); + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } - var isClosed = way.isClosed(); - var nodes = graph.childNodes(way).slice(); // shallow copy - if (isClosed) { nodes.pop(); } + var result = value + ''; + return result == '0' && 1 / value == -INFINITY ? '-0' : result; + } - var allowStraightAngles = false; - if (vertexID !== undefined) { - allowStraightAngles = true; - nodes = nodeSubset(nodes, vertexID, isClosed); - if (nodes.length !== 3) { return 'end_vertex'; } - } + /** Used to match a single whitespace character. */ + var reWhitespace = /\s/; + /** + * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace + * character of `string`. + * + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the index of the last non-whitespace character. + */ - var coords = nodes.map(function(n) { return projection(n.loc); }); - var score = geoOrthoCanOrthogonalize(coords, isClosed, epsilon, threshold, allowStraightAngles); + function trimmedEndIndex(string) { + var index = string.length; - if (score === null) { - return 'not_squarish'; - } else if (score === 0) { - return 'square_enough'; - } else { - return false; - } - }; + while (index-- && reWhitespace.test(string.charAt(index))) {} + return index; + } - action.transitionable = true; + /** Used to match leading whitespace. */ - return action; + var reTrimStart = /^\s+/; + /** + * The base implementation of `_.trim`. + * + * @private + * @param {string} string The string to trim. + * @returns {string} Returns the trimmed string. + */ + + function baseTrim(string) { + return string ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '') : string; } - // `actionRestrictTurn` creates a turn restriction relation. - // - // `turn` must be an `osmTurn` object - // see osm/intersection.js, pathToTurn() - // - // This specifies a restriction of type `restriction` when traveling from - // `turn.from.way` toward `turn.to.way` via `turn.via.node` OR `turn.via.ways`. - // (The action does not check that these entities form a valid intersection.) - // - // From, to, and via ways should be split before calling this action. - // (old versions of the code would split the ways here, but we no longer do it) - // - // For testing convenience, accepts a restrictionID to assign to the new - // relation. Normally, this will be undefined and the relation will - // automatically be assigned a new ID. - // - function actionRestrictTurn(turn, restrictionType, restrictionID) { + /** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ + function isObject$2(value) { + var type = _typeof(value); - return function(graph) { - var fromWay = graph.entity(turn.from.way); - var toWay = graph.entity(turn.to.way); - var viaNode = turn.via.node && graph.entity(turn.via.node); - var viaWays = turn.via.ways && turn.via.ways.map(function(id) { return graph.entity(id); }); - var members = []; + return value != null && (type == 'object' || type == 'function'); + } - members.push({ id: fromWay.id, type: 'way', role: 'from' }); + /** Used as references for various `Number` constants. */ - if (viaNode) { - members.push({ id: viaNode.id, type: 'node', role: 'via' }); - } else if (viaWays) { - viaWays.forEach(function(viaWay) { - members.push({ id: viaWay.id, type: 'way', role: 'via' }); - }); - } + var NAN = 0 / 0; + /** Used to detect bad signed hexadecimal string values. */ - members.push({ id: toWay.id, type: 'way', role: 'to' }); + var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; + /** Used to detect binary string values. */ - return graph.replace(osmRelation({ - id: restrictionID, - tags: { - type: 'restriction', - restriction: restrictionType - }, - members: members - })); - }; - } + var reIsBinary = /^0b[01]+$/i; + /** Used to detect octal string values. */ - function actionRevert(id) { - var action = function(graph) { - var entity = graph.hasEntity(id), - base = graph.base().entities[id]; - - if (entity && !base) { // entity will be removed.. - if (entity.type === 'node') { - graph.parentWays(entity) - .forEach(function(parent) { - parent = parent.removeNode(id); - graph = graph.replace(parent); - - if (parent.isDegenerate()) { - graph = actionDeleteWay(parent.id)(graph); - } - }); - } + var reIsOctal = /^0o[0-7]+$/i; + /** Built-in method references without a dependency on `root`. */ - graph.parentRelations(entity) - .forEach(function(parent) { - parent = parent.removeMembersWithID(id); - graph = graph.replace(parent); + var freeParseInt = parseInt; + /** + * Converts `value` to a number. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {number} Returns the number. + * @example + * + * _.toNumber(3.2); + * // => 3.2 + * + * _.toNumber(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toNumber(Infinity); + * // => Infinity + * + * _.toNumber('3.2'); + * // => 3.2 + */ - if (parent.isDegenerate()) { - graph = actionDeleteRelation(parent.id)(graph); - } - }); - } + function toNumber(value) { + if (typeof value == 'number') { + return value; + } - return graph.revert(id); - }; + if (isSymbol(value)) { + return NAN; + } - return action; + if (isObject$2(value)) { + var other = typeof value.valueOf == 'function' ? value.valueOf() : value; + value = isObject$2(other) ? other + '' : other; + } + + if (typeof value != 'string') { + return value === 0 ? value : +value; + } + + value = baseTrim(value); + var isBinary = reIsBinary.test(value); + return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value; } - function actionRotate(rotateIds, pivot, angle, projection) { + /** + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' + * + * _.toString([1, 2, 3]); + * // => '1,2,3' + */ - var action = function(graph) { - return graph.update(function(graph) { - utilGetAllNodes(rotateIds, graph).forEach(function(node) { - var point = geoRotate([projection(node.loc)], angle, pivot)[0]; - graph = graph.replace(node.move(projection.invert(point))); - }); - }); - }; + function toString$3(value) { + return value == null ? '' : baseToString(value); + } - return action; + /** + * The base implementation of `_.propertyOf` without support for deep paths. + * + * @private + * @param {Object} object The object to query. + * @returns {Function} Returns the new accessor function. + */ + function basePropertyOf(object) { + return function (key) { + return object == null ? undefined : object[key]; + }; } - /* Align nodes along their common axis */ - function actionStraightenNodes(nodeIDs, projection) { - - function positionAlongWay(a, o, b) { - return geoVecDot(a, b, o) / geoVecDot(b, b, o); - } + /** + * Gets the timestamp of the number of milliseconds that have elapsed since + * the Unix epoch (1 January 1970 00:00:00 UTC). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Date + * @returns {number} Returns the timestamp. + * @example + * + * _.defer(function(stamp) { + * console.log(_.now() - stamp); + * }, _.now()); + * // => Logs the number of milliseconds it took for the deferred invocation. + */ - // returns the endpoints of the long axis of symmetry of the `points` bounding rect - function getEndpoints(points) { - var ssr = geoGetSmallestSurroundingRectangle(points); + var now = function now() { + return root.Date.now(); + }; - // Choose line pq = axis of symmetry. - // The shape's surrounding rectangle has 2 axes of symmetry. - // Snap points to the long axis - var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ]; - var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ]; - var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ]; - var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ]; + /** Error message constants. */ - var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2)); - if (isLong) { - return [p1, q1]; - } - return [p2, q2]; - } + var FUNC_ERROR_TEXT$1 = 'Expected a function'; + /* Built-in method references for those with the same name as other `lodash` methods. */ + var nativeMax = Math.max, + nativeMin = Math.min; + /** + * Creates a debounced function that delays invoking `func` until after `wait` + * milliseconds have elapsed since the last time the debounced function was + * invoked. The debounced function comes with a `cancel` method to cancel + * delayed `func` invocations and a `flush` method to immediately invoke them. + * Provide `options` to indicate whether `func` should be invoked on the + * leading and/or trailing edge of the `wait` timeout. The `func` is invoked + * with the last arguments provided to the debounced function. Subsequent + * calls to the debounced function return the result of the last `func` + * invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the debounced function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.debounce` and `_.throttle`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to debounce. + * @param {number} [wait=0] The number of milliseconds to delay. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=false] + * Specify invoking on the leading edge of the timeout. + * @param {number} [options.maxWait] + * The maximum time `func` is allowed to be delayed before it's invoked. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new debounced function. + * @example + * + * // Avoid costly calculations while the window size is in flux. + * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); + * + * // Invoke `sendMail` when clicked, debouncing subsequent calls. + * jQuery(element).on('click', _.debounce(sendMail, 300, { + * 'leading': true, + * 'trailing': false + * })); + * + * // Ensure `batchLog` is invoked once after 1 second of debounced calls. + * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); + * var source = new EventSource('/stream'); + * jQuery(source).on('message', debounced); + * + * // Cancel the trailing debounced invocation. + * jQuery(window).on('popstate', debounced.cancel); + */ - var action = function(graph, t) { - if (t === null || !isFinite(t)) { t = 1; } - t = Math.min(Math.max(+t, 0), 1); + function debounce(func, wait, options) { + var lastArgs, + lastThis, + maxWait, + result, + timerId, + lastCallTime, + lastInvokeTime = 0, + leading = false, + maxing = false, + trailing = true; - var nodes = nodeIDs.map(function(id) { return graph.entity(id); }); - var points = nodes.map(function(n) { return projection(n.loc); }); - var endpoints = getEndpoints(points); - var startPoint = endpoints[0]; - var endPoint = endpoints[1]; + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT$1); + } - // Move points onto the line connecting the endpoints - for (var i = 0; i < points.length; i++) { - var node = nodes[i]; - var point = points[i]; - var u = positionAlongWay(point, startPoint, endPoint); - var point2 = geoVecInterp(startPoint, endPoint, u); - var loc2 = projection.invert(point2); - graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t))); - } + wait = toNumber(wait) || 0; - return graph; - }; + if (isObject$2(options)) { + leading = !!options.leading; + maxing = 'maxWait' in options; + maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + function invokeFunc(time) { + var args = lastArgs, + thisArg = lastThis; + lastArgs = lastThis = undefined; + lastInvokeTime = time; + result = func.apply(thisArg, args); + return result; + } - action.disabled = function(graph) { + function leadingEdge(time) { + // Reset any `maxWait` timer. + lastInvokeTime = time; // Start the timer for the trailing edge. - var nodes = nodeIDs.map(function(id) { return graph.entity(id); }); - var points = nodes.map(function(n) { return projection(n.loc); }); - var endpoints = getEndpoints(points); - var startPoint = endpoints[0]; - var endPoint = endpoints[1]; + timerId = setTimeout(timerExpired, wait); // Invoke the leading edge. - var maxDistance = 0; + return leading ? invokeFunc(time) : result; + } - for (var i = 0; i < points.length; i++) { - var point = points[i]; - var u = positionAlongWay(point, startPoint, endPoint); - var p = geoVecInterp(startPoint, endPoint, u); - var dist = geoVecLength(p, point); + function remainingWait(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime, + timeWaiting = wait - timeSinceLastCall; + return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting; + } - if (!isNaN(dist) && dist > maxDistance) { - maxDistance = dist; - } - } + function shouldInvoke(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime; // Either this is the first call, activity has stopped and we're at the + // trailing edge, the system time has gone backwards and we're treating + // it as the trailing edge, or we've hit the `maxWait` limit. - if (maxDistance < 0.0001) { - return 'straight_enough'; - } - }; + return lastCallTime === undefined || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait; + } + function timerExpired() { + var time = now(); - action.transitionable = true; + if (shouldInvoke(time)) { + return trailingEdge(time); + } // Restart the timer. - return action; - } + timerId = setTimeout(timerExpired, remainingWait(time)); + } - /* - * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as - */ - function actionStraightenWay(selectedIDs, projection) { + function trailingEdge(time) { + timerId = undefined; // Only invoke if we have `lastArgs` which means `func` has been + // debounced at least once. - function positionAlongWay(a, o, b) { - return geoVecDot(a, b, o) / geoVecDot(b, b, o); + if (trailing && lastArgs) { + return invokeFunc(time); } - // Return all selected ways as a continuous, ordered array of nodes - function allNodes(graph) { - var nodes = []; - var startNodes = []; - var endNodes = []; - var remainingWays = []; - var selectedWays = selectedIDs.filter(function(w) { - return graph.entity(w).type === 'way'; - }); - var selectedNodes = selectedIDs.filter(function(n) { - return graph.entity(n).type === 'node'; - }); - - for (var i = 0; i < selectedWays.length; i++) { - var way = graph.entity(selectedWays[i]); - nodes = way.nodes.slice(0); - remainingWays.push(nodes); - startNodes.push(nodes[0]); - endNodes.push(nodes[nodes.length-1]); - } - - // Remove duplicate end/startNodes (duplicate nodes cannot be at the line end, - // and need to be removed so currNode difference calculation below works) - // i.e. ["n-1", "n-1", "n-2"] => ["n-2"] - startNodes = startNodes.filter(function(n) { - return startNodes.indexOf(n) === startNodes.lastIndexOf(n); - }); - endNodes = endNodes.filter(function(n) { - return endNodes.indexOf(n) === endNodes.lastIndexOf(n); - }); + lastArgs = lastThis = undefined; + return result; + } - // Choose the initial endpoint to start from - var currNode = utilArrayDifference(startNodes, endNodes) - .concat(utilArrayDifference(endNodes, startNodes))[0]; - var nextWay = []; - nodes = []; - - // Create nested function outside of loop to avoid "function in loop" lint error - var getNextWay = function(currNode, remainingWays) { - return remainingWays.filter(function(way) { - return way[0] === currNode || way[way.length-1] === currNode; - })[0]; - }; + function cancel() { + if (timerId !== undefined) { + clearTimeout(timerId); + } - // Add nodes to end of nodes array, until all ways are added - while (remainingWays.length) { - nextWay = getNextWay(currNode, remainingWays); - remainingWays = utilArrayDifference(remainingWays, [nextWay]); + lastInvokeTime = 0; + lastArgs = lastCallTime = lastThis = timerId = undefined; + } - if (nextWay[0] !== currNode) { - nextWay.reverse(); - } - nodes = nodes.concat(nextWay); - currNode = nodes[nodes.length-1]; - } + function flush() { + return timerId === undefined ? result : trailingEdge(now()); + } - // If user selected 2 nodes to straighten between, then slice nodes array to those nodes - if (selectedNodes.length === 2) { - var startNodeIdx = nodes.indexOf(selectedNodes[0]); - var endNodeIdx = nodes.indexOf(selectedNodes[1]); - var sortedStartEnd = [startNodeIdx, endNodeIdx]; + function debounced() { + var time = now(), + isInvoking = shouldInvoke(time); + lastArgs = arguments; + lastThis = this; + lastCallTime = time; - sortedStartEnd.sort(function(a, b) { return a - b; }); - nodes = nodes.slice(sortedStartEnd[0], sortedStartEnd[1]+1); - } + if (isInvoking) { + if (timerId === undefined) { + return leadingEdge(lastCallTime); + } - return nodes.map(function(n) { return graph.entity(n); }); + if (maxing) { + // Handle invocations in a tight loop. + clearTimeout(timerId); + timerId = setTimeout(timerExpired, wait); + return invokeFunc(lastCallTime); + } } - function shouldKeepNode(node, graph) { - return graph.parentWays(node).length > 1 || - graph.parentRelations(node).length || - node.hasInterestingTags(); + if (timerId === undefined) { + timerId = setTimeout(timerExpired, wait); } + return result; + } - var action = function(graph, t) { - if (t === null || !isFinite(t)) { t = 1; } - t = Math.min(Math.max(+t, 0), 1); - - var nodes = allNodes(graph); - var points = nodes.map(function(n) { return projection(n.loc); }); - var startPoint = points[0]; - var endPoint = points[points.length-1]; - var toDelete = []; - var i; - - for (i = 1; i < points.length-1; i++) { - var node = nodes[i]; - var point = points[i]; - - if (t < 1 || shouldKeepNode(node, graph)) { - var u = positionAlongWay(point, startPoint, endPoint); - var p = geoVecInterp(startPoint, endPoint, u); - var loc2 = projection.invert(p); - graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t))); - - } else { - // safe to delete - if (toDelete.indexOf(node) === -1) { - toDelete.push(node); - } - } - } - - for (i = 0; i < toDelete.length; i++) { - graph = actionDeleteNode(toDelete[i].id)(graph); - } - - return graph; - }; + debounced.cancel = cancel; + debounced.flush = flush; + return debounced; + } + /** Used to map characters to HTML entities. */ - action.disabled = function(graph) { - // check way isn't too bendy - var nodes = allNodes(graph); - var points = nodes.map(function(n) { return projection(n.loc); }); - var startPoint = points[0]; - var endPoint = points[points.length-1]; - var threshold = 0.2 * geoVecLength(startPoint, endPoint); - var i; + var htmlEscapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }; + /** + * Used by `_.escape` to convert characters to HTML entities. + * + * @private + * @param {string} chr The matched character to escape. + * @returns {string} Returns the escaped character. + */ - if (threshold === 0) { - return 'too_bendy'; - } + var escapeHtmlChar = basePropertyOf(htmlEscapes); - var maxDistance = 0; + /** Used to match HTML entities and HTML characters. */ - for (i = 1; i < points.length - 1; i++) { - var point = points[i]; - var u = positionAlongWay(point, startPoint, endPoint); - var p = geoVecInterp(startPoint, endPoint, u); - var dist = geoVecLength(p, point); + var reUnescapedHtml = /[&<>"']/g, + reHasUnescapedHtml = RegExp(reUnescapedHtml.source); + /** + * Converts the characters "&", "<", ">", '"', and "'" in `string` to their + * corresponding HTML entities. + * + * **Note:** No other characters are escaped. To escape additional + * characters use a third-party library like [_he_](https://mths.be/he). + * + * Though the ">" character is escaped for symmetry, characters like + * ">" and "/" don't need escaping in HTML and have no special meaning + * unless they're part of a tag or unquoted attribute value. See + * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands) + * (under "semi-related fun fact") for more details. + * + * When working with HTML you should always + * [quote attribute values](http://wonko.com/post/html-escaping) to reduce + * XSS vectors. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category String + * @param {string} [string=''] The string to escape. + * @returns {string} Returns the escaped string. + * @example + * + * _.escape('fred, barney, & pebbles'); + * // => 'fred, barney, & pebbles' + */ - // to bendy if point is off by 20% of total start/end distance in projected space - if (isNaN(dist) || dist > threshold) { - return 'too_bendy'; - } else if (dist > maxDistance) { - maxDistance = dist; - } - } + function escape$4(string) { + string = toString$3(string); + return string && reHasUnescapedHtml.test(string) ? string.replace(reUnescapedHtml, escapeHtmlChar) : string; + } - var keepingAllNodes = nodes.every(function(node, i) { - return i === 0 || i === nodes.length - 1 || shouldKeepNode(node, graph); - }); + /** Error message constants. */ - if (maxDistance < 0.0001 && - // Allow straightening even if already straight in order to remove extraneous nodes - keepingAllNodes) { - return 'straight_enough'; - } - }; + var FUNC_ERROR_TEXT = 'Expected a function'; + /** + * Creates a throttled function that only invokes `func` at most once per + * every `wait` milliseconds. The throttled function comes with a `cancel` + * method to cancel delayed `func` invocations and a `flush` method to + * immediately invoke them. Provide `options` to indicate whether `func` + * should be invoked on the leading and/or trailing edge of the `wait` + * timeout. The `func` is invoked with the last arguments provided to the + * throttled function. Subsequent calls to the throttled function return the + * result of the last `func` invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the throttled function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.throttle` and `_.debounce`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to throttle. + * @param {number} [wait=0] The number of milliseconds to throttle invocations to. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=true] + * Specify invoking on the leading edge of the timeout. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new throttled function. + * @example + * + * // Avoid excessively updating the position while scrolling. + * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); + * + * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes. + * var throttled = _.throttle(renewToken, 300000, { 'trailing': false }); + * jQuery(element).on('click', throttled); + * + * // Cancel the trailing throttled invocation. + * jQuery(window).on('popstate', throttled.cancel); + */ - action.transitionable = true; + function throttle(func, wait, options) { + var leading = true, + trailing = true; + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } - return action; - } + if (isObject$2(options)) { + leading = 'leading' in options ? !!options.leading : leading; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } - // `actionUnrestrictTurn` deletes a turn restriction relation. - // - // `turn` must be an `osmTurn` object with a `restrictionID` property. - // see osm/intersection.js, pathToTurn() - // - function actionUnrestrictTurn(turn) { - return function(graph) { - return actionDeleteRelation(turn.restrictionID)(graph); - }; + return debounce(func, wait, { + 'leading': leading, + 'maxWait': wait, + 'trailing': trailing + }); } - /* Reflect the given area around its axis of symmetry */ - function actionReflect(reflectIds, projection) { - var _useLongAxis = true; - - - var action = function(graph, t) { - if (t === null || !isFinite(t)) { t = 1; } - t = Math.min(Math.max(+t, 0), 1); - - var nodes = utilGetAllNodes(reflectIds, graph); - var points = nodes.map(function(n) { return projection(n.loc); }); - var ssr = geoGetSmallestSurroundingRectangle(points); - - // Choose line pq = axis of symmetry. - // The shape's surrounding rectangle has 2 axes of symmetry. - // Reflect across the longer axis by default. - var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ]; - var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ]; - var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ]; - var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ]; - var p, q; - - var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2)); - if ((_useLongAxis && isLong) || (!_useLongAxis && !isLong)) { - p = p1; - q = q1; - } else { - p = p2; - q = q2; - } - - // reflect c across pq - // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line - var dx = q[0] - p[0]; - var dy = q[1] - p[1]; - var a = (dx * dx - dy * dy) / (dx * dx + dy * dy); - var b = 2 * dx * dy / (dx * dx + dy * dy); - for (var i = 0; i < nodes.length; i++) { - var node = nodes[i]; - var c = projection(node.loc); - var c2 = [ - a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0], - b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1] - ]; - var loc2 = projection.invert(c2); - node = node.move(geoVecInterp(node.loc, loc2, t)); - graph = graph.replace(node); - } + var $$f = _export; + var lastIndexOf = arrayLastIndexOf; - return graph; - }; + // `Array.prototype.lastIndexOf` method + // https://tc39.es/ecma262/#sec-array.prototype.lastindexof + // eslint-disable-next-line es/no-array-prototype-lastindexof -- required for testing + $$f({ target: 'Array', proto: true, forced: lastIndexOf !== [].lastIndexOf }, { + lastIndexOf: lastIndexOf + }); + /** Used to map HTML entities to characters. */ - action.useLongAxis = function(val) { - if (!arguments.length) { return _useLongAxis; } - _useLongAxis = val; - return action; - }; + var htmlUnescapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'" + }; + /** + * Used by `_.unescape` to convert HTML entities to characters. + * + * @private + * @param {string} chr The matched character to unescape. + * @returns {string} Returns the unescaped character. + */ + var unescapeHtmlChar = basePropertyOf(htmlUnescapes); - action.transitionable = true; + /** Used to match HTML entities and HTML characters. */ + var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g, + reHasEscapedHtml = RegExp(reEscapedHtml.source); + /** + * The inverse of `_.escape`; this method converts the HTML entities + * `&`, `<`, `>`, `"`, and `'` in `string` to + * their corresponding characters. + * + * **Note:** No other HTML entities are unescaped. To unescape additional + * HTML entities use a third-party library like [_he_](https://mths.be/he). + * + * @static + * @memberOf _ + * @since 0.6.0 + * @category String + * @param {string} [string=''] The string to unescape. + * @returns {string} Returns the unescaped string. + * @example + * + * _.unescape('fred, barney, & pebbles'); + * // => 'fred, barney, & pebbles' + */ - return action; + function unescape$3(string) { + string = toString$3(string); + return string && reHasEscapedHtml.test(string) ? string.replace(reEscapedHtml, unescapeHtmlChar) : string; } - function actionUpgradeTags(entityId, oldTags, replaceTags) { - - return function(graph) { - var entity = graph.entity(entityId); - var tags = Object.assign({}, entity.tags); // shallow copy - var transferValue; - var semiIndex; + var global$4 = global$1o; + var isArray = isArray$8; + var lengthOfArrayLike$1 = lengthOfArrayLike$i; + var bind$3 = functionBindContext; - for (var oldTagKey in oldTags) { - if (oldTags[oldTagKey] === '*') { - transferValue = tags[oldTagKey]; - delete tags[oldTagKey]; - } else { - var vals = tags[oldTagKey].split(';').filter(Boolean); - var oldIndex = vals.indexOf(oldTags[oldTagKey]); - if (vals.length === 1 || oldIndex === -1) { - delete tags[oldTagKey]; - } else { - if (replaceTags && replaceTags[oldTagKey]) { - // replacing a value within a semicolon-delimited value, note the index - semiIndex = oldIndex; - } - vals.splice(oldIndex, 1); - tags[oldTagKey] = vals.join(';'); - } - } - } + var TypeError$2 = global$4.TypeError; - if (replaceTags) { - for (var replaceKey in replaceTags) { - var replaceValue = replaceTags[replaceKey]; - if (replaceValue === '*') { - if (tags[replaceKey] && tags[replaceKey] !== 'no') { - // allow any pre-existing value except `no` (troll tag) - continue; - } else { - // otherwise assume `yes` is okay - tags[replaceKey] = 'yes'; - } - } else if (replaceValue === '$1') { - tags[replaceKey] = transferValue; - } else { - if (tags[replaceKey] && oldTags[replaceKey] && semiIndex !== undefined) { - // don't override preexisting values - var existingVals = tags[replaceKey].split(';').filter(Boolean); - if (existingVals.indexOf(replaceValue) === -1) { - existingVals.splice(semiIndex, 0, replaceValue); - tags[replaceKey] = existingVals.join(';'); - } - } else { - tags[replaceKey] = replaceValue; - } - } - } - } + // `FlattenIntoArray` abstract operation + // https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray + var flattenIntoArray$1 = function (target, original, source, sourceLen, start, depth, mapper, thisArg) { + var targetIndex = start; + var sourceIndex = 0; + var mapFn = mapper ? bind$3(mapper, thisArg) : false; + var element, elementLen; - return graph.replace(entity.update({ tags: tags })); - }; - } + while (sourceIndex < sourceLen) { + if (sourceIndex in source) { + element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex]; - function behaviorEdit(context) { + if (depth > 0 && isArray(element)) { + elementLen = lengthOfArrayLike$1(element); + targetIndex = flattenIntoArray$1(target, original, element, elementLen, targetIndex, depth - 1) - 1; + } else { + if (targetIndex >= 0x1FFFFFFFFFFFFF) throw TypeError$2('Exceed the acceptable array length'); + target[targetIndex] = element; + } - function behavior() { - context.map() - .minzoom(context.minEditableZoom()); + targetIndex++; } + sourceIndex++; + } + return targetIndex; + }; + var flattenIntoArray_1 = flattenIntoArray$1; - behavior.off = function() { - context.map() - .minzoom(0); - }; - - return behavior; - } + var $$e = _export; + var flattenIntoArray = flattenIntoArray_1; + var aCallable = aCallable$a; + var toObject = toObject$i; + var lengthOfArrayLike = lengthOfArrayLike$i; + var arraySpeciesCreate = arraySpeciesCreate$4; - /* - The hover behavior adds the `.hover` class on pointerover to all elements to which - the identical datum is bound, and removes it on pointerout. + // `Array.prototype.flatMap` method + // https://tc39.es/ecma262/#sec-array.prototype.flatmap + $$e({ target: 'Array', proto: true }, { + flatMap: function flatMap(callbackfn /* , thisArg */) { + var O = toObject(this); + var sourceLen = lengthOfArrayLike(O); + var A; + aCallable(callbackfn); + A = arraySpeciesCreate(O, 0); + A.length = flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + return A; + } + }); - The :hover pseudo-class is insufficient for iD's purposes because a datum's visual - representation may consist of several elements scattered throughout the DOM hierarchy. - Only one of these elements can have the :hover pseudo-class, but all of them will - have the .hover class. - */ - function behaviorHover(context) { - var dispatch$1 = dispatch('hover'); - var _selection = select(null); - var _newNodeId = null; - var _initialNodeID = null; - var _altDisables; - var _ignoreVertex; - var _targets = []; + // this method was added to unscopables after implementation + // in popular engines, so it's moved to a separate module + var addToUnscopables = addToUnscopables$6; + + // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables + addToUnscopables('flatMap'); + + var $$d = _export; + var uncurryThis$6 = functionUncurryThis; + var getOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f; + var toLength$2 = toLength$c; + var toString$2 = toString$k; + var notARegExp$1 = notARegexp; + var requireObjectCoercible$2 = requireObjectCoercible$e; + var correctIsRegExpLogic$1 = correctIsRegexpLogic; + + // eslint-disable-next-line es/no-string-prototype-endswith -- safe + var un$EndsWith = uncurryThis$6(''.endsWith); + var slice$2 = uncurryThis$6(''.slice); + var min$1 = Math.min; + + var CORRECT_IS_REGEXP_LOGIC$1 = correctIsRegExpLogic$1('endsWith'); + // https://github.com/zloirock/core-js/pull/702 + var MDN_POLYFILL_BUG$1 = !CORRECT_IS_REGEXP_LOGIC$1 && !!function () { + var descriptor = getOwnPropertyDescriptor$1(String.prototype, 'endsWith'); + return descriptor && !descriptor.writable; + }(); + + // `String.prototype.endsWith` method + // https://tc39.es/ecma262/#sec-string.prototype.endswith + $$d({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG$1 && !CORRECT_IS_REGEXP_LOGIC$1 }, { + endsWith: function endsWith(searchString /* , endPosition = @length */) { + var that = toString$2(requireObjectCoercible$2(this)); + notARegExp$1(searchString); + var endPosition = arguments.length > 1 ? arguments[1] : undefined; + var len = that.length; + var end = endPosition === undefined ? len : min$1(toLength$2(endPosition), len); + var search = toString$2(searchString); + return un$EndsWith + ? un$EndsWith(that, search, end) + : slice$2(that, end - search.length, end) === search; + } + }); - // use pointer events on supported platforms; fallback to mouse events - var _pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse'; + // https://github.com/tc39/proposal-string-pad-start-end + var uncurryThis$5 = functionUncurryThis; + var toLength$1 = toLength$c; + var toString$1 = toString$k; + var $repeat = stringRepeat; + var requireObjectCoercible$1 = requireObjectCoercible$e; + + var repeat$1 = uncurryThis$5($repeat); + var stringSlice$2 = uncurryThis$5(''.slice); + var ceil = Math.ceil; + + // `String.prototype.{ padStart, padEnd }` methods implementation + var createMethod = function (IS_END) { + return function ($this, maxLength, fillString) { + var S = toString$1(requireObjectCoercible$1($this)); + var intMaxLength = toLength$1(maxLength); + var stringLength = S.length; + var fillStr = fillString === undefined ? ' ' : toString$1(fillString); + var fillLen, stringFiller; + if (intMaxLength <= stringLength || fillStr == '') return S; + fillLen = intMaxLength - stringLength; + stringFiller = repeat$1(fillStr, ceil(fillLen / fillStr.length)); + if (stringFiller.length > fillLen) stringFiller = stringSlice$2(stringFiller, 0, fillLen); + return IS_END ? S + stringFiller : stringFiller + S; + }; + }; + + var stringPad = { + // `String.prototype.padStart` method + // https://tc39.es/ecma262/#sec-string.prototype.padstart + start: createMethod(false), + // `String.prototype.padEnd` method + // https://tc39.es/ecma262/#sec-string.prototype.padend + end: createMethod(true) + }; + + // https://github.com/zloirock/core-js/issues/280 + var userAgent = engineUserAgent; + + var stringPadWebkitBug = /Version\/10(?:\.\d+){1,2}(?: [\w./]+)?(?: Mobile\/\w+)? Safari\//.test(userAgent); + + var $$c = _export; + var $padEnd = stringPad.end; + var WEBKIT_BUG$1 = stringPadWebkitBug; + + // `String.prototype.padEnd` method + // https://tc39.es/ecma262/#sec-string.prototype.padend + $$c({ target: 'String', proto: true, forced: WEBKIT_BUG$1 }, { + padEnd: function padEnd(maxLength /* , fillString = ' ' */) { + return $padEnd(this, maxLength, arguments.length > 1 ? arguments[1] : undefined); + } + }); + var $$b = _export; + var $padStart = stringPad.start; + var WEBKIT_BUG = stringPadWebkitBug; - function keydown() { - if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) { - _selection.selectAll('.hover') - .classed('hover-suppressed', true) - .classed('hover', false); + // `String.prototype.padStart` method + // https://tc39.es/ecma262/#sec-string.prototype.padstart + $$b({ target: 'String', proto: true, forced: WEBKIT_BUG }, { + padStart: function padStart(maxLength /* , fillString = ' ' */) { + return $padStart(this, maxLength, arguments.length > 1 ? arguments[1] : undefined); + } + }); - _selection - .classed('hover-disabled', true); + var $$a = _export; + var $reduceRight = arrayReduce.right; + var arrayMethodIsStrict = arrayMethodIsStrict$9; + var CHROME_VERSION = engineV8Version; + var IS_NODE = engineIsNode; - dispatch$1.call('hover', this, null); - } - } + var STRICT_METHOD = arrayMethodIsStrict('reduceRight'); + // Chrome 80-82 has a critical bug + // https://bugs.chromium.org/p/chromium/issues/detail?id=1049982 + var CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83; + // `Array.prototype.reduceRight` method + // https://tc39.es/ecma262/#sec-array.prototype.reduceright + $$a({ target: 'Array', proto: true, forced: !STRICT_METHOD || CHROME_BUG }, { + reduceRight: function reduceRight(callbackfn /* , initialValue */) { + return $reduceRight(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined); + } + }); - function keyup() { - if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) { - _selection.selectAll('.hover-suppressed') - .classed('hover-suppressed', false) - .classed('hover', true); + var $$9 = _export; + var repeat = stringRepeat; - _selection - .classed('hover-disabled', false); + // `String.prototype.repeat` method + // https://tc39.es/ecma262/#sec-string.prototype.repeat + $$9({ target: 'String', proto: true }, { + repeat: repeat + }); - dispatch$1.call('hover', this, _targets); - } - } + var $$8 = _export; + var uncurryThis$4 = functionUncurryThis; + var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f; + var toLength = toLength$c; + var toString = toString$k; + var notARegExp = notARegexp; + var requireObjectCoercible = requireObjectCoercible$e; + var correctIsRegExpLogic = correctIsRegexpLogic; + + // eslint-disable-next-line es/no-string-prototype-startswith -- safe + var un$StartsWith = uncurryThis$4(''.startsWith); + var stringSlice$1 = uncurryThis$4(''.slice); + var min = Math.min; + var CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('startsWith'); + // https://github.com/zloirock/core-js/pull/702 + var MDN_POLYFILL_BUG = !CORRECT_IS_REGEXP_LOGIC && !!function () { + var descriptor = getOwnPropertyDescriptor(String.prototype, 'startsWith'); + return descriptor && !descriptor.writable; + }(); + + // `String.prototype.startsWith` method + // https://tc39.es/ecma262/#sec-string.prototype.startswith + $$8({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, { + startsWith: function startsWith(searchString /* , position = 0 */) { + var that = toString(requireObjectCoercible(this)); + notARegExp(searchString); + var index = toLength(min(arguments.length > 1 ? arguments[1] : undefined, that.length)); + var search = toString(searchString); + return un$StartsWith + ? un$StartsWith(that, search, index) + : stringSlice$1(that, index, index + search.length) === search; + } + }); - function behavior(selection) { - _selection = selection; + var $$7 = _export; + var $trimEnd = stringTrim.end; + var forcedStringTrimMethod$1 = stringTrimForced; - _targets = []; + var FORCED$4 = forcedStringTrimMethod$1('trimEnd'); - if (_initialNodeID) { - _newNodeId = _initialNodeID; - _initialNodeID = null; - } else { - _newNodeId = null; - } + var trimEnd = FORCED$4 ? function trimEnd() { + return $trimEnd(this); + // eslint-disable-next-line es/no-string-prototype-trimstart-trimend -- safe + } : ''.trimEnd; - _selection - .on(_pointerPrefix + 'over.hover', pointerover) - .on(_pointerPrefix + 'out.hover', pointerout) - // treat pointerdown as pointerover for touch devices - .on(_pointerPrefix + 'down.hover', pointerover); + // `String.prototype.{ trimEnd, trimRight }` methods + // https://tc39.es/ecma262/#sec-string.prototype.trimend + // https://tc39.es/ecma262/#String.prototype.trimright + $$7({ target: 'String', proto: true, name: 'trimEnd', forced: FORCED$4 }, { + trimEnd: trimEnd, + trimRight: trimEnd + }); - select(window) - .on(_pointerPrefix + 'up.hover pointercancel.hover', pointerout, true) - .on('keydown.hover', keydown) - .on('keyup.hover', keyup); + var $$6 = _export; + var $trimStart = stringTrim.start; + var forcedStringTrimMethod = stringTrimForced; + var FORCED$3 = forcedStringTrimMethod('trimStart'); - function eventTarget() { - var datum = event.target && event.target.__data__; - if (typeof datum !== 'object') { return null; } - if (!(datum instanceof osmEntity) && datum.properties && (datum.properties.entity instanceof osmEntity)) { - return datum.properties.entity; - } - return datum; - } + var trimStart = FORCED$3 ? function trimStart() { + return $trimStart(this); + // eslint-disable-next-line es/no-string-prototype-trimstart-trimend -- safe + } : ''.trimStart; - function pointerover() { - // ignore mouse hovers with buttons pressed unless dragging - if (context.mode().id.indexOf('drag') === -1 && - (!event.pointerType || event.pointerType === 'mouse') && - event.buttons) { return; } + // `String.prototype.{ trimStart, trimLeft }` methods + // https://tc39.es/ecma262/#sec-string.prototype.trimstart + // https://tc39.es/ecma262/#String.prototype.trimleft + $$6({ target: 'String', proto: true, name: 'trimStart', forced: FORCED$3 }, { + trimStart: trimStart, + trimLeft: trimStart + }); - var target = eventTarget(); - if (target && _targets.indexOf(target) === -1) { - _targets.push(target); - updateHover(_targets); - } - } + var _mainLocalizer = coreLocalizer(); // singleton - function pointerout() { - var target = eventTarget(); - var index = _targets.indexOf(target); - if (index !== -1) { - _targets.splice(index); - updateHover(_targets); - } - } + var _t = _mainLocalizer.t; + // coreLocalizer manages language and locale parameters including translated strings + // - function allowsVertex(d) { - return d.geometry(context.graph()) === 'vertex' || _mainPresetIndex.allowsVertex(d, context.graph()); - } + function coreLocalizer() { + var localizer = {}; + var _dataLanguages = {}; // `_dataLocales` is an object containing all _supported_ locale codes -> language info. + // * `rtl` - right-to-left or left-to-right text direction + // * `pct` - the percent of strings translated; 1 = 100%, full coverage + // + // { + // en: { rtl: false, pct: {…} }, + // de: { rtl: false, pct: {…} }, + // … + // } - function modeAllowsHover(target) { - var mode = context.mode(); - if (mode.id === 'add-point') { - return mode.preset.matchGeometry('vertex') || - (target.type !== 'way' && target.geometry(context.graph()) !== 'vertex'); - } - return true; - } + var _dataLocales = {}; // `localeStrings` is an object containing all _loaded_ locale codes -> string data. + // { + // en: { icons: {…}, toolbar: {…}, modes: {…}, operations: {…}, … }, + // de: { icons: {…}, toolbar: {…}, modes: {…}, operations: {…}, … }, + // … + // } - function updateHover(targets) { + var _localeStrings = {}; // the current locale - _selection.selectAll('.hover') - .classed('hover', false); - _selection.selectAll('.hover-suppressed') - .classed('hover-suppressed', false); + var _localeCode = 'en-US'; // `_localeCodes` must contain `_localeCode` first, optionally followed by fallbacks - var mode = context.mode(); + var _localeCodes = ['en-US', 'en']; + var _languageCode = 'en'; + var _textDirection = 'ltr'; + var _usesMetric = false; + var _languageNames = {}; + var _scriptNames = {}; // getters for the current locale parameters - if (!_newNodeId && (mode.id === 'draw-line' || mode.id === 'draw-area')) { - var node = targets.find(function(target) { - return target instanceof osmEntity && target.type === 'node'; - }); - _newNodeId = node && node.id; - } + localizer.localeCode = function () { + return _localeCode; + }; - targets = targets.filter(function(datum) { - if (datum instanceof osmEntity) { - // If drawing a way, don't hover on a node that was just placed. #3974 - return datum.id !== _newNodeId && - (datum.type !== 'node' || !_ignoreVertex || allowsVertex(datum)) && - modeAllowsHover(datum); - } - return true; - }); + localizer.localeCodes = function () { + return _localeCodes; + }; - var selector = ''; + localizer.languageCode = function () { + return _languageCode; + }; - for (var i in targets) { - var datum = targets[i]; + localizer.textDirection = function () { + return _textDirection; + }; - // What are we hovering over? - if (datum.__featurehash__) { - // hovering custom data - selector += ', .data' + datum.__featurehash__; + localizer.usesMetric = function () { + return _usesMetric; + }; - } else if (datum instanceof QAItem) { - selector += ', .' + datum.service + '.itemId-' + datum.id; + localizer.languageNames = function () { + return _languageNames; + }; - } else if (datum instanceof osmNote) { - selector += ', .note-' + datum.id; + localizer.scriptNames = function () { + return _scriptNames; + }; // The client app may want to manually set the locale, regardless of the + // settings provided by the browser - } else if (datum instanceof osmEntity) { - selector += ', .' + datum.id; - if (datum.type === 'relation') { - for (var j in datum.members) { - selector += ', .' + datum.members[j].id; - } - } - } - } - var suppressed = _altDisables && event && event.altKey; + var _preferredLocaleCodes = []; - if (selector.trim().length) { - // remove the first comma - selector = selector.slice(1); - _selection.selectAll(selector) - .classed(suppressed ? 'hover-suppressed' : 'hover', true); - } + localizer.preferredLocaleCodes = function (codes) { + if (!arguments.length) return _preferredLocaleCodes; - dispatch$1.call('hover', this, !suppressed && targets); - } + if (typeof codes === 'string') { + // be generous and accept delimited strings as input + _preferredLocaleCodes = codes.split(/,|;| /gi).filter(Boolean); + } else { + _preferredLocaleCodes = codes; } + return localizer; + }; - behavior.off = function(selection) { - selection.selectAll('.hover') - .classed('hover', false); - selection.selectAll('.hover-suppressed') - .classed('hover-suppressed', false); - selection - .classed('hover-disabled', false); - - selection - .on(_pointerPrefix + 'over.hover', null) - .on(_pointerPrefix + 'out.hover', null) - .on(_pointerPrefix + 'down.hover', null); + var _loadPromise; - select(window) - .on(_pointerPrefix + 'up.hover pointercancel.hover', null, true) - .on('keydown.hover', null) - .on('keyup.hover', null); + localizer.ensureLoaded = function () { + if (_loadPromise) return _loadPromise; + var filesToFetch = ['languages', // load the list of languages + 'locales' // load the list of supported locales + ]; + var localeDirs = { + general: 'locales', + tagging: 'https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@3/dist/translations' }; + var fileMap = _mainFileFetcher.fileMap(); + for (var scopeId in localeDirs) { + var key = "locales_index_".concat(scopeId); - behavior.altDisables = function(val) { - if (!arguments.length) { return _altDisables; } - _altDisables = val; - return behavior; - }; - - behavior.ignoreVertex = function(val) { - if (!arguments.length) { return _ignoreVertex; } - _ignoreVertex = val; - return behavior; - }; + if (!fileMap[key]) { + fileMap[key] = localeDirs[scopeId] + '/index.min.json'; + } - behavior.initialNodeID = function(nodeId) { - _initialNodeID = nodeId; - return behavior; - }; + filesToFetch.push(key); + } - return utilRebind(behavior, dispatch$1, 'on'); - } + return _loadPromise = Promise.all(filesToFetch.map(function (key) { + return _mainFileFetcher.get(key); + })).then(function (results) { + _dataLanguages = results[0]; + _dataLocales = results[1]; + var indexes = results.slice(2); - var _disableSpace = false; - var _lastSpace = null; + var requestedLocales = (_preferredLocaleCodes || []).concat(utilDetect().browserLocales) // List of locales preferred by the browser in priority order. + .concat(['en']); // fallback to English since it's the only guaranteed complete language - function behaviorDraw(context) { - var dispatch$1 = dispatch( - 'move', 'down', 'downcancel', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish' - ); + _localeCodes = localesToUseFrom(requestedLocales); + _localeCode = _localeCodes[0]; // Run iD in the highest-priority locale; the rest are fallbacks - var keybinding = utilKeybinding('draw'); + var loadStringsPromises = []; + indexes.forEach(function (index, i) { + // Will always return the index for `en` if nothing else + var fullCoverageIndex = _localeCodes.findIndex(function (locale) { + return index[locale] && index[locale].pct === 1; + }); // We only need to load locales up until we find one with full coverage - var _hover = behaviorHover(context) - .altDisables(true) - .ignoreVertex(true) - .on('hover', context.ui().sidebar.hover); - var _edit = behaviorEdit(context); - var _closeTolerance = 4; - var _tolerance = 12; - var _mouseLeave = false; - var _lastMouse = null; - var _lastPointerUpEvent; + _localeCodes.slice(0, fullCoverageIndex + 1).forEach(function (code) { + var scopeId = Object.keys(localeDirs)[i]; + var directory = Object.values(localeDirs)[i]; + if (index[code]) loadStringsPromises.push(localizer.loadLocale(code, scopeId, directory)); + }); + }); + return Promise.all(loadStringsPromises); + }).then(function () { + updateForCurrentLocale(); + })["catch"](function (err) { + return console.error(err); + }); // eslint-disable-line + }; // Returns the locales from `requestedLocales` supported by iD that we should use + + + function localesToUseFrom(requestedLocales) { + var supportedLocales = _dataLocales; + var toUse = []; + + for (var i in requestedLocales) { + var locale = requestedLocales[i]; + if (supportedLocales[locale]) toUse.push(locale); + + if (locale.includes('-')) { + // Full locale ('es-ES'), add fallback to the base ('es') + var langPart = locale.split('-')[0]; + if (supportedLocales[langPart]) toUse.push(langPart); + } + } // remove duplicates - var _downPointer; - // use pointer events on supported platforms; fallback to mouse events - var _pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse'; + return utilArrayUniq(toUse); + } + function updateForCurrentLocale() { + if (!_localeCode) return; + _languageCode = _localeCode.split('-')[0]; + var currentData = _dataLocales[_localeCode] || _dataLocales[_languageCode]; + var hash = utilStringQs(window.location.hash); - // related code - // - `mode/drag_node.js` `datum()` - function datum() { - var mode = context.mode(); - var isNote = mode && (mode.id.indexOf('note') !== -1); - if (event.altKey || isNote) { return {}; } + if (hash.rtl === 'true') { + _textDirection = 'rtl'; + } else if (hash.rtl === 'false') { + _textDirection = 'ltr'; + } else { + _textDirection = currentData && currentData.rtl ? 'rtl' : 'ltr'; + } - var element; - if (event.type === 'keydown') { - element = _lastMouse && _lastMouse.target; - } else { - element = event.target; - } + var locale = _localeCode; + if (locale.toLowerCase() === 'en-us') locale = 'en'; + _languageNames = _localeStrings.general[locale].languageNames; + _scriptNames = _localeStrings.general[locale].scriptNames; + _usesMetric = _localeCode.slice(-3).toLowerCase() !== '-us'; + } + /* Locales */ + // Returns a Promise to load the strings for the requested locale - // When drawing, snap only to touch targets.. - // (this excludes area fills and active drawing elements) - var d = element.__data__; - return (d && d.properties && d.properties.target) ? d : {}; - } - function pointerdown() { + localizer.loadLocale = function (locale, scopeId, directory) { + // US English is the default + if (locale.toLowerCase() === 'en-us') locale = 'en'; - if (_downPointer) { return; } + if (_localeStrings[scopeId] && _localeStrings[scopeId][locale]) { + // already loaded + return Promise.resolve(locale); + } - var pointerLocGetter = utilFastMouse(this); - _downPointer = { - id: event.pointerId || 'mouse', - pointerLocGetter: pointerLocGetter, - downTime: +new Date(), - downLoc: pointerLocGetter(event) - }; + var fileMap = _mainFileFetcher.fileMap(); + var key = "locale_".concat(scopeId, "_").concat(locale); - dispatch$1.call('down', this, datum()); + if (!fileMap[key]) { + fileMap[key] = "".concat(directory, "/").concat(locale, ".min.json"); } - function pointerup() { + return _mainFileFetcher.get(key).then(function (d) { + if (!_localeStrings[scopeId]) _localeStrings[scopeId] = {}; + _localeStrings[scopeId][locale] = d[locale]; + return locale; + }); + }; - if (!_downPointer || _downPointer.id !== (event.pointerId || 'mouse')) { return; } + localizer.pluralRule = function (number) { + return pluralRule(number, _localeCode); + }; // Returns the plural rule for the given `number` with the given `localeCode`. + // One of: `zero`, `one`, `two`, `few`, `many`, `other` - var downPointer = _downPointer; - _downPointer = null; - _lastPointerUpEvent = event; + function pluralRule(number, localeCode) { + // modern browsers have this functionality built-in + var rules = 'Intl' in window && Intl.PluralRules && new Intl.PluralRules(localeCode); - if (downPointer.isCancelled) { return; } + if (rules) { + return rules.select(number); + } // fallback to basic one/other, as in English - var t2 = +new Date(); - var p2 = downPointer.pointerLocGetter(event); - var dist = geoVecLength(downPointer.downLoc, p2); - if (dist < _closeTolerance || (dist < _tolerance && (t2 - downPointer.downTime) < 500)) { - // Prevent a quick second click - select(window).on('click.draw-block', function() { - event.stopPropagation(); - }, true); + if (number === 1) return 'one'; + return 'other'; + } + /** + * Try to find that string in `locale` or the current `_localeCode` matching + * the given `stringId`. If no string can be found in the requested locale, + * we'll recurse down all the `_localeCodes` until one is found. + * + * @param {string} stringId string identifier + * @param {object?} replacements token replacements and default string + * @param {string?} locale locale to use (defaults to currentLocale) + * @return {string?} localized string + */ - context.map().dblclickZoomEnable(false); - window.setTimeout(function() { - context.map().dblclickZoomEnable(true); - select(window).on('click.draw-block', null); - }, 500); + localizer.tInfo = function (origStringId, replacements, locale) { + var stringId = origStringId.trim(); + var scopeId = 'general'; - click(p2); - } + if (stringId[0] === '_') { + var split = stringId.split('.'); + scopeId = split[0].slice(1); + stringId = split.slice(1).join('.'); } - function pointermove() { - if (_downPointer && - _downPointer.id === (event.pointerId || 'mouse') && - !_downPointer.isCancelled) { - var p2 = _downPointer.pointerLocGetter(event); - var dist = geoVecLength(_downPointer.downLoc, p2); - if (dist >= _closeTolerance) { - _downPointer.isCancelled = true; - dispatch$1.call('downcancel', this); - } - } - - if ((event.pointerType && event.pointerType !== 'mouse') || - event.buttons || - _downPointer) { return; } + locale = locale || _localeCode; + var path = stringId.split('.').map(function (s) { + return s.replace(//g, '.'); + }).reverse(); + var stringsKey = locale; // US English is the default - // HACK: Mobile Safari likes to send one or more `mouse` type pointermove - // events immediately after non-mouse pointerup events; detect and ignore them. - if (_lastPointerUpEvent && - _lastPointerUpEvent.pointerType !== 'mouse' && - event.timeStamp - _lastPointerUpEvent.timeStamp < 100) { return; } + if (stringsKey.toLowerCase() === 'en-us') stringsKey = 'en'; + var result = _localeStrings && _localeStrings[scopeId] && _localeStrings[scopeId][stringsKey]; - _lastMouse = event; - dispatch$1.call('move', this, datum()); + while (result !== undefined && path.length) { + result = result[path.pop()]; } - function pointercancel() { - if (_downPointer && - _downPointer.id === (event.pointerId || 'mouse')) { + if (result !== undefined) { + if (replacements) { + if (_typeof(result) === 'object' && Object.keys(result).length) { + // If plural forms are provided, dig one level deeper based on the + // first numeric token replacement provided. + var number = Object.values(replacements).find(function (value) { + return typeof value === 'number'; + }); + + if (number !== undefined) { + var rule = pluralRule(number, locale); - if (!_downPointer.isCancelled) { - dispatch$1.call('downcancel', this); + if (result[rule]) { + result = result[rule]; + } else { + // We're pretty sure this should be a plural but no string + // could be found for the given rule. Just pick the first + // string and hope it makes sense. + result = Object.values(result)[0]; } - _downPointer = null; + } } - } - function mouseenter() { - _mouseLeave = false; - } + if (typeof result === 'string') { + for (var key in replacements) { + var value = replacements[key]; - function mouseleave() { - _mouseLeave = true; - } + if (typeof value === 'number') { + if (value.toLocaleString) { + // format numbers for the locale + value = value.toLocaleString(locale, { + style: 'decimal', + useGrouping: true, + minimumFractionDigits: 0 + }); + } else { + value = value.toString(); + } + } - function allowsVertex(d) { - return d.geometry(context.graph()) === 'vertex' || _mainPresetIndex.allowsVertex(d, context.graph()); - } + var token = "{".concat(key, "}"); + var regex = new RegExp(token, 'g'); + result = result.replace(regex, value); + } + } + } - // related code - // - `mode/drag_node.js` `doMove()` - // - `behavior/draw.js` `click()` - // - `behavior/draw_way.js` `move()` - function click(loc) { - var d = datum(); - var target = d && d.properties && d.properties.entity; + if (typeof result === 'string') { + // found a localized string! + return { + text: result, + locale: locale + }; + } + } // no localized string found... + // attempt to fallback to a lower-priority language - var mode = context.mode(); - if (target && target.type === 'node' && allowsVertex(target)) { // Snap to a node - dispatch$1.call('clickNode', this, target, d); - return; + var index = _localeCodes.indexOf(locale); - } else if (target && target.type === 'way' && (mode.id !== 'add-point' || mode.preset.matchGeometry('vertex'))) { // Snap to a way - var choice = geoChooseEdge( - context.graph().childNodes(target), loc, context.projection, context.activeID() - ); - if (choice) { - var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]]; - dispatch$1.call('clickWay', this, choice.loc, edge, d); - return; - } - } else if (mode.id !== 'add-point' || mode.preset.matchGeometry('point')) { - var locLatLng = context.projection.invert(loc); - dispatch$1.call('click', this, locLatLng, d); - } + if (index >= 0 && index < _localeCodes.length - 1) { + // eventually this will be 'en' or another locale with 100% coverage + var fallback = _localeCodes[index + 1]; + return localizer.tInfo(origStringId, replacements, fallback); + } + if (replacements && 'default' in replacements) { + // Fallback to a default value if one is specified in `replacements` + return { + text: replacements["default"], + locale: null + }; } - // treat a spacebar press like a click - function space() { - event.preventDefault(); - event.stopPropagation(); + var missing = "Missing ".concat(locale, " translation: ").concat(origStringId); + if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line - var currSpace = context.map().mouse(); - if (_disableSpace && _lastSpace) { - var dist = geoVecLength(_lastSpace, currSpace); - if (dist > _tolerance) { - _disableSpace = false; - } - } + return { + text: missing, + locale: 'en' + }; + }; - if (_disableSpace || _mouseLeave || !_lastMouse) { return; } + localizer.hasTextForStringId = function (stringId) { + return !!localizer.tInfo(stringId, { + "default": 'nothing found' + }).locale; + }; // Returns only the localized text, discarding the locale info - // user must move mouse or release space bar to allow another click - _lastSpace = currSpace; - _disableSpace = true; - select(window).on('keyup.space-block', function() { - event.preventDefault(); - event.stopPropagation(); - _disableSpace = false; - select(window).on('keyup.space-block', null); - }); + localizer.t = function (stringId, replacements, locale) { + return localizer.tInfo(stringId, replacements, locale).text; + }; // Returns the localized text wrapped in an HTML element encoding the locale info - // get the current mouse position - var loc = context.map().mouse() || - // or the map center if the mouse has never entered the map - context.projection(context.map().center()); - click(loc); - } + /** + * @deprecated This method is considered deprecated. Instead, use the direct DOM manipulating + * method `t.append`. + */ - function backspace() { - event.preventDefault(); - dispatch$1.call('undo'); - } + localizer.t.html = function (stringId, replacements, locale) { + // replacement string might be html unsafe, so we need to escape it except if it is explicitly marked as html code + replacements = Object.assign({}, replacements); + for (var k in replacements) { + if (typeof replacements[k] === 'string') { + replacements[k] = escape$4(replacements[k]); + } - function del() { - event.preventDefault(); - dispatch$1.call('cancel'); + if (_typeof(replacements[k]) === 'object' && typeof replacements[k].html === 'string') { + replacements[k] = replacements[k].html; + } } + var info = localizer.tInfo(stringId, replacements, locale); // text may be empty or undefined if `replacements.default` is - function ret() { - event.preventDefault(); - dispatch$1.call('finish'); + if (info.text) { + return "").concat(info.text, ""); + } else { + return ''; } + }; // Adds localized text wrapped as an HTML span element with locale info to the DOM - function behavior(selection) { - context.install(_hover); - context.install(_edit); + localizer.t.append = function (stringId, replacements, locale) { + return function (selection) { + var info = localizer.tInfo(stringId, replacements, locale); + return selection.append('span').attr('class', 'localized-text').attr('lang', info.locale || 'und').text((replacements && replacements.prefix || '') + info.text + (replacements && replacements.suffix || '')); + }; + }; - _downPointer = null; + localizer.languageName = function (code, options) { + if (_languageNames[code]) { + // name in locale language + // e.g. "German" + return _languageNames[code]; + } // sometimes we only want the local name - keybinding - .on('⌫', backspace) - .on('⌦', del) - .on('⎋', ret) - .on('↩', ret) - .on('space', space) - .on('⌥space', space); - selection - .on('mouseenter.draw', mouseenter) - .on('mouseleave.draw', mouseleave) - .on(_pointerPrefix + 'down.draw', pointerdown) - .on(_pointerPrefix + 'move.draw', pointermove); + if (options && options.localOnly) return null; + var langInfo = _dataLanguages[code]; - select(window) - .on(_pointerPrefix + 'up.draw', pointerup, true) - .on('pointercancel.draw', pointercancel, true); + if (langInfo) { + if (langInfo.nativeName) { + // name in native language + // e.g. "Deutsch (de)" + return localizer.t('translate.language_and_code', { + language: langInfo.nativeName, + code: code + }); + } else if (langInfo.base && langInfo.script) { + var base = langInfo.base; // the code of the language this is based on - select(document) - .call(keybinding); + if (_languageNames[base]) { + // base language name in locale language + var scriptCode = langInfo.script; + var script = _scriptNames[scriptCode] || scriptCode; // e.g. "Serbian (Cyrillic)" - return behavior; + return localizer.t('translate.language_and_code', { + language: _languageNames[base], + code: script + }); + } else if (_dataLanguages[base] && _dataLanguages[base].nativeName) { + // e.g. "српски (sr-Cyrl)" + return localizer.t('translate.language_and_code', { + language: _dataLanguages[base].nativeName, + code: code + }); + } + } } + return code; // if not found, use the code + }; - behavior.off = function(selection) { - context.ui().sidebar.hover.cancel(); - context.uninstall(_hover); - context.uninstall(_edit); + return localizer; + } - selection - .on('mouseenter.draw', null) - .on('mouseleave.draw', null) - .on(_pointerPrefix + 'down.draw', null) - .on(_pointerPrefix + 'move.draw', null); + // `presetCollection` is a wrapper around an `Array` of presets `collection`, + // and decorated with some extra methods for searching and matching geometry + // - select(window) - .on(_pointerPrefix + 'up.draw', null) - .on('pointercancel.draw', null); - // note: keyup.space-block, click.draw-block should remain + function presetCollection(collection) { + var MAXRESULTS = 50; + var _this = {}; + var _memo = {}; + _this.collection = collection; - select(document) - .call(keybinding.unbind); - }; + _this.item = function (id) { + if (_memo[id]) return _memo[id]; + var found = _this.collection.find(function (d) { + return d.id === id; + }); - behavior.hover = function() { - return _hover; - }; + if (found) _memo[id] = found; + return found; + }; + _this.index = function (id) { + return _this.collection.findIndex(function (d) { + return d.id === id; + }); + }; - return utilRebind(behavior, dispatch$1, 'on'); - } + _this.matchGeometry = function (geometry) { + return presetCollection(_this.collection.filter(function (d) { + return d.matchGeometry(geometry); + })); + }; - function initRange(domain, range) { - switch (arguments.length) { - case 0: break; - case 1: this.range(domain); break; - default: this.range(range).domain(domain); break; - } - return this; - } + _this.matchAllGeometry = function (geometries) { + return presetCollection(_this.collection.filter(function (d) { + return d && d.matchAllGeometry(geometries); + })); + }; - var prefix = "$"; + _this.matchAnyGeometry = function (geometries) { + return presetCollection(_this.collection.filter(function (d) { + return geometries.some(function (geom) { + return d.matchGeometry(geom); + }); + })); + }; - function Map$1() {} + _this.fallback = function (geometry) { + var id = geometry; + if (id === 'vertex') id = 'point'; + return _this.item(id); + }; - Map$1.prototype = map$2.prototype = { - constructor: Map$1, - has: function(key) { - return (prefix + key) in this; - }, - get: function(key) { - return this[prefix + key]; - }, - set: function(key, value) { - this[prefix + key] = value; - return this; - }, - remove: function(key) { - var property = prefix + key; - return property in this && delete this[property]; - }, - clear: function() { - for (var property in this) { if (property[0] === prefix) { delete this[property]; } } - }, - keys: function() { - var keys = []; - for (var property in this) { if (property[0] === prefix) { keys.push(property.slice(1)); } } - return keys; - }, - values: function() { - var values = []; - for (var property in this) { if (property[0] === prefix) { values.push(this[property]); } } - return values; - }, - entries: function() { - var entries = []; - for (var property in this) { if (property[0] === prefix) { entries.push({key: property.slice(1), value: this[property]}); } } - return entries; - }, - size: function() { - var size = 0; - for (var property in this) { if (property[0] === prefix) { ++size; } } - return size; - }, - empty: function() { - for (var property in this) { if (property[0] === prefix) { return false; } } - return true; - }, - each: function(f) { - for (var property in this) { if (property[0] === prefix) { f(this[property], property.slice(1), this); } } - } - }; + _this.search = function (value, geometry, loc) { + if (!value) return _this; // don't remove diacritical characters since we're assuming the user is being intentional - function map$2(object, f) { - var map = new Map$1; + value = value.toLowerCase().trim(); // match at name beginning or just after a space (e.g. "office" -> match "Law Office") - // Copy constructor. - if (object instanceof Map$1) { object.each(function(value, key) { map.set(key, value); }); } + function leading(a) { + var index = a.indexOf(value); + return index === 0 || a[index - 1] === ' '; + } // match at name beginning only - // Index array by numeric index or specified key function. - else if (Array.isArray(object)) { - var i = -1, - n = object.length, - o; - if (f == null) { while (++i < n) { map.set(i, object[i]); } } - else { while (++i < n) { map.set(f(o = object[i], i, object), o); } } - } + function leadingStrict(a) { + var index = a.indexOf(value); + return index === 0; + } - // Convert object to map. - else if (object) { for (var key in object) { map.set(key, object[key]); } } + function sortPresets(nameProp) { + return function sortNames(a, b) { + var aCompare = a[nameProp](); + var bCompare = b[nameProp](); // priority if search string matches preset name exactly - #4325 - return map; - } + if (value === aCompare) return -1; + if (value === bCompare) return 1; // priority for higher matchScore - function Set$1() {} + var i = b.originalScore - a.originalScore; + if (i !== 0) return i; // priority if search string appears earlier in preset name - var proto = map$2.prototype; + i = aCompare.indexOf(value) - bCompare.indexOf(value); + if (i !== 0) return i; // priority for shorter preset names - Set$1.prototype = set$2.prototype = { - constructor: Set$1, - has: proto.has, - add: function(value) { - value += ""; - this[prefix + value] = value; - return this; - }, - remove: proto.remove, - clear: proto.clear, - values: proto.keys, - size: proto.size, - empty: proto.empty, - each: proto.each - }; + return aCompare.length - bCompare.length; + }; + } - function set$2(object, f) { - var set = new Set$1; + var pool = _this.collection; - // Copy constructor. - if (object instanceof Set$1) { object.each(function(value) { set.add(value); }); } + if (Array.isArray(loc)) { + var validLocations = _mainLocations.locationsAt(loc); + pool = pool.filter(function (a) { + return !a.locationSetID || validLocations[a.locationSetID]; + }); + } - // Otherwise, assume it’s an array. - else if (object) { - var i = -1, n = object.length; - if (f == null) { while (++i < n) { set.add(object[i]); } } - else { while (++i < n) { set.add(f(object[i], i, object)); } } - } + var searchable = pool.filter(function (a) { + return a.searchable !== false && a.suggestion !== true; + }); + var suggestions = pool.filter(function (a) { + return a.suggestion === true; + }); // matches value to preset.name + + var leadingNames = searchable.filter(function (a) { + return leading(a.searchName()); + }).sort(sortPresets('searchName')); // matches value to preset suggestion name + + var leadingSuggestions = suggestions.filter(function (a) { + return leadingStrict(a.searchName()); + }).sort(sortPresets('searchName')); + var leadingNamesStripped = searchable.filter(function (a) { + return leading(a.searchNameStripped()); + }).sort(sortPresets('searchNameStripped')); + var leadingSuggestionsStripped = suggestions.filter(function (a) { + return leadingStrict(a.searchNameStripped()); + }).sort(sortPresets('searchNameStripped')); // matches value to preset.terms values + + var leadingTerms = searchable.filter(function (a) { + return (a.terms() || []).some(leading); + }); + var leadingSuggestionTerms = suggestions.filter(function (a) { + return (a.terms() || []).some(leading); + }); // matches value to preset.tags values - return set; - } + var leadingTagValues = searchable.filter(function (a) { + return Object.values(a.tags || {}).filter(function (val) { + return val !== '*'; + }).some(leading); + }); // finds close matches to value in preset.name - var array$1 = Array.prototype; + var similarName = searchable.map(function (a) { + return { + preset: a, + dist: utilEditDistance(value, a.searchName()) + }; + }).filter(function (a) { + return a.dist + Math.min(value.length - a.preset.searchName().length, 0) < 3; + }).sort(function (a, b) { + return a.dist - b.dist; + }).map(function (a) { + return a.preset; + }); // finds close matches to value to preset suggestion name + + var similarSuggestions = suggestions.map(function (a) { + return { + preset: a, + dist: utilEditDistance(value, a.searchName()) + }; + }).filter(function (a) { + return a.dist + Math.min(value.length - a.preset.searchName().length, 0) < 1; + }).sort(function (a, b) { + return a.dist - b.dist; + }).map(function (a) { + return a.preset; + }); // finds close matches to value in preset.terms + + var similarTerms = searchable.filter(function (a) { + return (a.terms() || []).some(function (b) { + return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3; + }); + }); + var results = leadingNames.concat(leadingSuggestions, leadingNamesStripped, leadingSuggestionsStripped, leadingTerms, leadingSuggestionTerms, leadingTagValues, similarName, similarSuggestions, similarTerms).slice(0, MAXRESULTS - 1); - var map$3 = array$1.map; - var slice$4 = array$1.slice; + if (geometry) { + if (typeof geometry === 'string') { + results.push(_this.fallback(geometry)); + } else { + geometry.forEach(function (geom) { + return results.push(_this.fallback(geom)); + }); + } + } - function constant$4(x) { - return function() { - return x; + return presetCollection(utilArrayUniq(results)); }; - } - - function number$1(x) { - return +x; - } - - var unit = [0, 1]; - function identity$3(x) { - return x; - } - - function normalize(a, b) { - return (b -= (a = +a)) - ? function(x) { return (x - a) / b; } - : constant$4(isNaN(b) ? NaN : 0.5); - } - - function clamper(domain) { - var a = domain[0], b = domain[domain.length - 1], t; - if (a > b) { t = a, a = b, b = t; } - return function(x) { return Math.max(a, Math.min(b, x)); }; + return _this; } - // normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1]. - // interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b]. - function bimap(domain, range, interpolate) { - var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1]; - if (d1 < d0) { d0 = normalize(d1, d0), r0 = interpolate(r1, r0); } - else { d0 = normalize(d0, d1), r0 = interpolate(r0, r1); } - return function(x) { return r0(d0(x)); }; - } + // `presetCategory` builds a `presetCollection` of member presets, + // decorated with some extra methods for searching and matching geometry + // - function polymap(domain, range, interpolate) { - var j = Math.min(domain.length, range.length) - 1, - d = new Array(j), - r = new Array(j), - i = -1; + function presetCategory(categoryID, category, allPresets) { + var _this = Object.assign({}, category); // shallow copy - // Reverse descending domains. - if (domain[j] < domain[0]) { - domain = domain.slice().reverse(); - range = range.slice().reverse(); - } - while (++i < j) { - d[i] = normalize(domain[i], domain[i + 1]); - r[i] = interpolate(range[i], range[i + 1]); - } + var _searchName; // cache - return function(x) { - var i = bisectRight(domain, x, 1, j) - 1; - return r[i](d[i](x)); - }; - } - function copy$1(source, target) { - return target - .domain(source.domain()) - .range(source.range()) - .interpolate(source.interpolate()) - .clamp(source.clamp()) - .unknown(source.unknown()); - } + var _searchNameStripped; // cache - function transformer$1() { - var domain = unit, - range = unit, - interpolate$1 = interpolate, - transform, - untransform, - unknown, - clamp = identity$3, - piecewise, - output, - input; - function rescale() { - piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap; - output = input = null; - return scale; - } + _this.id = categoryID; + _this.members = presetCollection((category.members || []).map(function (presetID) { + return allPresets[presetID]; + }).filter(Boolean)); + _this.geometry = _this.members.collection.reduce(function (acc, preset) { + for (var i in preset.geometry) { + var geometry = preset.geometry[i]; + + if (acc.indexOf(geometry) === -1) { + acc.push(geometry); + } + } - function scale(x) { - return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate$1)))(transform(clamp(x))); - } + return acc; + }, []); - scale.invert = function(y) { - return clamp(untransform((input || (input = piecewise(range, domain.map(transform), d3_interpolateNumber)))(y))); + _this.matchGeometry = function (geom) { + return _this.geometry.indexOf(geom) >= 0; }; - scale.domain = function(_) { - return arguments.length ? (domain = map$3.call(_, number$1), clamp === identity$3 || (clamp = clamper(domain)), rescale()) : domain.slice(); + _this.matchAllGeometry = function (geometries) { + return _this.members.collection.some(function (preset) { + return preset.matchAllGeometry(geometries); + }); }; - scale.range = function(_) { - return arguments.length ? (range = slice$4.call(_), rescale()) : range.slice(); + _this.matchScore = function () { + return -1; }; - scale.rangeRound = function(_) { - return range = slice$4.call(_), interpolate$1 = interpolateRound, rescale(); + _this.name = function () { + return _t("_tagging.presets.categories.".concat(categoryID, ".name"), { + 'default': categoryID + }); }; - scale.clamp = function(_) { - return arguments.length ? (clamp = _ ? clamper(domain) : identity$3, scale) : clamp !== identity$3; + _this.nameLabel = function () { + return _t.html("_tagging.presets.categories.".concat(categoryID, ".name"), { + 'default': categoryID + }); }; - scale.interpolate = function(_) { - return arguments.length ? (interpolate$1 = _, rescale()) : interpolate$1; + _this.terms = function () { + return []; }; - scale.unknown = function(_) { - return arguments.length ? (unknown = _, scale) : unknown; - }; + _this.searchName = function () { + if (!_searchName) { + _searchName = (_this.suggestion ? _this.originalName : _this.name()).toLowerCase(); + } - return function(t, u) { - transform = t, untransform = u; - return rescale(); + return _searchName; }; - } - - function continuous(transform, untransform) { - return transformer$1()(transform, untransform); - } - - // Computes the decimal coefficient and exponent of the specified number x with - // significant digits p, where x is positive and p is in [1, 21] or undefined. - // For example, formatDecimal(1.23) returns ["123", 0]. - function formatDecimal(x, p) { - if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) { return null; } // NaN, ±Infinity - var i, coefficient = x.slice(0, i); - // The string returned by toExponential either has the form \d\.\d+e[-+]\d+ - // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3). - return [ - coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, - +x.slice(i + 1) - ]; - } + _this.searchNameStripped = function () { + if (!_searchNameStripped) { + _searchNameStripped = _this.searchName(); // split combined diacritical characters into their parts - function exponent(x) { - return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN; - } - - function formatGroup(grouping, thousands) { - return function(value, width) { - var i = value.length, - t = [], - j = 0, - g = grouping[0], - length = 0; + if (_searchNameStripped.normalize) _searchNameStripped = _searchNameStripped.normalize('NFD'); // remove diacritics - while (i > 0 && g > 0) { - if (length + g + 1 > width) { g = Math.max(1, width - length); } - t.push(value.substring(i -= g, i + g)); - if ((length += g + 1) > width) { break; } - g = grouping[j = (j + 1) % grouping.length]; + _searchNameStripped = _searchNameStripped.replace(/[\u0300-\u036f]/g, ''); } - return t.reverse().join(thousands); + return _searchNameStripped; }; - } - function formatNumerals(numerals) { - return function(value) { - return value.replace(/[0-9]/g, function(i) { - return numerals[+i]; - }); - }; + return _this; } - // [[fill]align][sign][symbol][0][width][,][.precision][~][type] - var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i; - - function formatSpecifier(specifier) { - if (!(match = re.exec(specifier))) { throw new Error("invalid format: " + specifier); } - var match; - return new FormatSpecifier({ - fill: match[1], - align: match[2], - sign: match[3], - symbol: match[4], - zero: match[5], - width: match[6], - comma: match[7], - precision: match[8] && match[8].slice(1), - trim: match[9], - type: match[10] - }); - } + // `presetField` decorates a given `field` Object + // with some extra methods for searching and matching geometry + // - formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof + function presetField(fieldID, field) { + var _this = Object.assign({}, field); // shallow copy - function FormatSpecifier(specifier) { - this.fill = specifier.fill === undefined ? " " : specifier.fill + ""; - this.align = specifier.align === undefined ? ">" : specifier.align + ""; - this.sign = specifier.sign === undefined ? "-" : specifier.sign + ""; - this.symbol = specifier.symbol === undefined ? "" : specifier.symbol + ""; - this.zero = !!specifier.zero; - this.width = specifier.width === undefined ? undefined : +specifier.width; - this.comma = !!specifier.comma; - this.precision = specifier.precision === undefined ? undefined : +specifier.precision; - this.trim = !!specifier.trim; - this.type = specifier.type === undefined ? "" : specifier.type + ""; - } - FormatSpecifier.prototype.toString = function() { - return this.fill - + this.align - + this.sign - + this.symbol - + (this.zero ? "0" : "") - + (this.width === undefined ? "" : Math.max(1, this.width | 0)) - + (this.comma ? "," : "") - + (this.precision === undefined ? "" : "." + Math.max(0, this.precision | 0)) - + (this.trim ? "~" : "") - + this.type; - }; + _this.id = fieldID; // for use in classes, element ids, css selectors - // Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k. - function formatTrim(s) { - out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) { - switch (s[i]) { - case ".": i0 = i1 = i; break; - case "0": if (i0 === 0) { i0 = i; } i1 = i; break; - default: if (!+s[i]) { break out; } if (i0 > 0) { i0 = 0; } break; - } - } - return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s; - } + _this.safeid = utilSafeClassName(fieldID); - var prefixExponent; + _this.matchGeometry = function (geom) { + return !_this.geometry || _this.geometry.indexOf(geom) !== -1; + }; - function formatPrefixAuto(x, p) { - var d = formatDecimal(x, p); - if (!d) { return x + ""; } - var coefficient = d[0], - exponent = d[1], - i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, - n = coefficient.length; - return i === n ? coefficient - : i > n ? coefficient + new Array(i - n + 1).join("0") - : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) - : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y! - } + _this.matchAllGeometry = function (geometries) { + return !_this.geometry || geometries.every(function (geom) { + return _this.geometry.indexOf(geom) !== -1; + }); + }; - function formatRounded(x, p) { - var d = formatDecimal(x, p); - if (!d) { return x + ""; } - var coefficient = d[0], - exponent = d[1]; - return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient - : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) - : coefficient + new Array(exponent - coefficient.length + 2).join("0"); - } + _this.t = function (scope, options) { + return _t("_tagging.presets.fields.".concat(fieldID, ".").concat(scope), options); + }; - var formatTypes = { - "%": function(x, p) { return (x * 100).toFixed(p); }, - "b": function(x) { return Math.round(x).toString(2); }, - "c": function(x) { return x + ""; }, - "d": function(x) { return Math.round(x).toString(10); }, - "e": function(x, p) { return x.toExponential(p); }, - "f": function(x, p) { return x.toFixed(p); }, - "g": function(x, p) { return x.toPrecision(p); }, - "o": function(x) { return Math.round(x).toString(8); }, - "p": function(x, p) { return formatRounded(x * 100, p); }, - "r": formatRounded, - "s": formatPrefixAuto, - "X": function(x) { return Math.round(x).toString(16).toUpperCase(); }, - "x": function(x) { return Math.round(x).toString(16); } - }; + _this.t.html = function (scope, options) { + return _t.html("_tagging.presets.fields.".concat(fieldID, ".").concat(scope), options); + }; - function identity$4(x) { - return x; - } + _this.hasTextForStringId = function (scope) { + return _mainLocalizer.hasTextForStringId("_tagging.presets.fields.".concat(fieldID, ".").concat(scope)); + }; - var map$4 = Array.prototype.map, - prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"]; + _this.title = function () { + return _this.overrideLabel || _this.t('label', { + 'default': fieldID + }); + }; - function formatLocale(locale) { - var group = locale.grouping === undefined || locale.thousands === undefined ? identity$4 : formatGroup(map$4.call(locale.grouping, Number), locale.thousands + ""), - currencyPrefix = locale.currency === undefined ? "" : locale.currency[0] + "", - currencySuffix = locale.currency === undefined ? "" : locale.currency[1] + "", - decimal = locale.decimal === undefined ? "." : locale.decimal + "", - numerals = locale.numerals === undefined ? identity$4 : formatNumerals(map$4.call(locale.numerals, String)), - percent = locale.percent === undefined ? "%" : locale.percent + "", - minus = locale.minus === undefined ? "-" : locale.minus + "", - nan = locale.nan === undefined ? "NaN" : locale.nan + ""; + _this.label = function () { + return _this.overrideLabel || _this.t.html('label', { + 'default': fieldID + }); + }; - function newFormat(specifier) { - specifier = formatSpecifier(specifier); + var _placeholder = _this.placeholder; - var fill = specifier.fill, - align = specifier.align, - sign = specifier.sign, - symbol = specifier.symbol, - zero = specifier.zero, - width = specifier.width, - comma = specifier.comma, - precision = specifier.precision, - trim = specifier.trim, - type = specifier.type; + _this.placeholder = function () { + return _this.t('placeholder', { + 'default': _placeholder + }); + }; - // The "n" type is an alias for ",g". - if (type === "n") { comma = true, type = "g"; } + _this.originalTerms = (_this.terms || []).join(); - // The "" type, and any invalid type, is an alias for ".12~g". - else if (!formatTypes[type]) { precision === undefined && (precision = 12), trim = true, type = "g"; } + _this.terms = function () { + return _this.t('terms', { + 'default': _this.originalTerms + }).toLowerCase().trim().split(/\s*,+\s*/); + }; - // If zero fill is specified, padding goes after sign and before digits. - if (zero || (fill === "0" && align === "=")) { zero = true, fill = "0", align = "="; } + _this.increment = _this.type === 'number' ? _this.increment || 1 : undefined; + return _this; + } - // Compute the prefix and suffix. - // For SI-prefix, the suffix is lazily computed. - var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "", - suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type) ? percent : ""; + // `presetPreset` decorates a given `preset` Object + // with some extra methods for searching and matching geometry + // - // What format function should we use? - // Is this an integer type? - // Can this type generate exponential notation? - var formatType = formatTypes[type], - maybeSuffix = /[defgprs%]/.test(type); + function presetPreset(presetID, preset, addable, allFields, allPresets) { + allFields = allFields || {}; + allPresets = allPresets || {}; - // Set the default precision if not specified, - // or clamp the specified precision to the supported range. - // For significant precision, it must be in [1, 21]. - // For fixed precision, it must be in [0, 20]. - precision = precision === undefined ? 6 - : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) - : Math.max(0, Math.min(20, precision)); + var _this = Object.assign({}, preset); // shallow copy - function format(value) { - var valuePrefix = prefix, - valueSuffix = suffix, - i, n, c; - if (type === "c") { - valueSuffix = formatType(value) + valueSuffix; - value = ""; - } else { - value = +value; + var _addable = addable || false; - // Determine the sign. -0 is not less than 0, but 1 / -0 is! - var valueNegative = value < 0 || 1 / value < 0; + var _resolvedFields; // cache - // Perform the initial formatting. - value = isNaN(value) ? nan : formatType(Math.abs(value), precision); - // Trim insignificant zeros. - if (trim) { value = formatTrim(value); } + var _resolvedMoreFields; // cache - // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign. - if (valueNegative && +value === 0 && sign !== "+") { valueNegative = false; } - // Compute the prefix and suffix. - valuePrefix = (valueNegative ? (sign === "(" ? sign : minus) : sign === "-" || sign === "(" ? "" : sign) + valuePrefix; - valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : ""); + var _searchName; // cache - // Break the formatted value into the integer “value” part that can be - // grouped, and fractional or exponential “suffix” part that is not. - if (maybeSuffix) { - i = -1, n = value.length; - while (++i < n) { - if (c = value.charCodeAt(i), 48 > c || c > 57) { - valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix; - value = value.slice(0, i); - break; - } - } - } - } - // If the fill character is not "0", grouping is applied before padding. - if (comma && !zero) { value = group(value, Infinity); } + var _searchNameStripped; // cache - // Compute the padding. - var length = valuePrefix.length + value.length + valueSuffix.length, - padding = length < width ? new Array(width - length + 1).join(fill) : ""; - // If the fill character is "0", grouping is applied after padding. - if (comma && zero) { value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = ""; } + _this.id = presetID; + _this.safeid = utilSafeClassName(presetID); // for use in css classes, selectors, element ids - // Reconstruct the final output based on the desired alignment. - switch (align) { - case "<": value = valuePrefix + value + valueSuffix + padding; break; - case "=": value = valuePrefix + padding + value + valueSuffix; break; - case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break; - default: value = padding + valuePrefix + value + valueSuffix; break; - } + _this.originalTerms = (_this.terms || []).join(); + _this.originalName = _this.name || ''; + _this.originalScore = _this.matchScore || 1; + _this.originalReference = _this.reference || {}; + _this.originalFields = _this.fields || []; + _this.originalMoreFields = _this.moreFields || []; - return numerals(value); - } + _this.fields = function () { + return _resolvedFields || (_resolvedFields = resolve('fields')); + }; - format.toString = function() { - return specifier + ""; - }; + _this.moreFields = function () { + return _resolvedMoreFields || (_resolvedMoreFields = resolve('moreFields')); + }; - return format; - } + _this.resetFields = function () { + return _resolvedFields = _resolvedMoreFields = null; + }; - function formatPrefix(specifier, value) { - var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), - e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3, - k = Math.pow(10, -e), - prefix = prefixes[8 + e / 3]; - return function(value) { - return f(k * value) + prefix; - }; - } + _this.tags = _this.tags || {}; + _this.addTags = _this.addTags || _this.tags; + _this.removeTags = _this.removeTags || _this.addTags; + _this.geometry = _this.geometry || []; - return { - format: newFormat, - formatPrefix: formatPrefix + _this.matchGeometry = function (geom) { + return _this.geometry.indexOf(geom) >= 0; }; - } - var locale; - var format; - var formatPrefix; + _this.matchAllGeometry = function (geoms) { + return geoms.every(_this.matchGeometry); + }; - defaultLocale({ - decimal: ".", - thousands: ",", - grouping: [3], - currency: ["$", ""], - minus: "-" - }); + _this.matchScore = function (entityTags) { + var tags = _this.tags; + var seen = {}; + var score = 0; // match on tags - function defaultLocale(definition) { - locale = formatLocale(definition); - format = locale.format; - formatPrefix = locale.formatPrefix; - return locale; - } + for (var k in tags) { + seen[k] = true; - function precisionFixed(step) { - return Math.max(0, -exponent(Math.abs(step))); - } + if (entityTags[k] === tags[k]) { + score += _this.originalScore; + } else if (tags[k] === '*' && k in entityTags) { + score += _this.originalScore / 2; + } else { + return -1; + } + } // boost score for additional matches in addTags - #6802 - function precisionPrefix(step, value) { - return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step))); - } - function precisionRound(step, max) { - step = Math.abs(step), max = Math.abs(max) - step; - return Math.max(0, exponent(max) - exponent(step)) + 1; - } + var addTags = _this.addTags; - function tickFormat(start, stop, count, specifier) { - var step = tickStep(start, stop, count), - precision; - specifier = formatSpecifier(specifier == null ? ",f" : specifier); - switch (specifier.type) { - case "s": { - var value = Math.max(Math.abs(start), Math.abs(stop)); - if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) { specifier.precision = precision; } - return formatPrefix(specifier, value); - } - case "": - case "e": - case "g": - case "p": - case "r": { - if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) { specifier.precision = precision - (specifier.type === "e"); } - break; - } - case "f": - case "%": { - if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) { specifier.precision = precision - (specifier.type === "%") * 2; } - break; + for (var _k in addTags) { + if (!seen[_k] && entityTags[_k] === addTags[_k]) { + score += _this.originalScore; + } } - } - return format(specifier); - } - - function linearish(scale) { - var domain = scale.domain; - scale.ticks = function(count) { - var d = domain(); - return ticks(d[0], d[d.length - 1], count == null ? 10 : count); + return score; }; - scale.tickFormat = function(count, specifier) { - var d = domain(); - return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier); + _this.t = function (scope, options) { + var textID = "_tagging.presets.presets.".concat(presetID, ".").concat(scope); + return _t(textID, options); }; - scale.nice = function(count) { - if (count == null) { count = 10; } - - var d = domain(), - i0 = 0, - i1 = d.length - 1, - start = d[i0], - stop = d[i1], - step; + _this.t.html = function (scope, options) { + var textID = "_tagging.presets.presets.".concat(presetID, ".").concat(scope); + return _t.html(textID, options); + }; - if (stop < start) { - step = start, start = stop, stop = step; - step = i0, i0 = i1, i1 = step; - } + _this.name = function () { + return _this.t('name', { + 'default': _this.originalName + }); + }; - step = tickIncrement(start, stop, count); + _this.nameLabel = function () { + return _this.t.html('name', { + 'default': _this.originalName + }); + }; - if (step > 0) { - start = Math.floor(start / step) * step; - stop = Math.ceil(stop / step) * step; - step = tickIncrement(start, stop, count); - } else if (step < 0) { - start = Math.ceil(start * step) / step; - stop = Math.floor(stop * step) / step; - step = tickIncrement(start, stop, count); - } + _this.subtitle = function () { + if (_this.suggestion) { + var path = presetID.split('/'); + path.pop(); // remove brand name - if (step > 0) { - d[i0] = Math.floor(start / step) * step; - d[i1] = Math.ceil(stop / step) * step; - domain(d); - } else if (step < 0) { - d[i0] = Math.ceil(start * step) / step; - d[i1] = Math.floor(stop * step) / step; - domain(d); + return _t('_tagging.presets.presets.' + path.join('/') + '.name'); } - return scale; + return null; }; - return scale; - } + _this.subtitleLabel = function () { + if (_this.suggestion) { + var path = presetID.split('/'); + path.pop(); // remove brand name - function linear$2() { - var scale = continuous(identity$3, identity$3); + return _t.html('_tagging.presets.presets.' + path.join('/') + '.name'); + } - scale.copy = function() { - return copy$1(scale, linear$2()); + return null; }; - initRange.apply(scale, arguments); - - return linearish(scale); - } + _this.terms = function () { + return _this.t('terms', { + 'default': _this.originalTerms + }).toLowerCase().trim().split(/\s*,+\s*/); + }; - function quantize() { - var x0 = 0, - x1 = 1, - n = 1, - domain = [0.5], - range = [0, 1], - unknown; + _this.searchName = function () { + if (!_searchName) { + _searchName = (_this.suggestion ? _this.originalName : _this.name()).toLowerCase(); + } - function scale(x) { - return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown; - } + return _searchName; + }; - function rescale() { - var i = -1; - domain = new Array(n); - while (++i < n) { domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1); } - return scale; - } + _this.searchNameStripped = function () { + if (!_searchNameStripped) { + _searchNameStripped = _this.searchName(); // split combined diacritical characters into their parts - scale.domain = function(_) { - return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1]; - }; + if (_searchNameStripped.normalize) _searchNameStripped = _searchNameStripped.normalize('NFD'); // remove diacritics - scale.range = function(_) { - return arguments.length ? (n = (range = slice$4.call(_)).length - 1, rescale()) : range.slice(); - }; + _searchNameStripped = _searchNameStripped.replace(/[\u0300-\u036f]/g, ''); + } - scale.invertExtent = function(y) { - var i = range.indexOf(y); - return i < 0 ? [NaN, NaN] - : i < 1 ? [x0, domain[0]] - : i >= n ? [domain[n - 1], x1] - : [domain[i - 1], domain[i]]; + return _searchNameStripped; }; - scale.unknown = function(_) { - return arguments.length ? (unknown = _, scale) : scale; + _this.isFallback = function () { + var tagCount = Object.keys(_this.tags).length; + return tagCount === 0 || tagCount === 1 && _this.tags.hasOwnProperty('area'); }; - scale.thresholds = function() { - return domain.slice(); + _this.addable = function (val) { + if (!arguments.length) return _addable; + _addable = val; + return _this; }; - scale.copy = function() { - return quantize() - .domain([x0, x1]) - .range(range) - .unknown(unknown); - }; + _this.reference = function () { + // Lookup documentation on Wikidata... + var qid = _this.tags.wikidata || _this.tags['flag:wikidata'] || _this.tags['brand:wikidata'] || _this.tags['network:wikidata'] || _this.tags['operator:wikidata']; - return initRange.apply(linearish(scale), arguments); - } + if (qid) { + return { + qid: qid + }; + } // Lookup documentation on OSM Wikibase... - function behaviorBreathe() { - var duration = 800; - var steps = 4; - var selector = '.selected.shadow, .selected .shadow'; - var _selected = select(null); - var _classed = ''; - var _params = {}; - var _done = false; - var _timer; - - - function ratchetyInterpolator(a, b, steps, units) { - a = parseFloat(a); - b = parseFloat(b); - var sample = quantize() - .domain([0, 1]) - .range(d3_quantize(d3_interpolateNumber(a, b), steps)); - - return function(t) { - return String(sample(t)) + (units || ''); - }; - } + var key = _this.originalReference.key || Object.keys(utilObjectOmit(_this.tags, 'name'))[0]; + var value = _this.originalReference.value || _this.tags[key]; - function reset(selection) { - selection - .style('stroke-opacity', null) - .style('stroke-width', null) - .style('fill-opacity', null) - .style('r', null); + if (value === '*') { + return { + key: key + }; + } else { + return { + key: key, + value: value + }; } + }; + _this.unsetTags = function (tags, geometry, ignoringKeys, skipFieldDefaults) { + // allow manually keeping some tags + var removeTags = ignoringKeys ? utilObjectOmit(_this.removeTags, ignoringKeys) : _this.removeTags; + tags = utilObjectOmit(tags, Object.keys(removeTags)); - function setAnimationParams(transition, fromTo) { - var toFrom = (fromTo === 'from' ? 'to' : 'from'); - - transition - .styleTween('stroke-opacity', function(d) { - return ratchetyInterpolator( - _params[d.id][toFrom].opacity, - _params[d.id][fromTo].opacity, - steps - ); - }) - .styleTween('stroke-width', function(d) { - return ratchetyInterpolator( - _params[d.id][toFrom].width, - _params[d.id][fromTo].width, - steps, - 'px' - ); - }) - .styleTween('fill-opacity', function(d) { - return ratchetyInterpolator( - _params[d.id][toFrom].opacity, - _params[d.id][fromTo].opacity, - steps - ); - }) - .styleTween('r', function(d) { - return ratchetyInterpolator( - _params[d.id][toFrom].width, - _params[d.id][fromTo].width, - steps, - 'px' - ); - }); + if (geometry && !skipFieldDefaults) { + _this.fields().forEach(function (field) { + if (field.matchGeometry(geometry) && field.key && field["default"] === tags[field.key]) { + delete tags[field.key]; + } + }); } + delete tags.area; + return tags; + }; - function calcAnimationParams(selection) { - selection - .call(reset) - .each(function(d) { - var s = select(this); - var tag = s.node().tagName; - var p = {'from': {}, 'to': {}}; - var opacity; - var width; + _this.setTags = function (tags, geometry, skipFieldDefaults) { + var addTags = _this.addTags; + tags = Object.assign({}, tags); // shallow copy - // determine base opacity and width - if (tag === 'circle') { - opacity = parseFloat(s.style('fill-opacity') || 0.5); - width = parseFloat(s.style('r') || 15.5); - } else { - opacity = parseFloat(s.style('stroke-opacity') || 0.7); - width = parseFloat(s.style('stroke-width') || 10); - } + for (var k in addTags) { + if (addTags[k] === '*') { + // if this tag is ancillary, don't override an existing value since any value is okay + if (_this.tags[k] || !tags[k] || tags[k] === 'no') { + tags[k] = 'yes'; + } + } else { + tags[k] = addTags[k]; + } + } // Add area=yes if necessary. + // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of: + // 1. chosen preset could be either an area or a line (`barrier=city_wall`) + // 2. chosen preset doesn't have a key in osmAreaKeys (`railway=station`) - // calculate from/to interpolation params.. - p.tag = tag; - p.from.opacity = opacity * 0.6; - p.to.opacity = opacity * 1.25; - p.from.width = width * 0.7; - p.to.width = width * (tag === 'circle' ? 1.5 : 1); - _params[d.id] = p; - }); - } + if (!addTags.hasOwnProperty('area')) { + delete tags.area; - function run(surface, fromTo) { - var toFrom = (fromTo === 'from' ? 'to' : 'from'); - var currSelected = surface.selectAll(selector); - var currClassed = surface.attr('class'); + if (geometry === 'area') { + var needsAreaTag = true; - if (_done || currSelected.empty()) { - _selected.call(reset); - _selected = select(null); - return; + if (_this.geometry.indexOf('line') === -1) { + for (var _k2 in addTags) { + if (_k2 in osmAreaKeys) { + needsAreaTag = false; + break; + } + } } - if (!fastDeepEqual(currSelected.data(), _selected.data()) || currClassed !== _classed) { - _selected.call(reset); - _classed = currClassed; - _selected = currSelected.call(calcAnimationParams); + if (needsAreaTag) { + tags.area = 'yes'; } + } + } - var didCallNextRun = false; - - _selected - .transition() - .duration(duration) - .call(setAnimationParams, fromTo) - .on('end', function() { - // `end` event is called for each selected element, but we want - // it to run only once - if (!didCallNextRun) { - surface.call(run, toFrom); - didCallNextRun = true; - } - - // if entity was deselected, remove breathe styling - if (!select(this).classed('selected')) { - reset(select(this)); - } - }); + if (geometry && !skipFieldDefaults) { + _this.fields().forEach(function (field) { + if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field["default"]) { + tags[field.key] = field["default"]; + } + }); } - function behavior(surface) { - _done = false; - _timer = timer(function() { - // wait for elements to actually become selected - if (surface.selectAll(selector).empty()) { - return false; - } + return tags; + }; // For a preset without fields, use the fields of the parent preset. + // Replace {preset} placeholders with the fields of the specified presets. - surface.call(run, 'from'); - _timer.stop(); - return true; - }, 20); - } - behavior.restartIfNeeded = function(surface) { - if (_selected.empty()) { - surface.call(run, 'from'); - if (_timer) { - _timer.stop(); - } - } - }; + function resolve(which) { + var fieldIDs = which === 'fields' ? _this.originalFields : _this.originalMoreFields; + var resolved = []; + fieldIDs.forEach(function (fieldID) { + var match = fieldID.match(/\{(.*)\}/); - behavior.off = function() { - _done = true; - if (_timer) { - _timer.stop(); - } - _selected - .interrupt() - .call(reset); - }; + if (match !== null) { + // a presetID wrapped in braces {} + resolved = resolved.concat(inheritFields(match[1], which)); + } else if (allFields[fieldID]) { + // a normal fieldID + resolved.push(allFields[fieldID]); + } else { + console.log("Cannot resolve \"".concat(fieldID, "\" found in ").concat(_this.id, ".").concat(which)); // eslint-disable-line no-console + } + }); // no fields resolved, so use the parent's if possible + if (!resolved.length) { + var endIndex = _this.id.lastIndexOf('/'); - return behavior; - } + var parentID = endIndex && _this.id.substring(0, endIndex); - /* Creates a keybinding behavior for an operation */ - function behaviorOperation(context) { - var _operation; + if (parentID) { + resolved = inheritFields(parentID, which); + } + } - function keypress() { - // prevent operations during low zoom selection - if (!context.map().withinEditableZoom()) { return; } + return utilArrayUniq(resolved); // returns an array of fields to inherit from the given presetID, if found - event.preventDefault(); - var disabled = _operation.disabled(); + function inheritFields(presetID, which) { + var parent = allPresets[presetID]; + if (!parent) return []; - if (disabled) { - context.ui().flash - .duration(4000) - .iconName('#iD-operation-' + _operation.id) - .iconClass('operation disabled') - .text(_operation.tooltip)(); + if (which === 'fields') { + return parent.fields().filter(shouldInherit); + } else if (which === 'moreFields') { + return parent.moreFields(); + } else { + return []; + } + } // Skip `fields` for the keys which define the preset. + // These are usually `typeCombo` fields like `shop=*` - } else { - context.ui().flash - .duration(2000) - .iconName('#iD-operation-' + _operation.id) - .iconClass('operation') - .text(_operation.annotation() || _operation.title)(); - if (_operation.point) { _operation.point(null); } - _operation(); - } + function shouldInherit(f) { + if (f.key && _this.tags[f.key] !== undefined && // inherit anyway if multiple values are allowed or just a checkbox + f.type !== 'multiCombo' && f.type !== 'semiCombo' && f.type !== 'manyCombo' && f.type !== 'check') return false; + return true; } + } + return _this; + } - function behavior() { - if (_operation && _operation.available()) { - context.keybinding() - .on(_operation.keys, keypress); - } - - return behavior; - } + var _mainPresetIndex = presetIndex(); // singleton + // `presetIndex` wraps a `presetCollection` + // with methods for loading new data and returning defaults + // + function presetIndex() { + var dispatch = dispatch$8('favoritePreset', 'recentsChange'); + var MAXRECENTS = 30; // seed the preset lists with geometry fallbacks - behavior.off = function() { - context.keybinding() - .off(_operation.keys); - }; + var POINT = presetPreset('point', { + name: 'Point', + tags: {}, + geometry: ['point', 'vertex'], + matchScore: 0.1 + }); + var LINE = presetPreset('line', { + name: 'Line', + tags: {}, + geometry: ['line'], + matchScore: 0.1 + }); + var AREA = presetPreset('area', { + name: 'Area', + tags: { + area: 'yes' + }, + geometry: ['area'], + matchScore: 0.1 + }); + var RELATION = presetPreset('relation', { + name: 'Relation', + tags: {}, + geometry: ['relation'], + matchScore: 0.1 + }); + var _this = presetCollection([POINT, LINE, AREA, RELATION]); - behavior.which = function (_) { - if (!arguments.length) { return _operation; } - _operation = _; - return behavior; - }; + var _presets = { + point: POINT, + line: LINE, + area: AREA, + relation: RELATION + }; + var _defaults = { + point: presetCollection([POINT]), + vertex: presetCollection([POINT]), + line: presetCollection([LINE]), + area: presetCollection([AREA]), + relation: presetCollection([RELATION]) + }; + var _fields = {}; + var _categories = {}; + var _universal = []; + var _addablePresetIDs = null; // Set of preset IDs that the user can add + var _recents; - return behavior; - } + var _favorites; // Index of presets by (geometry, tag key). - function operationCircularize(context, selectedIDs) { - var _extent; - var _actions = selectedIDs.map(getAction).filter(Boolean); - var _amount = _actions.length === 1 ? 'single' : 'multiple'; - var _coords = utilGetAllNodes(selectedIDs, context.graph()) - .map(function(n) { return n.loc; }); - function getAction(entityID) { + var _geometryIndex = { + point: {}, + vertex: {}, + line: {}, + area: {}, + relation: {} + }; - var entity = context.entity(entityID); + var _loadPromise; - if (entity.type !== 'way' || new Set(entity.nodes).size <= 1) { return null; } + _this.ensureLoaded = function () { + if (_loadPromise) return _loadPromise; + return _loadPromise = Promise.all([_mainFileFetcher.get('preset_categories'), _mainFileFetcher.get('preset_defaults'), _mainFileFetcher.get('preset_presets'), _mainFileFetcher.get('preset_fields')]).then(function (vals) { + _this.merge({ + categories: vals[0], + defaults: vals[1], + presets: vals[2], + fields: vals[3] + }); - if (!_extent) { - _extent = entity.extent(context.graph()); - } else { - _extent = _extent.extend(entity.extent(context.graph())); - } + osmSetAreaKeys(_this.areaKeys()); + osmSetPointTags(_this.pointTags()); + osmSetVertexTags(_this.vertexTags()); + }); + }; // `merge` accepts an object containing new preset data (all properties optional): + // { + // fields: {}, + // presets: {}, + // categories: {}, + // defaults: {}, + // featureCollection: {} + //} - return actionCircularize(entityID, context.projection); - } - var operation = function() { - if (!_actions.length) { return; } + _this.merge = function (d) { + var newLocationSets = []; // Merge Fields - var combinedAction = function(graph, t) { - _actions.forEach(function(action) { - if (!action.disabled(graph)) { - graph = action(graph, t); - } - }); - return graph; - }; - combinedAction.transitionable = true; + if (d.fields) { + Object.keys(d.fields).forEach(function (fieldID) { + var f = d.fields[fieldID]; - context.perform(combinedAction, operation.annotation()); + if (f) { + // add or replace + f = presetField(fieldID, f); + if (f.locationSet) newLocationSets.push(f); + _fields[fieldID] = f; + } else { + // remove + delete _fields[fieldID]; + } + }); + } // Merge Presets - window.setTimeout(function() { - context.validator().validate(); - }, 300); // after any transition - }; + if (d.presets) { + Object.keys(d.presets).forEach(function (presetID) { + var p = d.presets[presetID]; - operation.available = function() { - return _actions.length && selectedIDs.length === _actions.length; - }; + if (p) { + // add or replace + var isAddable = !_addablePresetIDs || _addablePresetIDs.has(presetID); + p = presetPreset(presetID, p, isAddable, _fields, _presets); + if (p.locationSet) newLocationSets.push(p); + _presets[presetID] = p; + } else { + // remove (but not if it's a fallback) + var existing = _presets[presetID]; - // don't cache this because the visible extent could change - operation.disabled = function() { - if (!_actions.length) { return ''; } + if (existing && !existing.isFallback()) { + delete _presets[presetID]; + } + } + }); + } // Merge Categories - var actionDisableds = _actions.map(function(action) { - return action.disabled(context.graph()); - }).filter(Boolean); - if (actionDisableds.length === _actions.length) { - // none of the features can be circularized + if (d.categories) { + Object.keys(d.categories).forEach(function (categoryID) { + var c = d.categories[categoryID]; - if (new Set(actionDisableds).size > 1) { - return 'multiple_blockers'; - } - return actionDisableds[0]; - } else if (_extent.percentContainedIn(context.map().extent()) < 0.8) { - return 'too_large'; - } else if (someMissing()) { - return 'not_downloaded'; - } else if (selectedIDs.some(context.hasHiddenConnections)) { - return 'connected_to_hidden'; + if (c) { + // add or replace + c = presetCategory(categoryID, c, _presets); + if (c.locationSet) newLocationSets.push(c); + _categories[categoryID] = c; + } else { + // remove + delete _categories[categoryID]; } + }); + } // Rebuild _this.collection after changing presets and categories - return false; + _this.collection = Object.values(_presets).concat(Object.values(_categories)); // Merge Defaults - function someMissing() { - if (context.inIntro()) { return false; } - var osm = context.connection(); - if (osm) { - var missing = _coords.filter(function(loc) { return !osm.isDataLoaded(loc); }); - if (missing.length) { - missing.forEach(function(loc) { context.loadTileAtLoc(loc); }); - return true; - } - } - return false; + if (d.defaults) { + Object.keys(d.defaults).forEach(function (geometry) { + var def = d.defaults[geometry]; + + if (Array.isArray(def)) { + // add or replace + _defaults[geometry] = presetCollection(def.map(function (id) { + return _presets[id] || _categories[id]; + }).filter(Boolean)); + } else { + // remove + delete _defaults[geometry]; } - }; + }); + } // Rebuild universal fields array - operation.tooltip = function() { - var disable = operation.disabled(); - return disable ? - _t('operations.circularize.' + disable + '.' + _amount) : - _t('operations.circularize.description.' + _amount); - }; + _universal = Object.values(_fields).filter(function (field) { + return field.universal; + }); // Reset all the preset fields - they'll need to be resolved again + Object.values(_presets).forEach(function (preset) { + return preset.resetFields(); + }); // Rebuild geometry index - operation.annotation = function() { - return _t('operations.circularize.annotation.' + _amount); + _geometryIndex = { + point: {}, + vertex: {}, + line: {}, + area: {}, + relation: {} }; + _this.collection.forEach(function (preset) { + (preset.geometry || []).forEach(function (geometry) { + var g = _geometryIndex[geometry]; - operation.id = 'circularize'; - operation.keys = [_t('operations.circularize.key')]; - operation.title = _t('operations.circularize.title'); - operation.behavior = behaviorOperation(context).which(operation); + for (var key in preset.tags) { + g[key] = g[key] || {}; + var value = preset.tags[key]; + (g[key][value] = g[key][value] || []).push(preset); + } + }); + }); // Merge Custom Features - return operation; - } - // Translate a MacOS key command into the appropriate Windows/Linux equivalent. - // For example, ⌘Z -> Ctrl+Z - var uiCmd = function (code) { - var detected = utilDetect(); + if (d.featureCollection && Array.isArray(d.featureCollection.features)) { + _mainLocations.mergeCustomGeoJSON(d.featureCollection); + } // Resolve all locationSet features. - if (detected.os === 'mac') { - return code; - } - if (detected.os === 'win') { - if (code === '⌘⇧Z') { return 'Ctrl+Y'; } + if (newLocationSets.length) { + _mainLocations.mergeLocationSets(newLocationSets); } - var result = '', - replacements = { - '⌘': 'Ctrl', - '⇧': 'Shift', - '⌥': 'Alt', - '⌫': 'Backspace', - '⌦': 'Delete' - }; + return _this; + }; - for (var i = 0; i < code.length; i++) { - if (code[i] in replacements) { - result += replacements[code[i]] + (i < code.length - 1 ? '+' : ''); - } else { - result += code[i]; - } - } + _this.match = function (entity, resolver) { + return resolver["transient"](entity, 'presetMatch', function () { + var geometry = entity.geometry(resolver); // Treat entities on addr:interpolation lines as points, not vertices - #3241 - return result; - }; + if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) { + geometry = 'point'; + } + var entityExtent = entity.extent(resolver); + return _this.matchTags(entity.tags, geometry, entityExtent.center()); + }); + }; - // return a display-focused string for a given keyboard code - uiCmd.display = function(code) { - if (code.length !== 1) { return code; } + _this.matchTags = function (tags, geometry, loc) { + var keyIndex = _geometryIndex[geometry]; + var bestScore = -1; + var bestMatch; + var matchCandidates = []; - var detected = utilDetect(); - var mac = (detected.os === 'mac'); - var replacements = { - '⌘': mac ? '⌘ ' + _t('shortcuts.key.cmd') : _t('shortcuts.key.ctrl'), - '⇧': mac ? '⇧ ' + _t('shortcuts.key.shift') : _t('shortcuts.key.shift'), - '⌥': mac ? '⌥ ' + _t('shortcuts.key.option') : _t('shortcuts.key.alt'), - '⌃': mac ? '⌃ ' + _t('shortcuts.key.ctrl') : _t('shortcuts.key.ctrl'), - '⌫': mac ? '⌫ ' + _t('shortcuts.key.delete') : _t('shortcuts.key.backspace'), - '⌦': mac ? '⌦ ' + _t('shortcuts.key.del') : _t('shortcuts.key.del'), - '↖': mac ? '↖ ' + _t('shortcuts.key.pgup') : _t('shortcuts.key.pgup'), - '↘': mac ? '↘ ' + _t('shortcuts.key.pgdn') : _t('shortcuts.key.pgdn'), - '⇞': mac ? '⇞ ' + _t('shortcuts.key.home') : _t('shortcuts.key.home'), - '⇟': mac ? '⇟ ' + _t('shortcuts.key.end') : _t('shortcuts.key.end'), - '↵': mac ? '⏎ ' + _t('shortcuts.key.return') : _t('shortcuts.key.enter'), - '⎋': mac ? '⎋ ' + _t('shortcuts.key.esc') : _t('shortcuts.key.esc'), - '☰': mac ? '☰ ' + _t('shortcuts.key.menu') : _t('shortcuts.key.menu'), - }; + for (var k in tags) { + var indexMatches = []; + var valueIndex = keyIndex[k]; + if (!valueIndex) continue; + var keyValueMatches = valueIndex[tags[k]]; + if (keyValueMatches) indexMatches.push.apply(indexMatches, _toConsumableArray(keyValueMatches)); + var keyStarMatches = valueIndex['*']; + if (keyStarMatches) indexMatches.push.apply(indexMatches, _toConsumableArray(keyStarMatches)); + if (indexMatches.length === 0) continue; + + for (var i = 0; i < indexMatches.length; i++) { + var candidate = indexMatches[i]; + var score = candidate.matchScore(tags); + + if (score === -1) { + continue; + } - return replacements[code] || code; - }; + matchCandidates.push({ + score: score, + candidate: candidate + }); - function operationDelete(context, selectedIDs) { - var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'); - var action = actionDeleteMultiple(selectedIDs); - var nodes = utilGetAllNodes(selectedIDs, context.graph()); - var coords = nodes.map(function(n) { return n.loc; }); - var extent = utilTotalExtent(selectedIDs, context.graph()); + if (score > bestScore) { + bestScore = score; + bestMatch = candidate; + } + } + } + if (bestMatch && bestMatch.locationSetID && bestMatch.locationSetID !== '+[Q2]' && Array.isArray(loc)) { + var validLocations = _mainLocations.locationsAt(loc); - var operation = function() { - var nextSelectedID; - var nextSelectedLoc; + if (!validLocations[bestMatch.locationSetID]) { + matchCandidates.sort(function (a, b) { + return a.score < b.score ? 1 : -1; + }); - if (selectedIDs.length === 1) { - var id = selectedIDs[0]; - var entity = context.entity(id); - var geometry = entity.geometry(context.graph()); - var parents = context.graph().parentWays(entity); - var parent = parents[0]; - - // Select the next closest node in the way. - if (geometry === 'vertex') { - var nodes = parent.nodes; - var i = nodes.indexOf(id); - - if (i === 0) { - i++; - } else if (i === nodes.length - 1) { - i--; - } else { - var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc); - var b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc); - i = a < b ? i - 1 : i + 1; - } + for (var _i = 0; _i < matchCandidates.length; _i++) { + var candidateScore = matchCandidates[_i]; - nextSelectedID = nodes[i]; - nextSelectedLoc = context.entity(nextSelectedID).loc; - } + if (!candidateScore.candidate.locationSetID || validLocations[candidateScore.candidate.locationSetID]) { + bestMatch = candidateScore.candidate; + bestScore = candidateScore.score; + break; + } } + } + } // If any part of an address is present, allow fallback to "Address" preset - #4353 - context.perform(action, operation.annotation()); - context.validator().validate(); - if (nextSelectedID && nextSelectedLoc) { - if (context.hasEntity(nextSelectedID)) { - context.enter(modeSelect(context, [nextSelectedID]).follow(true)); - } else { - context.map().centerEase(nextSelectedLoc); - context.enter(modeBrowse(context)); - } - } else { - context.enter(modeBrowse(context)); + if (!bestMatch || bestMatch.isFallback()) { + for (var _k in tags) { + if (/^addr:/.test(_k) && keyIndex['addr:*'] && keyIndex['addr:*']['*']) { + bestMatch = keyIndex['addr:*']['*'][0]; + break; } + } + } - }; + return bestMatch || _this.fallback(geometry); + }; + _this.allowsVertex = function (entity, resolver) { + if (entity.type !== 'node') return false; + if (Object.keys(entity.tags).length === 0) return true; + return resolver["transient"](entity, 'vertexMatch', function () { + // address lines allow vertices to act as standalone points + if (entity.isOnAddressLine(resolver)) return true; + var geometries = osmNodeGeometriesForTags(entity.tags); + if (geometries.vertex) return true; + if (geometries.point) return false; // allow vertices for unspecified points - operation.available = function() { - return true; - }; + return true; + }); + }; // Because of the open nature of tagging, iD will never have a complete + // list of tags used in OSM, so we want it to have logic like "assume + // that a closed way with an amenity tag is an area, unless the amenity + // is one of these specific types". This function computes a structure + // that allows testing of such conditions, based on the presets designated + // as as supporting (or not supporting) the area geometry. + // + // The returned object L is a keeplist/discardlist of tags. A closed way + // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])` + // (see `Way#isArea()`). In other words, the keys of L form the keeplist, + // and the subkeys form the discardlist. - operation.disabled = function() { - if (extent.percentContainedIn(context.map().extent()) < 0.8) { - return 'too_large'; - } else if (someMissing()) { - return 'not_downloaded'; - } else if (selectedIDs.some(context.hasHiddenConnections)) { - return 'connected_to_hidden'; - } else if (selectedIDs.some(protectedMember)) { - return 'part_of_relation'; - } else if (selectedIDs.some(incompleteRelation)) { - return 'incomplete_relation'; - } else if (selectedIDs.some(hasWikidataTag)) { - return 'has_wikidata_tag'; - } + _this.areaKeys = function () { + // The ignore list is for keys that imply lines. (We always add `area=yes` for exceptions) + var ignore = ['barrier', 'highway', 'footway', 'railway', 'junction', 'type']; + var areaKeys = {}; // ignore name-suggestion-index and deprecated presets - return false; + var presets = _this.collection.filter(function (p) { + return !p.suggestion && !p.replacement; + }); // keeplist - function someMissing() { - if (context.inIntro()) { return false; } - var osm = context.connection(); - if (osm) { - var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); }); - if (missing.length) { - missing.forEach(function(loc) { context.loadTileAtLoc(loc); }); - return true; - } - } - return false; - } + presets.forEach(function (p) { + var keys = p.tags && Object.keys(p.tags); + var key = keys && keys.length && keys[0]; // pick the first tag - function hasWikidataTag(id) { - var entity = context.entity(id); - return entity.tags.wikidata && entity.tags.wikidata.trim().length > 0; - } + if (!key) return; + if (ignore.indexOf(key) !== -1) return; - function incompleteRelation(id) { - var entity = context.entity(id); - return entity.type === 'relation' && !entity.isComplete(context.graph()); - } + if (p.geometry.indexOf('area') !== -1) { + // probably an area.. + areaKeys[key] = areaKeys[key] || {}; + } + }); // discardlist - function protectedMember(id) { - var entity = context.entity(id); - if (entity.type !== 'way') { return false; } - - var parents = context.graph().parentRelations(entity); - for (var i = 0; i < parents.length; i++) { - var parent = parents[i]; - var type = parent.tags.type; - var role = parent.memberById(id).role || 'outer'; - if (type === 'route' || type === 'boundary' || (type === 'multipolygon' && role === 'outer')) { - return true; - } - } - return false; - } - }; + presets.forEach(function (p) { + var key; + for (key in p.addTags) { + // examine all addTags to get a better sense of what can be tagged on lines - #6800 + var value = p.addTags[key]; - operation.tooltip = function() { - var disable = operation.disabled(); - return disable ? - _t('operations.delete.' + disable + '.' + multi) : - _t('operations.delete.description' + '.' + multi); - }; + if (key in areaKeys && // probably an area... + p.geometry.indexOf('line') !== -1 && // but sometimes a line + value !== '*') { + areaKeys[key][value] = true; + } + } + }); + return areaKeys; + }; + _this.pointTags = function () { + return _this.collection.reduce(function (pointTags, d) { + // ignore name-suggestion-index, deprecated, and generic presets + if (d.suggestion || d.replacement || d.searchable === false) return pointTags; // only care about the primary tag - operation.annotation = function() { - return selectedIDs.length === 1 ? - _t('operations.delete.annotation.' + context.graph().geometry(selectedIDs[0])) : - _t('operations.delete.annotation.multiple', { n: selectedIDs.length }); - }; + var keys = d.tags && Object.keys(d.tags); + var key = keys && keys.length && keys[0]; // pick the first tag + if (!key) return pointTags; // if this can be a point - operation.id = 'delete'; - operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')]; - operation.title = _t('operations.delete.title'); - operation.behavior = behaviorOperation(context).which(operation); + if (d.geometry.indexOf('point') !== -1) { + pointTags[key] = pointTags[key] || {}; + pointTags[key][d.tags[key]] = true; + } - return operation; - } + return pointTags; + }, {}); + }; - function operationOrthogonalize(context, selectedIDs) { - var _extent; - var _type; - var _actions = selectedIDs.map(chooseAction).filter(Boolean); - var _amount = _actions.length === 1 ? 'single' : 'multiple'; - var _coords = utilGetAllNodes(selectedIDs, context.graph()) - .map(function(n) { return n.loc; }); + _this.vertexTags = function () { + return _this.collection.reduce(function (vertexTags, d) { + // ignore name-suggestion-index, deprecated, and generic presets + if (d.suggestion || d.replacement || d.searchable === false) return vertexTags; // only care about the primary tag + var keys = d.tags && Object.keys(d.tags); + var key = keys && keys.length && keys[0]; // pick the first tag - function chooseAction(entityID) { + if (!key) return vertexTags; // if this can be a vertex - var entity = context.entity(entityID); - var geometry = entity.geometry(context.graph()); + if (d.geometry.indexOf('vertex') !== -1) { + vertexTags[key] = vertexTags[key] || {}; + vertexTags[key][d.tags[key]] = true; + } - if (!_extent) { - _extent = entity.extent(context.graph()); - } else { - _extent = _extent.extend(entity.extent(context.graph())); - } - - // square a line/area - if (entity.type === 'way' && new Set(entity.nodes).size > 2 ) { - if (_type && _type !== 'feature') { return null; } - _type = 'feature'; - return actionOrthogonalize(entityID, context.projection); - - // square a single vertex - } else if (geometry === 'vertex') { - if (_type && _type !== 'corner') { return null; } - _type = 'corner'; - var graph = context.graph(); - var parents = graph.parentWays(entity); - if (parents.length === 1) { - var way = parents[0]; - if (way.nodes.indexOf(entityID) !== -1) { - return actionOrthogonalize(way.id, context.projection, entityID); - } - } - } + return vertexTags; + }, {}); + }; - return null; - } + _this.field = function (id) { + return _fields[id]; + }; + _this.universal = function () { + return _universal; + }; - var operation = function() { - if (!_actions.length) { return; } + _this.defaults = function (geometry, n, startWithRecents, loc) { + var recents = []; - var combinedAction = function(graph, t) { - _actions.forEach(function(action) { - if (!action.disabled(graph)) { - graph = action(graph, t); - } - }); - return graph; - }; - combinedAction.transitionable = true; + if (startWithRecents) { + recents = _this.recent().matchGeometry(geometry).collection.slice(0, 4); + } - context.perform(combinedAction, operation.annotation()); + var defaults; - window.setTimeout(function() { - context.validator().validate(); - }, 300); // after any transition - }; + if (_addablePresetIDs) { + defaults = Array.from(_addablePresetIDs).map(function (id) { + var preset = _this.item(id); + if (preset && preset.matchGeometry(geometry)) return preset; + return null; + }).filter(Boolean); + } else { + defaults = _defaults[geometry].collection.concat(_this.fallback(geometry)); + } - operation.available = function() { - return _actions.length && selectedIDs.length === _actions.length; - }; + var result = presetCollection(utilArrayUniq(recents.concat(defaults)).slice(0, n - 1)); + if (Array.isArray(loc)) { + var validLocations = _mainLocations.locationsAt(loc); + result.collection = result.collection.filter(function (a) { + return !a.locationSetID || validLocations[a.locationSetID]; + }); + } - // don't cache this because the visible extent could change - operation.disabled = function() { - if (!_actions.length) { return ''; } + return result; + }; // pass a Set of addable preset ids - var actionDisableds = _actions.map(function(action) { - return action.disabled(context.graph()); - }).filter(Boolean); - if (actionDisableds.length === _actions.length) { - // none of the features can be squared + _this.addablePresetIDs = function (val) { + if (!arguments.length) return _addablePresetIDs; // accept and convert arrays - if (new Set(actionDisableds).size > 1) { - return 'multiple_blockers'; - } - return actionDisableds[0]; - } else if (_extent && - _extent.percentContainedIn(context.map().extent()) < 0.8) { - return 'too_large'; - } else if (someMissing()) { - return 'not_downloaded'; - } else if (selectedIDs.some(context.hasHiddenConnections)) { - return 'connected_to_hidden'; - } + if (Array.isArray(val)) val = new Set(val); + _addablePresetIDs = val; - return false; + if (_addablePresetIDs) { + // reset all presets + _this.collection.forEach(function (p) { + // categories aren't addable + if (p.addable) p.addable(_addablePresetIDs.has(p.id)); + }); + } else { + _this.collection.forEach(function (p) { + if (p.addable) p.addable(true); + }); + } + return _this; + }; - function someMissing() { - if (context.inIntro()) { return false; } - var osm = context.connection(); - if (osm) { - var missing = _coords.filter(function(loc) { return !osm.isDataLoaded(loc); }); - if (missing.length) { - missing.forEach(function(loc) { context.loadTileAtLoc(loc); }); - return true; - } - } - return false; - } - }; + _this.recent = function () { + return presetCollection(utilArrayUniq(_this.getRecents().map(function (d) { + return d.preset; + }))); + }; + function RibbonItem(preset, source) { + var item = {}; + item.preset = preset; + item.source = source; - operation.tooltip = function() { - var disable = operation.disabled(); - return disable ? - _t('operations.orthogonalize.' + disable + '.' + _amount) : - _t('operations.orthogonalize.description.' + _type + '.' + _amount); + item.isFavorite = function () { + return item.source === 'favorite'; }; - - operation.annotation = function() { - return _t('operations.orthogonalize.annotation.' + _type + '.' + _amount); + item.isRecent = function () { + return item.source === 'recent'; }; + item.matches = function (preset) { + return item.preset.id === preset.id; + }; - operation.id = 'orthogonalize'; - operation.keys = [_t('operations.orthogonalize.key')]; - operation.title = _t('operations.orthogonalize.title'); - operation.behavior = behaviorOperation(context).which(operation); - - return operation; - } - - function operationReflectShort(context, selectedIDs) { - return operationReflect(context, selectedIDs, 'short'); - } - - - function operationReflectLong(context, selectedIDs) { - return operationReflect(context, selectedIDs, 'long'); - } + item.minified = function () { + return { + pID: item.preset.id + }; + }; + return item; + } - function operationReflect(context, selectedIDs, axis) { - axis = axis || 'long'; - var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'); - var nodes = utilGetAllNodes(selectedIDs, context.graph()); - var coords = nodes.map(function(n) { return n.loc; }); - var extent = utilTotalExtent(selectedIDs, context.graph()); + function ribbonItemForMinified(d, source) { + if (d && d.pID) { + var preset = _this.item(d.pID); + if (!preset) return null; + return RibbonItem(preset, source); + } - var operation = function() { - var action = actionReflect(selectedIDs, context.projection) - .useLongAxis(Boolean(axis === 'long')); + return null; + } - context.perform(action, operation.annotation()); + _this.getGenericRibbonItems = function () { + return ['point', 'line', 'area'].map(function (id) { + return RibbonItem(_this.item(id), 'generic'); + }); + }; - window.setTimeout(function() { - context.validator().validate(); - }, 300); // after any transition - }; + _this.getAddable = function () { + if (!_addablePresetIDs) return []; + return _addablePresetIDs.map(function (id) { + var preset = _this.item(id); + if (preset) return RibbonItem(preset, 'addable'); + return null; + }).filter(Boolean); + }; - operation.available = function() { - return nodes.length >= 3; - }; + function setRecents(items) { + _recents = items; + var minifiedItems = items.map(function (d) { + return d.minified(); + }); + corePreferences('preset_recents', JSON.stringify(minifiedItems)); + dispatch.call('recentsChange'); + } + _this.getRecents = function () { + if (!_recents) { + // fetch from local storage + _recents = (JSON.parse(corePreferences('preset_recents')) || []).reduce(function (acc, d) { + var item = ribbonItemForMinified(d, 'recent'); + if (item && item.preset.addable()) acc.push(item); + return acc; + }, []); + } - // don't cache this because the visible extent could change - operation.disabled = function() { - if (extent.percentContainedIn(context.map().extent()) < 0.8) { - return 'too_large'; - } else if (someMissing()) { - return 'not_downloaded'; - } else if (selectedIDs.some(context.hasHiddenConnections)) { - return 'connected_to_hidden'; - } else if (selectedIDs.some(incompleteRelation)) { - return 'incomplete_relation'; - } + return _recents; + }; - return false; + _this.addRecent = function (preset, besidePreset, after) { + var recents = _this.getRecents(); + var beforeItem = _this.recentMatching(besidePreset); - function someMissing() { - if (context.inIntro()) { return false; } - var osm = context.connection(); - if (osm) { - var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); }); - if (missing.length) { - missing.forEach(function(loc) { context.loadTileAtLoc(loc); }); - return true; - } - } - return false; - } + var toIndex = recents.indexOf(beforeItem); + if (after) toIndex += 1; + var newItem = RibbonItem(preset, 'recent'); + recents.splice(toIndex, 0, newItem); + setRecents(recents); + }; - function incompleteRelation(id) { - var entity = context.entity(id); - return entity.type === 'relation' && !entity.isComplete(context.graph()); - } - }; + _this.removeRecent = function (preset) { + var item = _this.recentMatching(preset); + if (item) { + var items = _this.getRecents(); - operation.tooltip = function() { - var disable = operation.disabled(); - return disable ? - _t('operations.reflect.' + disable + '.' + multi) : - _t('operations.reflect.description.' + axis + '.' + multi); - }; + items.splice(items.indexOf(item), 1); + setRecents(items); + } + }; + _this.recentMatching = function (preset) { + var items = _this.getRecents(); - operation.annotation = function() { - return _t('operations.reflect.annotation.' + axis + '.' + multi); - }; + for (var i in items) { + if (items[i].matches(preset)) { + return items[i]; + } + } + return null; + }; - operation.id = 'reflect-' + axis; - operation.keys = [_t('operations.reflect.key.' + axis)]; - operation.title = _t('operations.reflect.title.' + axis); - operation.behavior = behaviorOperation(context).which(operation); + _this.moveItem = function (items, fromIndex, toIndex) { + if (fromIndex === toIndex || fromIndex < 0 || toIndex < 0 || fromIndex >= items.length || toIndex >= items.length) return null; + items.splice(toIndex, 0, items.splice(fromIndex, 1)[0]); + return items; + }; - return operation; - } + _this.moveRecent = function (item, beforeItem) { + var recents = _this.getRecents(); - function operationMove(context, selectedIDs) { - var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'); - var nodes = utilGetAllNodes(selectedIDs, context.graph()); - var coords = nodes.map(function(n) { return n.loc; }); - var extent = utilTotalExtent(selectedIDs, context.graph()); + var fromIndex = recents.indexOf(item); + var toIndex = recents.indexOf(beforeItem); + var items = _this.moveItem(recents, fromIndex, toIndex); - var operation = function() { - context.enter(modeMove(context, selectedIDs)); - }; + if (items) setRecents(items); + }; + _this.setMostRecent = function (preset) { + if (preset.searchable === false) return; - operation.available = function() { - return selectedIDs.length > 1 || - context.entity(selectedIDs[0]).type !== 'node'; - }; + var items = _this.getRecents(); + var item = _this.recentMatching(preset); - operation.disabled = function() { - if (extent.percentContainedIn(context.map().extent()) < 0.8) { - return 'too_large'; - } else if (someMissing()) { - return 'not_downloaded'; - } else if (selectedIDs.some(context.hasHiddenConnections)) { - return 'connected_to_hidden'; - } else if (selectedIDs.some(incompleteRelation)) { - return 'incomplete_relation'; - } + if (item) { + items.splice(items.indexOf(item), 1); + } else { + item = RibbonItem(preset, 'recent'); + } // remove the last recent (first in, first out) - return false; + while (items.length >= MAXRECENTS) { + items.pop(); + } // prepend array - function someMissing() { - if (context.inIntro()) { return false; } - var osm = context.connection(); - if (osm) { - var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); }); - if (missing.length) { - missing.forEach(function(loc) { context.loadTileAtLoc(loc); }); - return true; - } - } - return false; - } - function incompleteRelation(id) { - var entity = context.entity(id); - return entity.type === 'relation' && !entity.isComplete(context.graph()); - } - }; + items.unshift(item); + setRecents(items); + }; + function setFavorites(items) { + _favorites = items; + var minifiedItems = items.map(function (d) { + return d.minified(); + }); + corePreferences('preset_favorites', JSON.stringify(minifiedItems)); // call update - operation.tooltip = function() { - var disable = operation.disabled(); - return disable ? - _t('operations.move.' + disable + '.' + multi) : - _t('operations.move.description.' + multi); - }; + dispatch.call('favoritePreset'); + } + _this.addFavorite = function (preset, besidePreset, after) { + var favorites = _this.getFavorites(); - operation.annotation = function() { - return selectedIDs.length === 1 ? - _t('operations.move.annotation.' + context.graph().geometry(selectedIDs[0])) : - _t('operations.move.annotation.multiple'); - }; + var beforeItem = _this.favoriteMatching(besidePreset); + var toIndex = favorites.indexOf(beforeItem); + if (after) toIndex += 1; + var newItem = RibbonItem(preset, 'favorite'); + favorites.splice(toIndex, 0, newItem); + setFavorites(favorites); + }; - operation.id = 'move'; - operation.keys = [_t('operations.move.key')]; - operation.title = _t('operations.move.title'); - operation.behavior = behaviorOperation(context).which(operation); + _this.toggleFavorite = function (preset) { + var favs = _this.getFavorites(); - operation.mouseOnly = true; + var favorite = _this.favoriteMatching(preset); - return operation; - } + if (favorite) { + favs.splice(favs.indexOf(favorite), 1); + } else { + // only allow 10 favorites + if (favs.length === 10) { + // remove the last favorite (last in, first out) + favs.pop(); + } // append array - function modeRotate(context, entityIDs) { - var mode = { - id: 'rotate', - button: 'browse' - }; - var keybinding = utilKeybinding('rotate'); - var behaviors = [ - behaviorEdit(context), - operationCircularize(context, entityIDs).behavior, - operationDelete(context, entityIDs).behavior, - operationMove(context, entityIDs).behavior, - operationOrthogonalize(context, entityIDs).behavior, - operationReflectLong(context, entityIDs).behavior, - operationReflectShort(context, entityIDs).behavior - ]; - var annotation = entityIDs.length === 1 ? - _t('operations.rotate.annotation.' + context.graph().geometry(entityIDs[0])) : - _t('operations.rotate.annotation.multiple'); + favs.push(RibbonItem(preset, 'favorite')); + } - var _prevGraph; - var _prevAngle; - var _prevTransform; - var _pivot; + setFavorites(favs); + }; + _this.removeFavorite = function (preset) { + var item = _this.favoriteMatching(preset); - function doRotate() { - var fn; - if (context.graph() !== _prevGraph) { - fn = context.perform; - } else { - fn = context.replace; - } + if (item) { + var items = _this.getFavorites(); - // projection changed, recalculate _pivot - var projection = context.projection; - var currTransform = projection.transform(); - if (!_prevTransform || - currTransform.k !== _prevTransform.k || - currTransform.x !== _prevTransform.x || - currTransform.y !== _prevTransform.y) { + items.splice(items.indexOf(item), 1); + setFavorites(items); + } + }; - var nodes = utilGetAllNodes(entityIDs, context.graph()); - var points = nodes.map(function(n) { return projection(n.loc); }); - _pivot = getPivot(points); - _prevAngle = undefined; - } + _this.getFavorites = function () { + if (!_favorites) { + // fetch from local storage + var rawFavorites = JSON.parse(corePreferences('preset_favorites')); + if (!rawFavorites) { + rawFavorites = []; + corePreferences('preset_favorites', JSON.stringify(rawFavorites)); + } - var currMouse = context.map().mouse(); - var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]); + _favorites = rawFavorites.reduce(function (output, d) { + var item = ribbonItemForMinified(d, 'favorite'); + if (item && item.preset.addable()) output.push(item); + return output; + }, []); + } - if (typeof _prevAngle === 'undefined') { _prevAngle = currAngle; } - var delta = currAngle - _prevAngle; + return _favorites; + }; - fn(actionRotate(entityIDs, _pivot, delta, projection)); + _this.favoriteMatching = function (preset) { + var favs = _this.getFavorites(); - _prevTransform = currTransform; - _prevAngle = currAngle; - _prevGraph = context.graph(); + for (var index in favs) { + if (favs[index].matches(preset)) { + return favs[index]; + } } - function getPivot(points) { - var _pivot; - if (points.length === 1) { - _pivot = points[0]; - } else if (points.length === 2) { - _pivot = geoVecInterp(points[0], points[1], 0.5); - } else { - var polygonHull = d3_polygonHull(points); - if (polygonHull.length === 2) { - _pivot = geoVecInterp(points[0], points[1], 0.5); - } else { - _pivot = d3_polygonCentroid(d3_polygonHull(points)); - } - } - return _pivot; - } + return null; + }; + return utilRebind(_this, dispatch, 'on'); + } - function finish() { - event.stopPropagation(); - context.replace(actionNoop(), annotation); - context.enter(modeSelect(context, entityIDs)); - } + function utilTagText(entity) { + var obj = entity && entity.tags || {}; + return Object.keys(obj).map(function (k) { + return k + '=' + obj[k]; + }).join(', '); + } + function utilTotalExtent(array, graph) { + var extent = geoExtent(); + var val, entity; + for (var i = 0; i < array.length; i++) { + val = array[i]; + entity = typeof val === 'string' ? graph.hasEntity(val) : val; - function cancel() { - context.pop(); - context.enter(modeSelect(context, entityIDs)); + if (entity) { + extent._extend(entity.extent(graph)); } + } - - function undone() { - context.enter(modeBrowse(context)); + return extent; + } + function utilTagDiff(oldTags, newTags) { + var tagDiff = []; + var keys = utilArrayUnion(Object.keys(oldTags), Object.keys(newTags)).sort(); + keys.forEach(function (k) { + var oldVal = oldTags[k]; + var newVal = newTags[k]; + + if ((oldVal || oldVal === '') && (newVal === undefined || newVal !== oldVal)) { + tagDiff.push({ + type: '-', + key: k, + oldVal: oldVal, + newVal: newVal, + display: '- ' + k + '=' + oldVal + }); } + if ((newVal || newVal === '') && (oldVal === undefined || newVal !== oldVal)) { + tagDiff.push({ + type: '+', + key: k, + oldVal: oldVal, + newVal: newVal, + display: '+ ' + k + '=' + newVal + }); + } + }); + return tagDiff; + } + function utilEntitySelector(ids) { + return ids.length ? '.' + ids.join(',.') : 'nothing'; + } // returns an selector to select entity ids for: + // - entityIDs passed in + // - shallow descendant entityIDs for any of those entities that are relations - mode.enter = function() { - context.features().forceVisible(entityIDs); + function utilEntityOrMemberSelector(ids, graph) { + var seen = new Set(ids); + ids.forEach(collectShallowDescendants); + return utilEntitySelector(Array.from(seen)); + + function collectShallowDescendants(id) { + var entity = graph.hasEntity(id); + if (!entity || entity.type !== 'relation') return; + entity.members.map(function (member) { + return member.id; + }).forEach(function (id) { + seen.add(id); + }); + } + } // returns an selector to select entity ids for: + // - entityIDs passed in + // - deep descendant entityIDs for any of those entities that are relations - behaviors.forEach(context.install); + function utilEntityOrDeepMemberSelector(ids, graph) { + return utilEntitySelector(utilEntityAndDeepMemberIDs(ids, graph)); + } // returns an selector to select entity ids for: + // - entityIDs passed in + // - deep descendant entityIDs for any of those entities that are relations - context.surface() - .on('mousemove.rotate', doRotate) - .on('click.rotate', finish); + function utilEntityAndDeepMemberIDs(ids, graph) { + var seen = new Set(); + ids.forEach(collectDeepDescendants); + return Array.from(seen); + + function collectDeepDescendants(id) { + if (seen.has(id)) return; + seen.add(id); + var entity = graph.hasEntity(id); + if (!entity || entity.type !== 'relation') return; + entity.members.map(function (member) { + return member.id; + }).forEach(collectDeepDescendants); // recurse + } + } // returns an selector to select entity ids for: + // - deep descendant entityIDs for any of those entities that are relations - context.history() - .on('undone.rotate', undone); + function utilDeepMemberSelector(ids, graph, skipMultipolgonMembers) { + var idsSet = new Set(ids); + var seen = new Set(); + var returners = new Set(); + ids.forEach(collectDeepDescendants); + return utilEntitySelector(Array.from(returners)); - keybinding - .on('⎋', cancel) - .on('↩', finish); + function collectDeepDescendants(id) { + if (seen.has(id)) return; + seen.add(id); - select(document) - .call(keybinding); - }; + if (!idsSet.has(id)) { + returners.add(id); + } + var entity = graph.hasEntity(id); + if (!entity || entity.type !== 'relation') return; + if (skipMultipolgonMembers && entity.isMultipolygon()) return; + entity.members.map(function (member) { + return member.id; + }).forEach(collectDeepDescendants); // recurse + } + } // Adds or removes highlight styling for the specified entities - mode.exit = function() { - behaviors.forEach(context.uninstall); + function utilHighlightEntities(ids, highlighted, context) { + context.surface().selectAll(utilEntityOrDeepMemberSelector(ids, context.graph())).classed('highlighted', highlighted); + } // returns an Array that is the union of: + // - nodes for any nodeIDs passed in + // - child nodes of any wayIDs passed in + // - descendant member and child nodes of relationIDs passed in - context.surface() - .on('mousemove.rotate', null) - .on('click.rotate', null); + function utilGetAllNodes(ids, graph) { + var seen = new Set(); + var nodes = new Set(); + ids.forEach(collectNodes); + return Array.from(nodes); + + function collectNodes(id) { + if (seen.has(id)) return; + seen.add(id); + var entity = graph.hasEntity(id); + if (!entity) return; + + if (entity.type === 'node') { + nodes.add(entity); + } else if (entity.type === 'way') { + entity.nodes.forEach(collectNodes); + } else { + entity.members.map(function (member) { + return member.id; + }).forEach(collectNodes); // recurse + } + } + } + function utilDisplayName(entity) { + var localizedNameKey = 'name:' + _mainLocalizer.languageCode().toLowerCase(); + var name = entity.tags[localizedNameKey] || entity.tags.name || ''; + if (name) return name; + var tags = { + direction: entity.tags.direction, + from: entity.tags.from, + network: entity.tags.cycle_network || entity.tags.network, + ref: entity.tags.ref, + to: entity.tags.to, + via: entity.tags.via + }; + var keyComponents = []; - context.history() - .on('undone.rotate', null); + if (tags.network) { + keyComponents.push('network'); + } - select(document) - .call(keybinding.unbind); + if (tags.ref) { + keyComponents.push('ref'); + } // Routes may need more disambiguation based on direction or destination - context.features().forceVisible([]); - }; + if (entity.tags.route) { + if (tags.direction) { + keyComponents.push('direction'); + } else if (tags.from && tags.to) { + keyComponents.push('from'); + keyComponents.push('to'); - mode.selectedIDs = function() { - if (!arguments.length) { return entityIDs; } - // no assign - return mode; - }; + if (tags.via) { + keyComponents.push('via'); + } + } + } + if (keyComponents.length) { + name = _t('inspector.display_name.' + keyComponents.join('_'), tags); + } - return mode; + return name; } + function utilDisplayNameForPath(entity) { + var name = utilDisplayName(entity); + var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1; + var isNewChromium = Number(utilDetect().version.split('.')[0]) >= 96.0; - function operationRotate(context, selectedIDs) { - var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'); - var nodes = utilGetAllNodes(selectedIDs, context.graph()); - var coords = nodes.map(function(n) { return n.loc; }); - var extent = utilTotalExtent(selectedIDs, context.graph()); + if (!isFirefox && !isNewChromium && name && rtlRegex.test(name)) { + name = fixRTLTextForSvg(name); + } + return name; + } + function utilDisplayType(id) { + return { + n: _t('inspector.node'), + w: _t('inspector.way'), + r: _t('inspector.relation') + }[id.charAt(0)]; + } // `utilDisplayLabel` + // Returns a string suitable for display + // By default returns something like name/ref, fallback to preset type, fallback to OSM type + // "Main Street" or "Tertiary Road" + // If `verbose=true`, include both preset name and feature name. + // "Tertiary Road Main Street" + // - var operation = function() { - context.enter(modeRotate(context, selectedIDs)); - }; + function utilDisplayLabel(entity, graphOrGeometry, verbose) { + var result; + var displayName = utilDisplayName(entity); + var preset = typeof graphOrGeometry === 'string' ? _mainPresetIndex.matchTags(entity.tags, graphOrGeometry) : _mainPresetIndex.match(entity, graphOrGeometry); + var presetName = preset && (preset.suggestion ? preset.subtitle() : preset.name()); + if (verbose) { + result = [presetName, displayName].filter(Boolean).join(' '); + } else { + result = displayName || presetName; + } // Fallback to the OSM type (node/way/relation) - operation.available = function() { - return nodes.length >= 2; - }; + return result || utilDisplayType(entity.id); + } + function utilEntityRoot(entityType) { + return { + node: 'n', + way: 'w', + relation: 'r' + }[entityType]; + } // Returns a single object containing the tags of all the given entities. + // Example: + // { + // highway: 'service', + // service: 'parking_aisle' + // } + // + + // { + // highway: 'service', + // service: 'driveway', + // width: '3' + // } + // = + // { + // highway: 'service', + // service: [ 'driveway', 'parking_aisle' ], + // width: [ '3', undefined ] + // } - operation.disabled = function() { + function utilCombinedTags(entityIDs, graph) { + var tags = {}; + var tagCounts = {}; + var allKeys = new Set(); + var entities = entityIDs.map(function (entityID) { + return graph.hasEntity(entityID); + }).filter(Boolean); // gather the aggregate keys + + entities.forEach(function (entity) { + var keys = Object.keys(entity.tags).filter(Boolean); + keys.forEach(function (key) { + allKeys.add(key); + }); + }); + entities.forEach(function (entity) { + allKeys.forEach(function (key) { + var value = entity.tags[key]; // purposely allow `undefined` - if (extent.percentContainedIn(context.map().extent()) < 0.8) { - return 'too_large'; - } else if (someMissing()) { - return 'not_downloaded'; - } else if (selectedIDs.some(context.hasHiddenConnections)) { - return 'connected_to_hidden'; - } else if (selectedIDs.some(incompleteRelation)) { - return 'incomplete_relation'; + if (!tags.hasOwnProperty(key)) { + // first value, set as raw + tags[key] = value; + } else { + if (!Array.isArray(tags[key])) { + if (tags[key] !== value) { + // first alternate value, replace single value with array + tags[key] = [tags[key], value]; + } + } else { + // type is array + if (tags[key].indexOf(value) === -1) { + // subsequent alternate value, add to array + tags[key].push(value); + } } + } - return false; + var tagHash = key + '=' + value; + if (!tagCounts[tagHash]) tagCounts[tagHash] = 0; + tagCounts[tagHash] += 1; + }); + }); + for (var key in tags) { + if (!Array.isArray(tags[key])) continue; // sort values by frequency then alphabetically - function someMissing() { - if (context.inIntro()) { return false; } - var osm = context.connection(); - if (osm) { - var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); }); - if (missing.length) { - missing.forEach(function(loc) { context.loadTileAtLoc(loc); }); - return true; - } - } - return false; - } + tags[key] = tags[key].sort(function (val1, val2) { + var key = key; // capture - function incompleteRelation(id) { - var entity = context.entity(id); - return entity.type === 'relation' && !entity.isComplete(context.graph()); - } - }; + var count2 = tagCounts[key + '=' + val2]; + var count1 = tagCounts[key + '=' + val1]; + if (count2 !== count1) { + return count2 - count1; + } - operation.tooltip = function() { - var disable = operation.disabled(); - return disable ? - _t('operations.rotate.' + disable + '.' + multi) : - _t('operations.rotate.description.' + multi); - }; + if (val2 && val1) { + return val1.localeCompare(val2); + } + return val1 ? 1 : -1; + }); + } - operation.annotation = function() { - return selectedIDs.length === 1 ? - _t('operations.rotate.annotation.' + context.graph().geometry(selectedIDs[0])) : - _t('operations.rotate.annotation.multiple'); - }; + return tags; + } + function utilStringQs(str) { + var i = 0; // advance past any leading '?' or '#' characters + while (i < str.length && (str[i] === '?' || str[i] === '#')) { + i++; + } - operation.id = 'rotate'; - operation.keys = [_t('operations.rotate.key')]; - operation.title = _t('operations.rotate.title'); - operation.behavior = behaviorOperation(context).which(operation); + str = str.slice(i); + return str.split('&').reduce(function (obj, pair) { + var parts = pair.split('='); - operation.mouseOnly = true; + if (parts.length === 2) { + obj[parts[0]] = null === parts[1] ? '' : decodeURIComponent(parts[1]); + } - return operation; + return obj; + }, {}); } + function utilQsString(obj, noencode) { + // encode everything except special characters used in certain hash parameters: + // "/" in map states, ":", ",", {" and "}" in background + function softEncode(s) { + return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent); + } - function modeMove(context, entityIDs, baseGraph) { - var mode = { - id: 'move', - button: 'browse' - }; + return Object.keys(obj).sort().map(function (key) { + return encodeURIComponent(key) + '=' + (noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key])); + }).join('&'); + } + function utilPrefixDOMProperty(property) { + var prefixes = ['webkit', 'ms', 'moz', 'o']; + var i = -1; + var n = prefixes.length; + var s = document.body; + if (property in s) return property; + property = property.substr(0, 1).toUpperCase() + property.substr(1); - var keybinding = utilKeybinding('move'); - var behaviors = [ - behaviorEdit(context), - operationCircularize(context, entityIDs).behavior, - operationDelete(context, entityIDs).behavior, - operationOrthogonalize(context, entityIDs).behavior, - operationReflectLong(context, entityIDs).behavior, - operationReflectShort(context, entityIDs).behavior, - operationRotate(context, entityIDs).behavior - ]; - var annotation = entityIDs.length === 1 ? - _t('operations.move.annotation.' + context.graph().geometry(entityIDs[0])) : - _t('operations.move.annotation.multiple'); + while (++i < n) { + if (prefixes[i] + property in s) { + return prefixes[i] + property; + } + } - var _prevGraph; - var _cache; - var _origin; - var _nudgeInterval; + return false; + } + function utilPrefixCSSProperty(property) { + var prefixes = ['webkit', 'ms', 'Moz', 'O']; + var i = -1; + var n = prefixes.length; + var s = document.body.style; + if (property.toLowerCase() in s) { + return property.toLowerCase(); + } - function doMove(nudge) { - nudge = nudge || [0, 0]; + while (++i < n) { + if (prefixes[i] + property in s) { + return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase(); + } + } - var fn; - if (_prevGraph !== context.graph()) { - _cache = {}; - _origin = context.map().mouseCoordinates(); - fn = context.perform; - } else { - fn = context.overwrite; - } + return false; + } + var transformProperty; + function utilSetTransform(el, x, y, scale) { + var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform'); + var translate = utilDetect().opera ? 'translate(' + x + 'px,' + y + 'px)' : 'translate3d(' + x + 'px,' + y + 'px,0)'; + return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : '')); + } // Calculates Levenshtein distance between two strings + // see: https://en.wikipedia.org/wiki/Levenshtein_distance + // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents. - var currMouse = context.map().mouse(); - var origMouse = context.projection(_origin); - var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge); + function utilEditDistance(a, b) { + a = remove$6(a.toLowerCase()); + b = remove$6(b.toLowerCase()); + if (a.length === 0) return b.length; + if (b.length === 0) return a.length; + var matrix = []; + var i, j; - fn(actionMove(entityIDs, delta, context.projection, _cache)); - _prevGraph = context.graph(); - } + for (i = 0; i <= b.length; i++) { + matrix[i] = [i]; + } + for (j = 0; j <= a.length; j++) { + matrix[0][j] = j; + } - function startNudge(nudge) { - if (_nudgeInterval) { window.clearInterval(_nudgeInterval); } - _nudgeInterval = window.setInterval(function() { - context.map().pan(nudge); - doMove(nudge); - }, 50); + for (i = 1; i <= b.length; i++) { + for (j = 1; j <= a.length; j++) { + if (b.charAt(i - 1) === a.charAt(j - 1)) { + matrix[i][j] = matrix[i - 1][j - 1]; + } else { + matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution + Math.min(matrix[i][j - 1] + 1, // insertion + matrix[i - 1][j] + 1)); // deletion + } } + } + return matrix[b.length][a.length]; + } // a d3.mouse-alike which + // 1. Only works on HTML elements, not SVG + // 2. Does not cause style recalculation - function stopNudge() { - if (_nudgeInterval) { - window.clearInterval(_nudgeInterval); - _nudgeInterval = null; - } - } + function utilFastMouse(container) { + var rect = container.getBoundingClientRect(); + var rectLeft = rect.left; + var rectTop = rect.top; + var clientLeft = +container.clientLeft; + var clientTop = +container.clientTop; + return function (e) { + return [e.clientX - rectLeft - clientLeft, e.clientY - rectTop - clientTop]; + }; + } + function utilAsyncMap(inputs, func, callback) { + var remaining = inputs.length; + var results = []; + var errors = []; + inputs.forEach(function (d, i) { + func(d, function done(err, data) { + errors[i] = err; + results[i] = data; + remaining--; + if (!remaining) callback(errors, results); + }); + }); + } // wraps an index to an interval [0..length-1] + function utilWrap(index, length) { + if (index < 0) { + index += Math.ceil(-index / length) * length; + } - function move() { - doMove(); - var nudge = geoViewportEdge(context.map().mouse(), context.map().dimensions()); - if (nudge) { - startNudge(nudge); - } else { - stopNudge(); - } - } + return index % length; + } + /** + * a replacement for functor + * + * @param {*} value any value + * @returns {Function} a function that returns that value or the value if it's a function + */ + function utilFunctor(value) { + if (typeof value === 'function') return value; + return function () { + return value; + }; + } + function utilNoAuto(selection) { + var isText = selection.size() && selection.node().tagName.toLowerCase() === 'textarea'; + return selection // assign 'new-password' even for non-password fields to prevent browsers (Chrome) ignoring 'off' + .attr('autocomplete', 'new-password').attr('autocorrect', 'off').attr('autocapitalize', 'off').attr('spellcheck', isText ? 'true' : 'false'); + } // https://stackoverflow.com/questions/194846/is-there-any-kind-of-hash-code-function-in-javascript + // https://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/ - function finish() { - event.stopPropagation(); - context.replace(actionNoop(), annotation); - context.enter(modeSelect(context, entityIDs)); - stopNudge(); - } + function utilHashcode(str) { + var hash = 0; + if (str.length === 0) { + return hash; + } - function cancel() { - if (baseGraph) { - while (context.graph() !== baseGraph) { context.pop(); } - context.enter(modeBrowse(context)); - } else { - context.pop(); - context.enter(modeSelect(context, entityIDs)); - } - stopNudge(); - } + for (var i = 0; i < str.length; i++) { + var _char = str.charCodeAt(i); + hash = (hash << 5) - hash + _char; + hash = hash & hash; // Convert to 32bit integer + } - function undone() { - context.enter(modeBrowse(context)); - } + return hash; + } // Returns version of `str` with all runs of special characters replaced by `_`; + // suitable for HTML ids, classes, selectors, etc. + function utilSafeClassName(str) { + return str.toLowerCase().replace(/[^a-z0-9]+/g, '_'); + } // Returns string based on `val` that is highly unlikely to collide with an id + // used previously or that's present elsewhere in the document. Useful for preventing + // browser-provided autofills or when embedding iD on pages with unknown elements. - mode.enter = function() { - _origin = context.map().mouseCoordinates(); - _prevGraph = null; - _cache = {}; + function utilUniqueDomId(val) { + return 'ideditor-' + utilSafeClassName(val.toString()) + '-' + new Date().getTime().toString(); + } // Returns the length of `str` in unicode characters. This can be less than + // `String.length()` since a single unicode character can be composed of multiple + // JavaScript UTF-16 code units. - context.features().forceVisible(entityIDs); + function utilUnicodeCharsCount(str) { + // Native ES2015 implementations of `Array.from` split strings into unicode characters + return Array.from(str).length; + } // Returns a new string representing `str` cut from its start to `limit` length + // in unicode characters. Note that this runs the risk of splitting graphemes. - behaviors.forEach(context.install); + function utilUnicodeCharsTruncated(str, limit) { + return Array.from(str).slice(0, limit).join(''); + } - context.surface() - .on('mousemove.move', move) - .on('click.move', finish); + function toNumericID(id) { + var match = id.match(/^[cnwr](-?\d+)$/); - context.history() - .on('undone.move', undone); + if (match) { + return parseInt(match[1], 10); + } - keybinding - .on('⎋', cancel) - .on('↩', finish); + return NaN; + } - select(document) - .call(keybinding); - }; + function compareNumericIDs(left, right) { + if (isNaN(left) && isNaN(right)) return -1; + if (isNaN(left)) return 1; + if (isNaN(right)) return -1; + if (Math.sign(left) !== Math.sign(right)) return -Math.sign(left); + if (Math.sign(left) < 0) return Math.sign(right - left); + return Math.sign(left - right); + } // Returns -1 if the first parameter ID is older than the second, + // 1 if the second parameter is older, 0 if they are the same. + // If both IDs are test IDs, the function returns -1. - mode.exit = function() { - stopNudge(); + function utilCompareIDs(left, right) { + return compareNumericIDs(toNumericID(left), toNumericID(right)); + } // Returns the chronologically oldest ID in the list. + // Database IDs (with positive numbers) before editor ones (with negative numbers). + // Among each category, the closest number to 0 is the oldest. + // Test IDs (any string that does not conform to OSM's ID scheme) are taken last. - behaviors.forEach(function(behavior) { - context.uninstall(behavior); - }); + function utilOldestID(ids) { + if (ids.length === 0) { + return undefined; + } - context.surface() - .on('mousemove.move', null) - .on('click.move', null); + var oldestIDIndex = 0; + var oldestID = toNumericID(ids[0]); - context.history() - .on('undone.move', null); + for (var i = 1; i < ids.length; i++) { + var num = toNumericID(ids[i]); - select(document) - .call(keybinding.unbind); + if (compareNumericIDs(oldestID, num) === 1) { + oldestIDIndex = i; + oldestID = num; + } + } - context.features().forceVisible([]); - }; + return ids[oldestIDIndex]; + } + function osmEntity(attrs) { + // For prototypal inheritance. + if (this instanceof osmEntity) return; // Create the appropriate subtype. - mode.selectedIDs = function() { - if (!arguments.length) { return entityIDs; } - // no assign - return mode; - }; + if (attrs && attrs.type) { + return osmEntity[attrs.type].apply(this, arguments); + } else if (attrs && attrs.id) { + return osmEntity[osmEntity.id.type(attrs.id)].apply(this, arguments); + } // Initialize a generic Entity (used only in tests). - return mode; + return new osmEntity().initialize(arguments); } - // see also `operationPaste` - function behaviorPaste(context) { + osmEntity.id = function (type) { + return osmEntity.id.fromOSM(type, osmEntity.id.next[type]--); + }; - function doPaste() { - // prevent paste during low zoom selection - if (!context.map().withinEditableZoom()) { return; } + osmEntity.id.next = { + changeset: -1, + node: -1, + way: -1, + relation: -1 + }; - event.preventDefault(); + osmEntity.id.fromOSM = function (type, id) { + return type[0] + id; + }; - var baseGraph = context.graph(); - var mouse = context.map().mouse(); - var projection = context.projection; - var viewport = geoExtent(projection.clipExtent()).polygon(); + osmEntity.id.toOSM = function (id) { + var match = id.match(/^[cnwr](-?\d+)$/); - if (!geoPointInPolygon(mouse, viewport)) { return; } + if (match) { + return match[1]; + } - var oldIDs = context.copyIDs(); - if (!oldIDs.length) { return; } + return ''; + }; - var extent = geoExtent(); - var oldGraph = context.copyGraph(); - var newIDs = []; + osmEntity.id.type = function (id) { + return { + 'c': 'changeset', + 'n': 'node', + 'w': 'way', + 'r': 'relation' + }[id[0]]; + }; // A function suitable for use as the second argument to d3.selection#data(). - var action = actionCopyEntities(oldIDs, oldGraph); - context.perform(action); - var copies = action.copies(); - var originals = new Set(); - Object.values(copies).forEach(function(entity) { originals.add(entity.id); }); + osmEntity.key = function (entity) { + return entity.id + 'v' + (entity.v || 0); + }; - for (var id in copies) { - var oldEntity = oldGraph.entity(id); - var newEntity = copies[id]; + var _deprecatedTagValuesByKey; - extent._extend(oldEntity.extent(oldGraph)); + osmEntity.deprecatedTagValuesByKey = function (dataDeprecated) { + if (!_deprecatedTagValuesByKey) { + _deprecatedTagValuesByKey = {}; + dataDeprecated.forEach(function (d) { + var oldKeys = Object.keys(d.old); - // Exclude child nodes from newIDs if their parent way was also copied. - var parents = context.graph().parentWays(newEntity); - var parentCopied = parents.some(function(parent) { - return originals.has(parent.id); - }); + if (oldKeys.length === 1) { + var oldKey = oldKeys[0]; + var oldValue = d.old[oldKey]; - if (!parentCopied) { - newIDs.push(newEntity.id); - } + if (oldValue !== '*') { + if (!_deprecatedTagValuesByKey[oldKey]) { + _deprecatedTagValuesByKey[oldKey] = [oldValue]; + } else { + _deprecatedTagValuesByKey[oldKey].push(oldValue); + } } + } + }); + } - // Put pasted objects where mouse pointer is.. - var copyPoint = (context.copyLonLat() && projection(context.copyLonLat())) || projection(extent.center()); - var delta = geoVecSubtract(mouse, copyPoint); + return _deprecatedTagValuesByKey; + }; - context.perform(actionMove(newIDs, delta, projection)); - context.enter(modeMove(context, newIDs, baseGraph)); + osmEntity.prototype = { + tags: {}, + initialize: function initialize(sources) { + for (var i = 0; i < sources.length; ++i) { + var source = sources[i]; + + for (var prop in source) { + if (Object.prototype.hasOwnProperty.call(source, prop)) { + if (source[prop] === undefined) { + delete this[prop]; + } else { + this[prop] = source[prop]; + } + } + } } + if (!this.id && this.type) { + this.id = osmEntity.id(this.type); + } - function behavior() { - context.keybinding().on(uiCmd('⌘V'), doPaste); - return behavior; + if (!this.hasOwnProperty('visible')) { + this.visible = true; } + if (debug) { + Object.freeze(this); + Object.freeze(this.tags); + if (this.loc) Object.freeze(this.loc); + if (this.nodes) Object.freeze(this.nodes); + if (this.members) Object.freeze(this.members); + } - behavior.off = function() { - context.keybinding().off(uiCmd('⌘V')); - }; + return this; + }, + copy: function copy(resolver, copies) { + if (copies[this.id]) return copies[this.id]; + var copy = osmEntity(this, { + id: undefined, + user: undefined, + version: undefined + }); + copies[this.id] = copy; + return copy; + }, + osmId: function osmId() { + return osmEntity.id.toOSM(this.id); + }, + isNew: function isNew() { + var osmId = osmEntity.id.toOSM(this.id); + return osmId.length === 0 || osmId[0] === '-'; + }, + update: function update(attrs) { + return osmEntity(this, attrs, { + v: 1 + (this.v || 0) + }); + }, + mergeTags: function mergeTags(tags) { + var merged = Object.assign({}, this.tags); // shallow copy + var changed = false; - return behavior; - } + for (var k in tags) { + var t1 = merged[k]; + var t2 = tags[k]; + + if (!t1) { + changed = true; + merged[k] = t2; + } else if (t1 !== t2) { + changed = true; + merged[k] = utilUnicodeCharsTruncated(utilArrayUnion(t1.split(/;\s*/), t2.split(/;\s*/)).join(';'), 255 // avoid exceeding character limit; see also services/osm.js -> maxCharsForTagValue() + ); + } + } - /* - `behaviorDrag` is like `d3_behavior.drag`, with the following differences: + return changed ? this.update({ + tags: merged + }) : this; + }, + intersects: function intersects(extent, resolver) { + return this.extent(resolver).intersects(extent); + }, + hasNonGeometryTags: function hasNonGeometryTags() { + return Object.keys(this.tags).some(function (k) { + return k !== 'area'; + }); + }, + hasParentRelations: function hasParentRelations(resolver) { + return resolver.parentRelations(this).length > 0; + }, + hasInterestingTags: function hasInterestingTags() { + return Object.keys(this.tags).some(osmIsInterestingTag); + }, + isHighwayIntersection: function isHighwayIntersection() { + return false; + }, + isDegenerate: function isDegenerate() { + return true; + }, + deprecatedTags: function deprecatedTags(dataDeprecated) { + var tags = this.tags; // if there are no tags, none can be deprecated + + if (Object.keys(tags).length === 0) return []; + var deprecated = []; + dataDeprecated.forEach(function (d) { + var oldKeys = Object.keys(d.old); + + if (d.replace) { + var hasExistingValues = Object.keys(d.replace).some(function (replaceKey) { + if (!tags[replaceKey] || d.old[replaceKey]) return false; + var replaceValue = d.replace[replaceKey]; + if (replaceValue === '*') return false; + if (replaceValue === tags[replaceKey]) return false; + return true; + }); // don't flag deprecated tags if the upgrade path would overwrite existing data - #7843 - * The `origin` function is expected to return an [x, y] tuple rather than an - {x, y} object. - * The events are `start`, `move`, and `end`. - (https://github.com/mbostock/d3/issues/563) - * The `start` event is not dispatched until the first cursor movement occurs. - (https://github.com/mbostock/d3/pull/368) - * The `move` event has a `point` and `delta` [x, y] tuple properties rather - than `x`, `y`, `dx`, and `dy` properties. - * The `end` event is not dispatched if no movement occurs. - * An `off` function is available that unbinds the drag's internal event handlers. - */ + if (hasExistingValues) return; + } - function behaviorDrag() { - var dispatch$1 = dispatch('start', 'move', 'end'); - - // see also behaviorSelect - var _tolerancePx = 1; // keep this low to facilitate pixel-perfect micromapping - var _penTolerancePx = 4; // styluses can be touchy so require greater movement - #1981 - - var _origin = null; - var _selector = ''; - var _event; - var _target; - var _surface; - var _pointerId; - - // use pointer events on supported platforms; fallback to mouse events - var _pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse'; - - var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect'); - var d3_event_userSelectSuppress = function() { - var selection$1 = selection(); - var select = selection$1.style(d3_event_userSelectProperty); - selection$1.style(d3_event_userSelectProperty, 'none'); - return function() { - selection$1.style(d3_event_userSelectProperty, select); - }; - }; + var matchesDeprecatedTags = oldKeys.every(function (oldKey) { + if (!tags[oldKey]) return false; + if (d.old[oldKey] === '*') return true; + if (d.old[oldKey] === tags[oldKey]) return true; + var vals = tags[oldKey].split(';').filter(Boolean); + if (vals.length === 0) { + return false; + } else if (vals.length > 1) { + return vals.indexOf(d.old[oldKey]) !== -1; + } else { + if (tags[oldKey] === d.old[oldKey]) { + if (d.replace && d.old[oldKey] === d.replace[oldKey]) { + var replaceKeys = Object.keys(d.replace); + return !replaceKeys.every(function (replaceKey) { + return tags[replaceKey] === d.replace[replaceKey]; + }); + } else { + return true; + } + } + } - function eventOf(thiz, argumentz) { - return function(e1) { - e1.target = behavior; - customEvent(e1, dispatch$1.apply, dispatch$1, [e1.type, thiz, argumentz]); - }; - } + return false; + }); + if (matchesDeprecatedTags) { + deprecated.push(d); + } + }); + return deprecated; + } + }; - function pointerdown() { + function osmLanes(entity) { + if (entity.type !== 'way') return null; + if (!entity.tags.highway) return null; + var tags = entity.tags; + var isOneWay = entity.isOneWay(); + var laneCount = getLaneCount(tags, isOneWay); + var maxspeed = parseMaxspeed(tags); + var laneDirections = parseLaneDirections(tags, isOneWay, laneCount); + var forward = laneDirections.forward; + var backward = laneDirections.backward; + var bothways = laneDirections.bothways; // parse the piped string 'x|y|z' format + + var turnLanes = {}; + turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']); + turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']); + turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']); + var maxspeedLanes = {}; + maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed); + maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed); + maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed); + var psvLanes = {}; + psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']); + psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']); + psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']); + var busLanes = {}; + busLanes.unspecified = parseMiscLanes(tags['bus:lanes']); + busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']); + busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']); + var taxiLanes = {}; + taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']); + taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']); + taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']); + var hovLanes = {}; + hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']); + hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']); + hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']); + var hgvLanes = {}; + hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']); + hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']); + hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']); + var bicyclewayLanes = {}; + bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']); + bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']); + bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']); + var lanesObj = { + forward: [], + backward: [], + unspecified: [] + }; // map forward/backward/unspecified of each lane type to lanesObj + + mapToLanesObj(lanesObj, turnLanes, 'turnLane'); + mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed'); + mapToLanesObj(lanesObj, psvLanes, 'psv'); + mapToLanesObj(lanesObj, busLanes, 'bus'); + mapToLanesObj(lanesObj, taxiLanes, 'taxi'); + mapToLanesObj(lanesObj, hovLanes, 'hov'); + mapToLanesObj(lanesObj, hgvLanes, 'hgv'); + mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway'); + return { + metadata: { + count: laneCount, + oneway: isOneWay, + forward: forward, + backward: backward, + bothways: bothways, + turnLanes: turnLanes, + maxspeed: maxspeed, + maxspeedLanes: maxspeedLanes, + psvLanes: psvLanes, + busLanes: busLanes, + taxiLanes: taxiLanes, + hovLanes: hovLanes, + hgvLanes: hgvLanes, + bicyclewayLanes: bicyclewayLanes + }, + lanes: lanesObj + }; + } - if (_pointerId) { return; } + function getLaneCount(tags, isOneWay) { + var count; - _pointerId = event.pointerId || 'mouse'; + if (tags.lanes) { + count = parseInt(tags.lanes, 10); - _target = this; - _event = eventOf(_target, arguments); + if (count > 0) { + return count; + } + } - // only force reflow once per drag - var pointerLocGetter = utilFastMouse(_surface || _target.parentNode); + switch (tags.highway) { + case 'trunk': + case 'motorway': + count = isOneWay ? 2 : 4; + break; - var offset; - var startOrigin = pointerLocGetter(event); - var started = false; - var selectEnable = d3_event_userSelectSuppress(); + default: + count = isOneWay ? 1 : 2; + break; + } - select(window) - .on(_pointerPrefix + 'move.drag', pointermove) - .on(_pointerPrefix + 'up.drag pointercancel.drag', pointerup, true); + return count; + } - if (_origin) { - offset = _origin.apply(_target, arguments); - offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]]; - } else { - offset = [0, 0]; - } + function parseMaxspeed(tags) { + var maxspeed = tags.maxspeed; + if (!maxspeed) return; + var maxspeedRegex = /^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/; + if (!maxspeedRegex.test(maxspeed)) return; + return parseInt(maxspeed, 10); + } - event.stopPropagation(); + function parseLaneDirections(tags, isOneWay, laneCount) { + var forward = parseInt(tags['lanes:forward'], 10); + var backward = parseInt(tags['lanes:backward'], 10); + var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0; + if (parseInt(tags.oneway, 10) === -1) { + forward = 0; + bothways = 0; + backward = laneCount; + } else if (isOneWay) { + forward = laneCount; + bothways = 0; + backward = 0; + } else if (isNaN(forward) && isNaN(backward)) { + backward = Math.floor((laneCount - bothways) / 2); + forward = laneCount - bothways - backward; + } else if (isNaN(forward)) { + if (backward > laneCount - bothways) { + backward = laneCount - bothways; + } - function pointermove() { - if (_pointerId !== (event.pointerId || 'mouse')) { return; } + forward = laneCount - bothways - backward; + } else if (isNaN(backward)) { + if (forward > laneCount - bothways) { + forward = laneCount - bothways; + } - var p = pointerLocGetter(event); + backward = laneCount - bothways - forward; + } - if (!started) { - var dist = geoVecLength(startOrigin, p); - var tolerance = event.pointerType === 'pen' ? _penTolerancePx : _tolerancePx; - // don't start until the drag has actually moved somewhat - if (dist < tolerance) { return; } + return { + forward: forward, + backward: backward, + bothways: bothways + }; + } - started = true; - _event({ type: 'start' }); + function parseTurnLanes(tag) { + if (!tag) return; + var validValues = ['left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right', 'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none']; + return tag.split('|').map(function (s) { + if (s === '') s = 'none'; + return s.split(';').map(function (d) { + return validValues.indexOf(d) === -1 ? 'unknown' : d; + }); + }); + } - // Don't send a `move` event in the same cycle as `start` since dragging - // a midpoint will convert the target to a node. - } else { + function parseMaxspeedLanes(tag, maxspeed) { + if (!tag) return; + return tag.split('|').map(function (s) { + if (s === 'none') return s; + var m = parseInt(s, 10); + if (s === '' || m === maxspeed) return null; + return isNaN(m) ? 'unknown' : m; + }); + } - startOrigin = p; - event.stopPropagation(); - event.preventDefault(); + function parseMiscLanes(tag) { + if (!tag) return; + var validValues = ['yes', 'no', 'designated']; + return tag.split('|').map(function (s) { + if (s === '') s = 'no'; + return validValues.indexOf(s) === -1 ? 'unknown' : s; + }); + } - var dx = p[0] - startOrigin[0]; - var dy = p[1] - startOrigin[1]; - _event({ - type: 'move', - point: [p[0] + offset[0], p[1] + offset[1]], - delta: [dx, dy] - }); - } - } + function parseBicycleWay(tag) { + if (!tag) return; + var validValues = ['yes', 'no', 'designated', 'lane']; + return tag.split('|').map(function (s) { + if (s === '') s = 'no'; + return validValues.indexOf(s) === -1 ? 'unknown' : s; + }); + } + + function mapToLanesObj(lanesObj, data, key) { + if (data.forward) { + data.forward.forEach(function (l, i) { + if (!lanesObj.forward[i]) lanesObj.forward[i] = {}; + lanesObj.forward[i][key] = l; + }); + } + + if (data.backward) { + data.backward.forEach(function (l, i) { + if (!lanesObj.backward[i]) lanesObj.backward[i] = {}; + lanesObj.backward[i][key] = l; + }); + } + if (data.unspecified) { + data.unspecified.forEach(function (l, i) { + if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {}; + lanesObj.unspecified[i][key] = l; + }); + } + } - function pointerup() { - if (_pointerId !== (event.pointerId || 'mouse')) { return; } + function osmWay() { + if (!(this instanceof osmWay)) { + return new osmWay().initialize(arguments); + } else if (arguments.length) { + this.initialize(arguments); + } + } + osmEntity.way = osmWay; + osmWay.prototype = Object.create(osmEntity.prototype); + Object.assign(osmWay.prototype, { + type: 'way', + nodes: [], + copy: function copy(resolver, copies) { + if (copies[this.id]) return copies[this.id]; + var copy = osmEntity.prototype.copy.call(this, resolver, copies); + var nodes = this.nodes.map(function (id) { + return resolver.entity(id).copy(resolver, copies).id; + }); + copy = copy.update({ + nodes: nodes + }); + copies[this.id] = copy; + return copy; + }, + extent: function extent(resolver) { + return resolver["transient"](this, 'extent', function () { + var extent = geoExtent(); - _pointerId = null; + for (var i = 0; i < this.nodes.length; i++) { + var node = resolver.hasEntity(this.nodes[i]); - if (started) { - _event({ type: 'end' }); + if (node) { + extent._extend(node.extent()); + } + } - event.preventDefault(); - } + return extent; + }); + }, + first: function first() { + return this.nodes[0]; + }, + last: function last() { + return this.nodes[this.nodes.length - 1]; + }, + contains: function contains(node) { + return this.nodes.indexOf(node) >= 0; + }, + affix: function affix(node) { + if (this.nodes[0] === node) return 'prefix'; + if (this.nodes[this.nodes.length - 1] === node) return 'suffix'; + }, + layer: function layer() { + // explicit layer tag, clamp between -10, 10.. + if (isFinite(this.tags.layer)) { + return Math.max(-10, Math.min(+this.tags.layer, 10)); + } // implied layer tag.. + + + if (this.tags.covered === 'yes') return -1; + if (this.tags.location === 'overground') return 1; + if (this.tags.location === 'underground') return -1; + if (this.tags.location === 'underwater') return -10; + if (this.tags.power === 'line') return 10; + if (this.tags.power === 'minor_line') return 10; + if (this.tags.aerialway) return 10; + if (this.tags.bridge) return 1; + if (this.tags.cutting) return -1; + if (this.tags.tunnel) return -1; + if (this.tags.waterway) return -1; + if (this.tags.man_made === 'pipeline') return -10; + if (this.tags.boundary) return -10; + return 0; + }, + // the approximate width of the line based on its tags except its `width` tag + impliedLineWidthMeters: function impliedLineWidthMeters() { + var averageWidths = { + highway: { + // width is for single lane + motorway: 5, + motorway_link: 5, + trunk: 4.5, + trunk_link: 4.5, + primary: 4, + secondary: 4, + tertiary: 4, + primary_link: 4, + secondary_link: 4, + tertiary_link: 4, + unclassified: 4, + road: 4, + living_street: 4, + bus_guideway: 4, + pedestrian: 4, + residential: 3.5, + service: 3.5, + track: 3, + cycleway: 2.5, + bridleway: 2, + corridor: 2, + steps: 2, + path: 1.5, + footway: 1.5 + }, + railway: { + // width includes ties and rail bed, not just track gauge + rail: 2.5, + light_rail: 2.5, + tram: 2.5, + subway: 2.5, + monorail: 2.5, + funicular: 2.5, + disused: 2.5, + preserved: 2.5, + miniature: 1.5, + narrow_gauge: 1.5 + }, + waterway: { + river: 50, + canal: 25, + stream: 5, + tidal_channel: 5, + fish_pass: 2.5, + drain: 2.5, + ditch: 1.5 + } + }; - select(window) - .on(_pointerPrefix + 'move.drag', null) - .on(_pointerPrefix + 'up.drag pointercancel.drag', null); + for (var key in averageWidths) { + if (this.tags[key] && averageWidths[key][this.tags[key]]) { + var width = averageWidths[key][this.tags[key]]; - selectEnable(); + if (key === 'highway') { + var laneCount = this.tags.lanes && parseInt(this.tags.lanes, 10); + if (!laneCount) laneCount = this.isOneWay() ? 1 : 2; + return width * laneCount; } + + return width; + } } + return null; + }, + isOneWay: function isOneWay() { + // explicit oneway tag.. + var values = { + 'yes': true, + '1': true, + '-1': true, + 'reversible': true, + 'alternating': true, + 'no': false, + '0': false + }; - function behavior(selection) { - _pointerId = null; - var matchesSelector = utilPrefixDOMProperty('matchesSelector'); - var delegate = pointerdown; + if (values[this.tags.oneway] !== undefined) { + return values[this.tags.oneway]; + } // implied oneway tag.. - if (_selector) { - delegate = function() { - var root = this; - var target = event.target; - for (; target && target !== root; target = target.parentNode) { - var datum = target.__data__; - var entity = datum instanceof osmNote ? datum - : datum && datum.properties && datum.properties.entity; + for (var key in this.tags) { + if (key in osmOneWayTags && this.tags[key] in osmOneWayTags[key]) { + return true; + } + } - if (entity && target[matchesSelector](_selector)) { - return pointerdown.call(target, entity); - } - } - }; + return false; + }, + // Some identifier for tag that implies that this way is "sided", + // i.e. the right side is the 'inside' (e.g. the right side of a + // natural=cliff is lower). + sidednessIdentifier: function sidednessIdentifier() { + for (var key in this.tags) { + var value = this.tags[key]; + + if (key in osmRightSideIsInsideTags && value in osmRightSideIsInsideTags[key]) { + if (osmRightSideIsInsideTags[key][value] === true) { + return key; + } else { + // if the map's value is something other than a + // literal true, we should use it so we can + // special case some keys (e.g. natural=coastline + // is handled differently to other naturals). + return osmRightSideIsInsideTags[key][value]; } + } + } - selection - .on(_pointerPrefix + 'down.drag' + _selector, delegate); + return null; + }, + isSided: function isSided() { + if (this.tags.two_sided === 'yes') { + return false; } + return this.sidednessIdentifier() !== null; + }, + lanes: function lanes() { + return osmLanes(this); + }, + isClosed: function isClosed() { + return this.nodes.length > 1 && this.first() === this.last(); + }, + isConvex: function isConvex(resolver) { + if (!this.isClosed() || this.isDegenerate()) return null; + var nodes = utilArrayUniq(resolver.childNodes(this)); + var coords = nodes.map(function (n) { + return n.loc; + }); + var curr = 0; + var prev = 0; - behavior.off = function(selection) { - selection - .on(_pointerPrefix + 'down.drag' + _selector, null); - }; + for (var i = 0; i < coords.length; i++) { + var o = coords[(i + 1) % coords.length]; + var a = coords[i]; + var b = coords[(i + 2) % coords.length]; + var res = geoVecCross(a, b, o); + curr = res > 0 ? 1 : res < 0 ? -1 : 0; + if (curr === 0) { + continue; + } else if (prev && curr !== prev) { + return false; + } - behavior.selector = function(_) { - if (!arguments.length) { return _selector; } - _selector = _; - return behavior; - }; + prev = curr; + } + return true; + }, + // returns an object with the tag that implies this is an area, if any + tagSuggestingArea: function tagSuggestingArea() { + return osmTagSuggestingArea(this.tags); + }, + isArea: function isArea() { + if (this.tags.area === 'yes') return true; + if (!this.isClosed() || this.tags.area === 'no') return false; + return this.tagSuggestingArea() !== null; + }, + isDegenerate: function isDegenerate() { + return new Set(this.nodes).size < (this.isArea() ? 3 : 2); + }, + areAdjacent: function areAdjacent(n1, n2) { + for (var i = 0; i < this.nodes.length; i++) { + if (this.nodes[i] === n1) { + if (this.nodes[i - 1] === n2) return true; + if (this.nodes[i + 1] === n2) return true; + } + } - behavior.origin = function(_) { - if (!arguments.length) { return _origin; } - _origin = _; - return behavior; - }; + return false; + }, + geometry: function geometry(graph) { + return graph["transient"](this, 'geometry', function () { + return this.isArea() ? 'area' : 'line'; + }); + }, + // returns an array of objects representing the segments between the nodes in this way + segments: function segments(graph) { + function segmentExtent(graph) { + var n1 = graph.hasEntity(this.nodes[0]); + var n2 = graph.hasEntity(this.nodes[1]); + return n1 && n2 && geoExtent([[Math.min(n1.loc[0], n2.loc[0]), Math.min(n1.loc[1], n2.loc[1])], [Math.max(n1.loc[0], n2.loc[0]), Math.max(n1.loc[1], n2.loc[1])]]); + } + + return graph["transient"](this, 'segments', function () { + var segments = []; + + for (var i = 0; i < this.nodes.length - 1; i++) { + segments.push({ + id: this.id + '-' + i, + wayId: this.id, + index: i, + nodes: [this.nodes[i], this.nodes[i + 1]], + extent: segmentExtent + }); + } + return segments; + }); + }, + // If this way is not closed, append the beginning node to the end of the nodelist to close it. + close: function close() { + if (this.isClosed() || !this.nodes.length) return this; + var nodes = this.nodes.slice(); + nodes = nodes.filter(noRepeatNodes); + nodes.push(nodes[0]); + return this.update({ + nodes: nodes + }); + }, + // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it. + unclose: function unclose() { + if (!this.isClosed()) return this; + var nodes = this.nodes.slice(); + var connector = this.first(); + var i = nodes.length - 1; // remove trailing connectors.. - behavior.cancel = function() { - select(window) - .on(_pointerPrefix + 'move.drag', null) - .on(_pointerPrefix + 'up.drag pointercancel.drag', null); - return behavior; - }; + while (i > 0 && nodes.length > 1 && nodes[i] === connector) { + nodes.splice(i, 1); + i = nodes.length - 1; + } + nodes = nodes.filter(noRepeatNodes); + return this.update({ + nodes: nodes + }); + }, + // Adds a node (id) in front of the node which is currently at position index. + // If index is undefined, the node will be added to the end of the way for linear ways, + // or just before the final connecting node for circular ways. + // Consecutive duplicates are eliminated including existing ones. + // Circularity is always preserved when adding a node. + addNode: function addNode(id, index) { + var nodes = this.nodes.slice(); + var isClosed = this.isClosed(); + var max = isClosed ? nodes.length - 1 : nodes.length; - behavior.target = function() { - if (!arguments.length) { return _target; } - _target = arguments[0]; - _event = eventOf(_target, Array.prototype.slice.call(arguments, 1)); - return behavior; - }; + if (index === undefined) { + index = max; + } + if (index < 0 || index > max) { + throw new RangeError('index ' + index + ' out of range 0..' + max); + } // If this is a closed way, remove all connector nodes except the first one + // (there may be duplicates) and adjust index if necessary.. - behavior.surface = function() { - if (!arguments.length) { return _surface; } - _surface = arguments[0]; - return behavior; - }; + if (isClosed) { + var connector = this.first(); // leading connectors.. - return utilRebind(behavior, dispatch$1, 'on'); - } + var i = 1; - function modeDragNode(context) { - var mode = { - id: 'drag-node', - button: 'browse' - }; - var hover = behaviorHover(context).altDisables(true) - .on('hover', context.ui().sidebar.hover); - var edit = behaviorEdit(context); + while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) { + nodes.splice(i, 1); + if (index > i) index--; + } // trailing connectors.. - var _nudgeInterval; - var _restoreSelectedIDs = []; - var _wasMidpoint = false; - var _isCancelled = false; - var _activeEntity; - var _startLoc; - var _lastLoc; + i = nodes.length - 1; - function startNudge(entity, nudge) { - if (_nudgeInterval) { window.clearInterval(_nudgeInterval); } - _nudgeInterval = window.setInterval(function() { - context.map().pan(nudge); - doMove(entity, nudge); - }, 50); + while (i > 0 && nodes.length > 1 && nodes[i] === connector) { + nodes.splice(i, 1); + if (index > i) index--; + i = nodes.length - 1; + } } + nodes.splice(index, 0, id); + nodes = nodes.filter(noRepeatNodes); // If the way was closed before, append a connector node to keep it closed.. - function stopNudge() { - if (_nudgeInterval) { - window.clearInterval(_nudgeInterval); - _nudgeInterval = null; - } + if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) { + nodes.push(nodes[0]); } + return this.update({ + nodes: nodes + }); + }, + // Replaces the node which is currently at position index with the given node (id). + // Consecutive duplicates are eliminated including existing ones. + // Circularity is preserved when updating a node. + updateNode: function updateNode(id, index) { + var nodes = this.nodes.slice(); + var isClosed = this.isClosed(); + var max = nodes.length - 1; - function moveAnnotation(entity) { - return _t('operations.move.annotation.' + entity.geometry(context.graph())); - } + if (index === undefined || index < 0 || index > max) { + throw new RangeError('index ' + index + ' out of range 0..' + max); + } // If this is a closed way, remove all connector nodes except the first one + // (there may be duplicates) and adjust index if necessary.. - function connectAnnotation(nodeEntity, targetEntity) { - var nodeGeometry = nodeEntity.geometry(context.graph()); - var targetGeometry = targetEntity.geometry(context.graph()); - if (nodeGeometry === 'vertex' && targetGeometry === 'vertex') { - var nodeParentWayIDs = context.graph().parentWays(nodeEntity); - var targetParentWayIDs = context.graph().parentWays(targetEntity); - var sharedParentWays = utilArrayIntersection(nodeParentWayIDs, targetParentWayIDs); - // if both vertices are part of the same way - if (sharedParentWays.length !== 0) { - // if the nodes are next to each other, they are merged - if (sharedParentWays[0].areAdjacent(nodeEntity.id, targetEntity.id)) { - return _t('operations.connect.annotation.from_vertex.to_adjacent_vertex'); - } - return _t('operations.connect.annotation.from_vertex.to_sibling_vertex'); - } - } - return _t('operations.connect.annotation.from_' + nodeGeometry + '.to_' + targetGeometry); - } + if (isClosed) { + var connector = this.first(); // leading connectors.. + var i = 1; - function shouldSnapToNode(target) { - if (!_activeEntity) { return false; } - return _activeEntity.geometry(context.graph()) !== 'vertex' || - (target.geometry(context.graph()) === 'vertex' || _mainPresetIndex.allowsVertex(target, context.graph())); - } + while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) { + nodes.splice(i, 1); + if (index > i) index--; + } // trailing connectors.. - function origin(entity) { - return context.projection(entity.loc); - } + i = nodes.length - 1; + while (i > 0 && nodes.length > 1 && nodes[i] === connector) { + nodes.splice(i, 1); + if (index === i) index = 0; // update leading connector instead - function keydown() { - if (event.keyCode === utilKeybinding.modifierCodes.alt) { - if (context.surface().classed('nope')) { - context.surface() - .classed('nope-suppressed', true); - } - context.surface() - .classed('nope', false) - .classed('nope-disabled', true); - } + i = nodes.length - 1; + } } + nodes.splice(index, 1, id); + nodes = nodes.filter(noRepeatNodes); // If the way was closed before, append a connector node to keep it closed.. - function keyup() { - if (event.keyCode === utilKeybinding.modifierCodes.alt) { - if (context.surface().classed('nope-suppressed')) { - context.surface() - .classed('nope', true); - } - context.surface() - .classed('nope-suppressed', false) - .classed('nope-disabled', false); - } + if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) { + nodes.push(nodes[0]); } + return this.update({ + nodes: nodes + }); + }, + // Replaces each occurrence of node id needle with replacement. + // Consecutive duplicates are eliminated including existing ones. + // Circularity is preserved. + replaceNode: function replaceNode(needleID, replacementID) { + var nodes = this.nodes.slice(); + var isClosed = this.isClosed(); + + for (var i = 0; i < nodes.length; i++) { + if (nodes[i] === needleID) { + nodes[i] = replacementID; + } + } - function start(entity) { - _wasMidpoint = entity.type === 'midpoint'; - var hasHidden = context.features().hasHiddenConnections(entity, context.graph()); - _isCancelled = !context.editable() || event.sourceEvent.shiftKey || hasHidden; + nodes = nodes.filter(noRepeatNodes); // If the way was closed before, append a connector node to keep it closed.. + if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) { + nodes.push(nodes[0]); + } - if (_isCancelled) { - if (hasHidden) { - context.ui().flash - .duration(4000) - .text(_t('modes.drag_node.connected_to_hidden'))(); + return this.update({ + nodes: nodes + }); + }, + // Removes each occurrence of node id. + // Consecutive duplicates are eliminated including existing ones. + // Circularity is preserved. + removeNode: function removeNode(id) { + var nodes = this.nodes.slice(); + var isClosed = this.isClosed(); + nodes = nodes.filter(function (node) { + return node !== id; + }).filter(noRepeatNodes); // If the way was closed before, append a connector node to keep it closed.. + + if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) { + nodes.push(nodes[0]); + } + + return this.update({ + nodes: nodes + }); + }, + asJXON: function asJXON(changeset_id) { + var r = { + way: { + '@id': this.osmId(), + '@version': this.version || 0, + nd: this.nodes.map(function (id) { + return { + keyAttributes: { + ref: osmEntity.id.toOSM(id) } - return drag.cancel(); - } - - if (_wasMidpoint) { - var midpoint = entity; - entity = osmNode(); - context.perform(actionAddMidpoint(midpoint, entity)); - entity = context.entity(entity.id); // get post-action entity - - var vertex = context.surface().selectAll('.' + entity.id); - drag.target(vertex.node(), entity); + }; + }, this), + tag: Object.keys(this.tags).map(function (k) { + return { + keyAttributes: { + k: k, + v: this.tags[k] + } + }; + }, this) + } + }; - } else { - context.perform(actionNoop()); - } + if (changeset_id) { + r.way['@changeset'] = changeset_id; + } - _activeEntity = entity; - _startLoc = entity.loc; + return r; + }, + asGeoJSON: function asGeoJSON(resolver) { + return resolver["transient"](this, 'GeoJSON', function () { + var coordinates = resolver.childNodes(this).map(function (n) { + return n.loc; + }); - hover.ignoreVertex(entity.geometry(context.graph()) === 'vertex'); + if (this.isArea() && this.isClosed()) { + return { + type: 'Polygon', + coordinates: [coordinates] + }; + } else { + return { + type: 'LineString', + coordinates: coordinates + }; + } + }); + }, + area: function area(resolver) { + return resolver["transient"](this, 'area', function () { + var nodes = resolver.childNodes(this); + var json = { + type: 'Polygon', + coordinates: [nodes.map(function (n) { + return n.loc; + })] + }; - context.surface().selectAll('.' + _activeEntity.id) - .classed('active', true); + if (!this.isClosed() && nodes.length) { + json.coordinates[0].push(nodes[0].loc); + } - context.enter(mode); - } + var area = d3_geoArea(json); // Heuristic for detecting counterclockwise winding order. Assumes + // that OpenStreetMap polygons are not hemisphere-spanning. + if (area > 2 * Math.PI) { + json.coordinates[0] = json.coordinates[0].reverse(); + area = d3_geoArea(json); + } - // related code - // - `behavior/draw.js` `datum()` - function datum() { - var event$1 = event && event.sourceEvent; - if (!event$1 || event$1.altKey) { - return {}; - } else { - // When dragging, snap only to touch targets.. - // (this excludes area fills and active drawing elements) - var d = event$1.target.__data__; - return (d && d.properties && d.properties.target) ? d : {}; - } - } + return isNaN(area) ? 0 : area; + }); + } + }); // Filter function to eliminate consecutive duplicates. + function noRepeatNodes(node, i, arr) { + return i === 0 || node !== arr[i - 1]; + } - function doMove(entity, nudge) { - nudge = nudge || [0, 0]; + // + // 1. Relation tagged with `type=multipolygon` and no interesting tags. + // 2. One and only one member with the `outer` role. Must be a way with interesting tags. + // 3. No members without a role. + // + // Old multipolygons are no longer recommended but are still rendered as areas by iD. - var currPoint = (event && event.point) || context.projection(_lastLoc); - var currMouse = geoVecSubtract(currPoint, nudge); - var loc = context.projection.invert(currMouse); + function osmOldMultipolygonOuterMemberOfRelation(entity, graph) { + if (entity.type !== 'relation' || !entity.isMultipolygon() || Object.keys(entity.tags).filter(osmIsInterestingTag).length > 1) { + return false; + } - if (!_nudgeInterval) { // If not nudging at the edge of the viewport, try to snap.. - // related code - // - `mode/drag_node.js` `doMove()` - // - `behavior/draw.js` `click()` - // - `behavior/draw_way.js` `move()` - var d = datum(); - var target = d && d.properties && d.properties.entity; - var targetLoc = target && target.loc; - var targetNodes = d && d.properties && d.properties.nodes; - var edge; + var outerMember; - if (targetLoc) { // snap to node/vertex - a point target with `.loc` - if (shouldSnapToNode(target)) { - loc = targetLoc; - } + for (var memberIndex in entity.members) { + var member = entity.members[memberIndex]; - } else if (targetNodes) { // snap to way - a line target with `.nodes` - edge = geoChooseEdge(targetNodes, context.map().mouse(), context.projection, end.id); - if (edge) { - loc = edge.loc; - } - } - } + if (!member.role || member.role === 'outer') { + if (outerMember) return false; + if (member.type !== 'way') return false; + if (!graph.hasEntity(member.id)) return false; + outerMember = graph.entity(member.id); - context.replace( - actionMoveNode(entity.id, loc) - ); + if (Object.keys(outerMember.tags).filter(osmIsInterestingTag).length === 0) { + return false; + } + } + } - // Below here: validations - var isInvalid = false; + return outerMember; + } // For fixing up rendering of multipolygons with tags on the outer member. + // https://github.com/openstreetmap/iD/issues/613 - // Check if this connection to `target` could cause relations to break.. - if (target) { - isInvalid = hasRelationConflict(entity, target, edge, context.graph()); - } + function osmIsOldMultipolygonOuterMember(entity, graph) { + if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0) { + return false; + } - // Check if this drag causes the geometry to break.. - if (!isInvalid) { - isInvalid = hasInvalidGeometry(entity, context.graph()); - } + var parents = graph.parentRelations(entity); + if (parents.length !== 1) return false; + var parent = parents[0]; + if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1) { + return false; + } - var nope = context.surface().classed('nope'); - if (isInvalid === 'relation' || isInvalid === 'restriction') { - if (!nope) { // about to nope - show hint - context.ui().flash - .duration(4000) - .text(_t('operations.connect.' + isInvalid, - { relation: _mainPresetIndex.item('type/restriction').name() } - ))(); - } - } else if (isInvalid) { - var errorID = isInvalid === 'line' ? 'lines' : 'areas'; - context.ui().flash - .duration(3000) - .text(_t('self_intersection.error.' + errorID))(); - } else { - if (nope) { // about to un-nope, remove hint - context.ui().flash - .duration(1) - .text('')(); - } - } + var members = parent.members, + member; + for (var i = 0; i < members.length; i++) { + member = members[i]; - var nopeDisabled = context.surface().classed('nope-disabled'); - if (nopeDisabled) { - context.surface() - .classed('nope', false) - .classed('nope-suppressed', isInvalid); - } else { - context.surface() - .classed('nope', isInvalid) - .classed('nope-suppressed', false); - } + if (member.id === entity.id && member.role && member.role !== 'outer') { + // Not outer member + return false; + } - _lastLoc = loc; + if (member.id !== entity.id && (!member.role || member.role === 'outer')) { + // Not a simple multipolygon + return false; } + } + return parent; + } + function osmOldMultipolygonOuterMember(entity, graph) { + if (entity.type !== 'way') return false; + var parents = graph.parentRelations(entity); + if (parents.length !== 1) return false; + var parent = parents[0]; + + if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1) { + return false; + } - // Uses `actionConnect.disabled()` to know whether this connection is ok.. - function hasRelationConflict(entity, target, edge, graph) { - var testGraph = graph.update(); // copy + var members = parent.members, + member, + outerMember; - // if snapping to way - add midpoint there and consider that the target.. - if (edge) { - var midpoint = osmNode(); - var action = actionAddMidpoint({ - loc: edge.loc, - edge: [target.nodes[edge.index - 1], target.nodes[edge.index]] - }, midpoint); + for (var i = 0; i < members.length; i++) { + member = members[i]; - testGraph = action(testGraph); - target = midpoint; - } + if (!member.role || member.role === 'outer') { + if (outerMember) return false; // Not a simple multipolygon - // can we connect to it? - var ids = [entity.id, target.id]; - return actionConnect(ids).disabled(testGraph); + outerMember = member; } + } + if (!outerMember) return false; + var outerEntity = graph.hasEntity(outerMember.id); - function hasInvalidGeometry(entity, graph) { - var parents = graph.parentWays(entity); - var i, j, k; + if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length) { + return false; + } - for (i = 0; i < parents.length; i++) { - var parent = parents[i]; - var nodes = []; - var activeIndex = null; // which multipolygon ring contains node being dragged - - // test any parent multipolygons for valid geometry - var relations = graph.parentRelations(parent); - for (j = 0; j < relations.length; j++) { - if (!relations[j].isMultipolygon()) { continue; } - - var rings = osmJoinWays(relations[j].members, graph); - - // find active ring and test it for self intersections - for (k = 0; k < rings.length; k++) { - nodes = rings[k].nodes; - if (nodes.find(function(n) { return n.id === entity.id; })) { - activeIndex = k; - if (geoHasSelfIntersections(nodes, entity.id)) { - return 'multipolygonMember'; - } - } - rings[k].coords = nodes.map(function(n) { return n.loc; }); - } + return outerEntity; + } // Join `toJoin` array into sequences of connecting ways. + // Segments which share identical start/end nodes will, as much as possible, + // be connected with each other. + // + // The return value is a nested array. Each constituent array contains elements + // of `toJoin` which have been determined to connect. + // + // Each consitituent array also has a `nodes` property whose value is an + // ordered array of member nodes, with appropriate order reversal and + // start/end coordinate de-duplication. + // + // Members of `toJoin` must have, at minimum, `type` and `id` properties. + // Thus either an array of `osmWay`s or a relation member array may be used. + // + // If an member is an `osmWay`, its tags and childnodes may be reversed via + // `actionReverse` in the output. + // + // The returned sequences array also has an `actions` array property, containing + // any reversal actions that should be applied to the graph, should the calling + // code attempt to actually join the given ways. + // + // Incomplete members (those for which `graph.hasEntity(element.id)` returns + // false) and non-way members are ignored. + // - // test active ring for intersections with other rings in the multipolygon - for (k = 0; k < rings.length; k++) { - if (k === activeIndex) { continue; } + function osmJoinWays(toJoin, graph) { + function resolve(member) { + return graph.childNodes(graph.entity(member.id)); + } - // make sure active ring doesnt cross passive rings - if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) { - return 'multipolygonRing'; - } - } - } + function reverse(item) { + var action = actionReverse(item.id, { + reverseOneway: true + }); + sequences.actions.push(action); + return item instanceof osmWay ? action(graph).entity(item.id) : item; + } // make a copy containing only the items to join - // If we still haven't tested this node's parent way for self-intersections. - // (because it's not a member of a multipolygon), test it now. - if (activeIndex === null) { - nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); }); - if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) { - return parent.geometry(graph); - } - } + toJoin = toJoin.filter(function (member) { + return member.type === 'way' && graph.hasEntity(member.id); + }); // Are the things we are joining relation members or `osmWays`? + // If `osmWays`, skip the "prefer a forward path" code below (see #4872) - } + var i; + var joinAsMembers = true; - return false; + for (i = 0; i < toJoin.length; i++) { + if (toJoin[i] instanceof osmWay) { + joinAsMembers = false; + break; } + } + + var sequences = []; + sequences.actions = []; + while (toJoin.length) { + // start a new sequence + var item = toJoin.shift(); + var currWays = [item]; + var currNodes = resolve(item).slice(); // add to it - function move(entity) { - if (_isCancelled) { return; } - event.sourceEvent.stopPropagation(); + while (toJoin.length) { + var start = currNodes[0]; + var end = currNodes[currNodes.length - 1]; + var fn = null; + var nodes = null; // Find the next way/member to join. + + for (i = 0; i < toJoin.length; i++) { + item = toJoin[i]; + nodes = resolve(item); // (for member ordering only, not way ordering - see #4872) + // Strongly prefer to generate a forward path that preserves the order + // of the members array. For multipolygons and most relations, member + // order does not matter - but for routes, it does. (see #4589) + // If we started this sequence backwards (i.e. next member way attaches to + // the start node and not the end node), reverse the initial way before continuing. + + if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end && (nodes[nodes.length - 1] === start || nodes[0] === start)) { + currWays[0] = reverse(currWays[0]); + currNodes.reverse(); + start = currNodes[0]; + end = currNodes[currNodes.length - 1]; + } + + if (nodes[0] === end) { + fn = currNodes.push; // join to end + + nodes = nodes.slice(1); + break; + } else if (nodes[nodes.length - 1] === end) { + fn = currNodes.push; // join to end - context.surface().classed('nope-disabled', event.sourceEvent.altKey); + nodes = nodes.slice(0, -1).reverse(); + item = reverse(item); + break; + } else if (nodes[nodes.length - 1] === start) { + fn = currNodes.unshift; // join to beginning - _lastLoc = context.projection.invert(event.point); + nodes = nodes.slice(0, -1); + break; + } else if (nodes[0] === start) { + fn = currNodes.unshift; // join to beginning - doMove(entity); - var nudge = geoViewportEdge(event.point, context.map().dimensions()); - if (nudge) { - startNudge(entity, nudge); + nodes = nodes.slice(1).reverse(); + item = reverse(item); + break; } else { - stopNudge(); + fn = nodes = null; } - } + } - function end(entity) { - if (_isCancelled) { return; } + if (!nodes) { + // couldn't find a joinable way/member + break; + } - var wasPoint = entity.geometry(context.graph()) === 'point'; + fn.apply(currWays, [item]); + fn.apply(currNodes, nodes); + toJoin.splice(i, 1); + } - var d = datum(); - var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope'); - var target = d && d.properties && d.properties.entity; // entity to snap to + currWays.nodes = currNodes; + sequences.push(currWays); + } - if (nope) { // bounce back - context.perform( - _actionBounceBack(entity.id, _startLoc) - ); + return sequences; + } - } else if (target && target.type === 'way') { - var choice = geoChooseEdge(context.graph().childNodes(target), context.map().mouse(), context.projection, entity.id); - context.replace( - actionAddMidpoint({ - loc: choice.loc, - edge: [target.nodes[choice.index - 1], target.nodes[choice.index]] - }, entity), - connectAnnotation(entity, target) - ); + function actionAddMember(relationId, member, memberIndex, insertPair) { + return function action(graph) { + var relation = graph.entity(relationId); // There are some special rules for Public Transport v2 routes. - } else if (target && target.type === 'node' && shouldSnapToNode(target)) { - context.replace( - actionConnect([target.id, entity.id]), - connectAnnotation(entity, target) - ); + var isPTv2 = /stop|platform/.test(member.role); - } else if (_wasMidpoint) { - context.replace( - actionNoop(), - _t('operations.add.annotation.vertex') - ); + if ((isNaN(memberIndex) || insertPair) && member.type === 'way' && !isPTv2) { + // Try to perform sensible inserts based on how the ways join together + graph = addWayMember(relation, graph); + } else { + // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes + // Stops and Platforms for PTv2 should be ordered first. + // hack: We do not currently have the ability to place them in the exactly correct order. + if (isPTv2 && isNaN(memberIndex)) { + memberIndex = 0; + } - } else { - context.replace( - actionNoop(), - moveAnnotation(entity) - ); - } + graph = graph.replace(relation.addMember(member, memberIndex)); + } - if (wasPoint) { - context.enter(modeSelect(context, [entity.id])); + return graph; + }; // Add a way member into the relation "wherever it makes sense". + // In this situation we were not supplied a memberIndex. - } else { - var reselection = _restoreSelectedIDs.filter(function(id) { - return context.graph().hasEntity(id); - }); + function addWayMember(relation, graph) { + var groups, tempWay, insertPairIsReversed, item, i, j, k; // remove PTv2 stops and platforms before doing anything. - if (reselection.length) { - context.enter(modeSelect(context, reselection)); - } else { - context.enter(modeBrowse(context)); - } - } - } + var PTv2members = []; + var members = []; + for (i = 0; i < relation.members.length; i++) { + var m = relation.members[i]; - function _actionBounceBack(nodeID, toLoc) { - var moveNode = actionMoveNode(nodeID, toLoc); - var action = function(graph, t) { - // last time through, pop off the bounceback perform. - // it will then overwrite the initial perform with a moveNode that does nothing - if (t === 1) { context.pop(); } - return moveNode(graph, t); - }; - action.transitionable = true; - return action; + if (/stop|platform/.test(m.role)) { + PTv2members.push(m); + } else { + members.push(m); + } } + relation = relation.update({ + members: members + }); - function cancel() { - drag.cancel(); - context.enter(modeBrowse(context)); + if (insertPair) { + // We're adding a member that must stay paired with an existing member. + // (This feature is used by `actionSplit`) + // + // This is tricky because the members may exist multiple times in the + // member list, and with different A-B/B-A ordering and different roles. + // (e.g. a bus route that loops out and back - #4589). + // + // Replace the existing member with a temporary way, + // so that `osmJoinWays` can treat the pair like a single way. + tempWay = osmWay({ + id: 'wTemp', + nodes: insertPair.nodes + }); + graph = graph.replace(tempWay); + var tempMember = { + id: tempWay.id, + type: 'way', + role: member.role + }; + var tempRelation = relation.replaceMember({ + id: insertPair.originalID + }, tempMember, true); + groups = utilArrayGroupBy(tempRelation.members, 'type'); + groups.way = groups.way || []; // Insert pair is reversed if the inserted way comes before the original one. + // (Except when they form a loop.) + + var originalWay = graph.entity(insertPair.originalID); + var insertedWay = graph.entity(insertPair.insertedID); + insertPairIsReversed = originalWay.nodes.length > 0 && insertedWay.nodes.length > 0 && insertedWay.nodes[insertedWay.nodes.length - 1] === originalWay.nodes[0] && originalWay.nodes[originalWay.nodes.length - 1] !== insertedWay.nodes[0]; + } else { + // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it. + groups = utilArrayGroupBy(relation.members, 'type'); + groups.way = groups.way || []; + groups.way.push(member); } + members = withIndex(groups.way); + var joined = osmJoinWays(members, graph); // `joined` might not contain all of the way members, + // But will contain only the completed (downloaded) members - var drag = behaviorDrag() - .selector('.layer-touch.points .target') - .surface(context.container().select('.main-map').node()) - .origin(origin) - .on('start', start) - .on('move', move) - .on('end', end); + for (i = 0; i < joined.length; i++) { + var segment = joined[i]; + var nodes = segment.nodes.slice(); + var startIndex = segment[0].index; // j = array index in `members` where this segment starts + for (j = 0; j < members.length; j++) { + if (members[j].index === startIndex) { + break; + } + } // k = each member in segment - mode.enter = function() { - context.install(hover); - context.install(edit); - - select(window) - .on('keydown.dragNode', keydown) - .on('keyup.dragNode', keyup); - context.history() - .on('undone.drag-node', cancel); - }; + for (k = 0; k < segment.length; k++) { + item = segment[k]; + var way = graph.entity(item.id); // If this is a paired item, generate members in correct order and role + if (tempWay && item.id === tempWay.id) { + var reverse = nodes[0].id !== insertPair.nodes[0] ^ insertPairIsReversed; - mode.exit = function() { - context.ui().sidebar.hover.cancel(); - context.uninstall(hover); - context.uninstall(edit); + if (reverse) { + item.pair = [{ + id: insertPair.insertedID, + type: 'way', + role: item.role + }, { + id: insertPair.originalID, + type: 'way', + role: item.role + }]; + } else { + item.pair = [{ + id: insertPair.originalID, + type: 'way', + role: item.role + }, { + id: insertPair.insertedID, + type: 'way', + role: item.role + }]; + } + } // reorder `members` if necessary - select(window) - .on('keydown.dragNode', null) - .on('keyup.dragNode', null); - context.history() - .on('undone.drag-node', null); + if (k > 0) { + if (j + k >= members.length || item.index !== members[j + k].index) { + moveMember(members, item.index, j + k); + } + } - _activeEntity = null; + nodes.splice(0, way.nodes.length - 1); + } + } - context.surface() - .classed('nope', false) - .classed('nope-suppressed', false) - .classed('nope-disabled', false) - .selectAll('.active') - .classed('active', false); + if (tempWay) { + graph = graph.remove(tempWay); + } // Final pass: skip dead items, split pairs, remove index properties - stopNudge(); - }; + var wayMembers = []; - mode.selectedIDs = function() { - if (!arguments.length) { return _activeEntity ? [_activeEntity.id] : []; } - // no assign - return mode; - }; + for (i = 0; i < members.length; i++) { + item = members[i]; + if (item.index === -1) continue; + if (item.pair) { + wayMembers.push(item.pair[0]); + wayMembers.push(item.pair[1]); + } else { + wayMembers.push(utilObjectOmit(item, ['index'])); + } + } // Put stops and platforms first, then nodes, ways, relations + // This is recommended for Public Transport v2 routes: + // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes - mode.activeID = function() { - if (!arguments.length) { return _activeEntity && _activeEntity.id; } - // no assign - return mode; - }; + var newMembers = PTv2members.concat(groups.node || [], wayMembers, groups.relation || []); + return graph.replace(relation.update({ + members: newMembers + })); // `moveMember()` changes the `members` array in place by splicing + // the item with `.index = findIndex` to where it belongs, + // and marking the old position as "dead" with `.index = -1` + // + // j=5, k=0 jk + // segment 5 4 7 6 + // members 0 1 2 3 4 5 6 7 8 9 keep 5 in j+k + // + // j=5, k=1 j k + // segment 5 4 7 6 + // members 0 1 2 3 4 5 6 7 8 9 move 4 to j+k + // members 0 1 2 3 x 5 4 6 7 8 9 moved + // + // j=5, k=2 j k + // segment 5 4 7 6 + // members 0 1 2 3 x 5 4 6 7 8 9 move 7 to j+k + // members 0 1 2 3 x 5 4 7 6 x 8 9 moved + // + // j=5, k=3 j k + // segment 5 4 7 6 + // members 0 1 2 3 x 5 4 7 6 x 8 9 keep 6 in j+k + // - mode.restoreSelectedIDs = function(_) { - if (!arguments.length) { return _restoreSelectedIDs; } - _restoreSelectedIDs = _; - return mode; - }; + function moveMember(arr, findIndex, toIndex) { + var i; + for (i = 0; i < arr.length; i++) { + if (arr[i].index === findIndex) { + break; + } + } - mode.behavior = drag; + var item = Object.assign({}, arr[i]); // shallow copy + arr[i].index = -1; // mark as dead - return mode; - } + item.index = toIndex; + arr.splice(toIndex, 0, item); + } // This is the same as `Relation.indexedMembers`, + // Except we don't want to index all the members, only the ways - function quickselect(arr, k, left, right, compare) { - quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare); - } - function quickselectStep(arr, k, left, right, compare) { + function withIndex(arr) { + var result = new Array(arr.length); - while (right > left) { - if (right - left > 600) { - var n = right - left + 1; - var m = k - left + 1; - var z = Math.log(n); - var s = 0.5 * Math.exp(2 * z / 3); - var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); - var newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); - var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); - quickselectStep(arr, k, newLeft, newRight, compare); - } + for (var i = 0; i < arr.length; i++) { + result[i] = Object.assign({}, arr[i]); // shallow copy - var t = arr[k]; - var i = left; - var j = right; + result[i].index = i; + } - swap(arr, left, k); - if (compare(arr[right], t) > 0) { swap(arr, left, right); } + return result; + } + } + } - while (i < j) { - swap(arr, i, j); - i++; - j--; - while (compare(arr[i], t) < 0) { i++; } - while (compare(arr[j], t) > 0) { j--; } - } + function actionAddMidpoint(midpoint, node) { + return function (graph) { + graph = graph.replace(node.move(midpoint.loc)); + var parents = utilArrayIntersection(graph.parentWays(graph.entity(midpoint.edge[0])), graph.parentWays(graph.entity(midpoint.edge[1]))); + parents.forEach(function (way) { + for (var i = 0; i < way.nodes.length - 1; i++) { + if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) { + graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1)); // Add only one midpoint on doubled-back segments, + // turning them into self-intersections. - if (compare(arr[left], t) === 0) { swap(arr, left, j); } - else { - j++; - swap(arr, j, right); + return; } - - if (j <= k) { left = j + 1; } - if (k <= j) { right = j - 1; } - } + } + }); + return graph; + }; } - function swap(arr, i, j) { - var tmp = arr[i]; - arr[i] = arr[j]; - arr[j] = tmp; + // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as + function actionAddVertex(wayId, nodeId, index) { + return function (graph) { + return graph.replace(graph.entity(wayId).addNode(nodeId, index)); + }; } - function defaultCompare(a, b) { - return a < b ? -1 : a > b ? 1 : 0; + function actionChangeMember(relationId, member, memberIndex) { + return function (graph) { + return graph.replace(graph.entity(relationId).updateMember(member, memberIndex)); + }; } - var RBush = function RBush(maxEntries) { - if ( maxEntries === void 0 ) maxEntries = 9; - - // max entries in a node is 9 by default; min node fill is 40% for best performance - this._maxEntries = Math.max(4, maxEntries); - this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4)); - this.clear(); - }; - - RBush.prototype.all = function all () { - return this._all(this.data, []); - }; + function actionChangePreset(entityID, oldPreset, newPreset, skipFieldDefaults) { + return function action(graph) { + var entity = graph.entity(entityID); + var geometry = entity.geometry(graph); + var tags = entity.tags; // preserve tags that the new preset might care about, if any - RBush.prototype.search = function search (bbox) { - var node = this.data; - var result = []; + if (oldPreset) tags = oldPreset.unsetTags(tags, geometry, newPreset && newPreset.addTags ? Object.keys(newPreset.addTags) : null); + if (newPreset) tags = newPreset.setTags(tags, geometry, skipFieldDefaults); + return graph.replace(entity.update({ + tags: tags + })); + }; + } - if (!intersects(bbox, node)) { return result; } + function actionChangeTags(entityId, tags) { + return function (graph) { + var entity = graph.entity(entityId); + return graph.replace(entity.update({ + tags: tags + })); + }; + } - var toBBox = this.toBBox; - var nodesToSearch = []; + function osmNode() { + if (!(this instanceof osmNode)) { + return new osmNode().initialize(arguments); + } else if (arguments.length) { + this.initialize(arguments); + } + } + osmEntity.node = osmNode; + osmNode.prototype = Object.create(osmEntity.prototype); + Object.assign(osmNode.prototype, { + type: 'node', + loc: [9999, 9999], + extent: function extent() { + return new geoExtent(this.loc); + }, + geometry: function geometry(graph) { + return graph["transient"](this, 'geometry', function () { + return graph.isPoi(this) ? 'point' : 'vertex'; + }); + }, + move: function move(loc) { + return this.update({ + loc: loc + }); + }, + isDegenerate: function isDegenerate() { + return !(Array.isArray(this.loc) && this.loc.length === 2 && this.loc[0] >= -180 && this.loc[0] <= 180 && this.loc[1] >= -90 && this.loc[1] <= 90); + }, + // Inspect tags and geometry to determine which direction(s) this node/vertex points + directions: function directions(resolver, projection) { + var val; + var i; // which tag to use? + + if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') { + // all-way stop tag on a highway intersection + val = 'all'; + } else { + // generic direction tag + val = (this.tags.direction || '').toLowerCase(); // better suffix-style direction tag - while (node) { - for (var i = 0; i < node.children.length; i++) { - var child = node.children[i]; - var childBBox = node.leaf ? toBBox(child) : child; + var re = /:direction$/i; + var keys = Object.keys(this.tags); - if (intersects(bbox, childBBox)) { - if (node.leaf) { result.push(child); } - else if (contains$1(bbox, childBBox)) { this._all(child, result); } - else { nodesToSearch.push(child); } - } + for (i = 0; i < keys.length; i++) { + if (re.test(keys[i])) { + val = this.tags[keys[i]].toLowerCase(); + break; } - node = nodesToSearch.pop(); + } } - return result; - }; - - RBush.prototype.collides = function collides (bbox) { - var node = this.data; + if (val === '') return []; + var cardinal = { + north: 0, + n: 0, + northnortheast: 22, + nne: 22, + northeast: 45, + ne: 45, + eastnortheast: 67, + ene: 67, + east: 90, + e: 90, + eastsoutheast: 112, + ese: 112, + southeast: 135, + se: 135, + southsoutheast: 157, + sse: 157, + south: 180, + s: 180, + southsouthwest: 202, + ssw: 202, + southwest: 225, + sw: 225, + westsouthwest: 247, + wsw: 247, + west: 270, + w: 270, + westnorthwest: 292, + wnw: 292, + northwest: 315, + nw: 315, + northnorthwest: 337, + nnw: 337 + }; + var values = val.split(';'); + var results = []; + values.forEach(function (v) { + // swap cardinal for numeric directions + if (cardinal[v] !== undefined) { + v = cardinal[v]; + } // numeric direction - just add to results - if (!intersects(bbox, node)) { return false; } - var nodesToSearch = []; - while (node) { - for (var i = 0; i < node.children.length; i++) { - var child = node.children[i]; - var childBBox = node.leaf ? this.toBBox(child) : child; + if (v !== '' && !isNaN(+v)) { + results.push(+v); + return; + } // string direction - inspect parent ways - if (intersects(bbox, childBBox)) { - if (node.leaf || contains$1(bbox, childBBox)) { return true; } - nodesToSearch.push(child); - } - } - node = nodesToSearch.pop(); - } - return false; - }; + var lookBackward = this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all'; + var lookForward = this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all'; + if (!lookForward && !lookBackward) return; + var nodeIds = {}; + resolver.parentWays(this).forEach(function (parent) { + var nodes = parent.nodes; - RBush.prototype.load = function load (data) { - if (!(data && data.length)) { return this; } + for (i = 0; i < nodes.length; i++) { + if (nodes[i] === this.id) { + // match current entity + if (lookForward && i > 0) { + nodeIds[nodes[i - 1]] = true; // look back to prev node + } - if (data.length < this._minEntries) { - for (var i = 0; i < data.length; i++) { - this.insert(data[i]); + if (lookBackward && i < nodes.length - 1) { + nodeIds[nodes[i + 1]] = true; // look ahead to next node + } + } } - return this; - } - - // recursively build the tree with the given data from scratch using OMT algorithm - var node = this._build(data.slice(), 0, data.length - 1, 0); - - if (!this.data.children.length) { - // save as is if tree is empty - this.data = node; - - } else if (this.data.height === node.height) { - // split root if trees have the same height - this._splitRoot(this.data, node); + }, this); + Object.keys(nodeIds).forEach(function (nodeId) { + // +90 because geoAngle returns angle from X axis, not Y (north) + results.push(geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI) + 90); + }, this); + }, this); + return utilArrayUniq(results); + }, + isCrossing: function isCrossing() { + return this.tags.highway === 'crossing' || this.tags.railway && this.tags.railway.indexOf('crossing') !== -1; + }, + isEndpoint: function isEndpoint(resolver) { + return resolver["transient"](this, 'isEndpoint', function () { + var id = this.id; + return resolver.parentWays(this).filter(function (parent) { + return !parent.isClosed() && !!parent.affix(id); + }).length > 0; + }); + }, + isConnected: function isConnected(resolver) { + return resolver["transient"](this, 'isConnected', function () { + var parents = resolver.parentWays(this); - } else { - if (this.data.height < node.height) { - // swap trees if inserted one is bigger - var tmpNode = this.data; - this.data = node; - node = tmpNode; + if (parents.length > 1) { + // vertex is connected to multiple parent ways + for (var i in parents) { + if (parents[i].geometry(resolver) === 'line' && parents[i].hasInterestingTags()) return true; } + } else if (parents.length === 1) { + var way = parents[0]; + var nodes = way.nodes.slice(); - // insert the small tree into the large tree at appropriate level - this._insert(node, this.data.height - node.height - 1, true); - } - - return this; - }; - - RBush.prototype.insert = function insert (item) { - if (item) { this._insert(item, this.data.height - 1); } - return this; - }; - - RBush.prototype.clear = function clear () { - this.data = createNode([]); - return this; - }; - - RBush.prototype.remove = function remove (item, equalsFn) { - if (!item) { return this; } - - var node = this.data; - var bbox = this.toBBox(item); - var path = []; - var indexes = []; - var i, parent, goingUp; - - // depth-first iterative tree traversal - while (node || path.length) { + if (way.isClosed()) { + nodes.pop(); + } // ignore connecting node if closed + // return true if vertex appears multiple times (way is self intersecting) - if (!node) { // go up - node = path.pop(); - parent = path[path.length - 1]; - i = indexes.pop(); - goingUp = true; - } - if (node.leaf) { // check current node - var index = findItem(item, node.children, equalsFn); + return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id); + } - if (index !== -1) { - // item found, remove the item and condense tree upwards - node.children.splice(index, 1); - path.push(node); - this._condense(path); - return this; + return false; + }); + }, + parentIntersectionWays: function parentIntersectionWays(resolver) { + return resolver["transient"](this, 'parentIntersectionWays', function () { + return resolver.parentWays(this).filter(function (parent) { + return (parent.tags.highway || parent.tags.waterway || parent.tags.railway || parent.tags.aeroway) && parent.geometry(resolver) === 'line'; + }); + }); + }, + isIntersection: function isIntersection(resolver) { + return this.parentIntersectionWays(resolver).length > 1; + }, + isHighwayIntersection: function isHighwayIntersection(resolver) { + return resolver["transient"](this, 'isHighwayIntersection', function () { + return resolver.parentWays(this).filter(function (parent) { + return parent.tags.highway && parent.geometry(resolver) === 'line'; + }).length > 1; + }); + }, + isOnAddressLine: function isOnAddressLine(resolver) { + return resolver["transient"](this, 'isOnAddressLine', function () { + return resolver.parentWays(this).filter(function (parent) { + return parent.tags.hasOwnProperty('addr:interpolation') && parent.geometry(resolver) === 'line'; + }).length > 0; + }); + }, + asJXON: function asJXON(changeset_id) { + var r = { + node: { + '@id': this.osmId(), + '@lon': this.loc[0], + '@lat': this.loc[1], + '@version': this.version || 0, + tag: Object.keys(this.tags).map(function (k) { + return { + keyAttributes: { + k: k, + v: this.tags[k] } - } - - if (!goingUp && !node.leaf && contains$1(node, bbox)) { // go down - path.push(node); - indexes.push(i); - i = 0; - parent = node; - node = node.children[0]; + }; + }, this) + } + }; + if (changeset_id) r.node['@changeset'] = changeset_id; + return r; + }, + asGeoJSON: function asGeoJSON() { + return { + type: 'Point', + coordinates: this.loc + }; + } + }); - } else if (parent) { // go right - i++; - node = parent.children[i]; - goingUp = false; + function actionCircularize(wayId, projection, maxAngle) { + maxAngle = (maxAngle || 20) * Math.PI / 180; + + var action = function action(graph, t) { + if (t === null || !isFinite(t)) t = 1; + t = Math.min(Math.max(+t, 0), 1); + var way = graph.entity(wayId); + var origNodes = {}; + graph.childNodes(way).forEach(function (node) { + if (!origNodes[node.id]) origNodes[node.id] = node; + }); - } else { node = null; } // nothing found + if (!way.isConvex(graph)) { + graph = action.makeConvex(graph); } - return this; - }; - - RBush.prototype.toBBox = function toBBox (item) { return item; }; - - RBush.prototype.compareMinX = function compareMinX (a, b) { return a.minX - b.minX; }; - RBush.prototype.compareMinY = function compareMinY (a, b) { return a.minY - b.minY; }; + var nodes = utilArrayUniq(graph.childNodes(way)); + var keyNodes = nodes.filter(function (n) { + return graph.parentWays(n).length !== 1; + }); + var points = nodes.map(function (n) { + return projection(n.loc); + }); + var keyPoints = keyNodes.map(function (n) { + return projection(n.loc); + }); + var centroid = points.length === 2 ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points); + var radius = d3_median(points, function (p) { + return geoVecLength(centroid, p); + }); + var sign = d3_polygonArea(points) > 0 ? 1 : -1; + var ids, i, j, k; // we need at least two key nodes for the algorithm to work + + if (!keyNodes.length) { + keyNodes = [nodes[0]]; + keyPoints = [points[0]]; + } + + if (keyNodes.length === 1) { + var index = nodes.indexOf(keyNodes[0]); + var oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length); + keyNodes.push(nodes[oppositeIndex]); + keyPoints.push(points[oppositeIndex]); + } // key points and nodes are those connected to the ways, + // they are projected onto the circle, in between nodes are moved + // to constant intervals between key nodes, extra in between nodes are + // added if necessary. + + + for (i = 0; i < keyPoints.length; i++) { + var nextKeyNodeIndex = (i + 1) % keyNodes.length; + var startNode = keyNodes[i]; + var endNode = keyNodes[nextKeyNodeIndex]; + var startNodeIndex = nodes.indexOf(startNode); + var endNodeIndex = nodes.indexOf(endNode); + var numberNewPoints = -1; + var indexRange = endNodeIndex - startNodeIndex; + var nearNodes = {}; + var inBetweenNodes = []; + var startAngle, endAngle, totalAngle, eachAngle; + var angle, loc, node, origNode; + + if (indexRange < 0) { + indexRange += nodes.length; + } // position this key node + + + var distance = geoVecLength(centroid, keyPoints[i]) || 1e-4; + keyPoints[i] = [centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius, centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius]; + loc = projection.invert(keyPoints[i]); + node = keyNodes[i]; + origNode = origNodes[node.id]; + node = node.move(geoVecInterp(origNode.loc, loc, t)); + graph = graph.replace(node); // figure out the between delta angle we want to match to + + startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]); + endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]); + totalAngle = endAngle - startAngle; // detects looping around -pi/pi + + if (totalAngle * sign > 0) { + totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle)); + } - RBush.prototype.toJSON = function toJSON () { return this.data; }; + do { + numberNewPoints++; + eachAngle = totalAngle / (indexRange + numberNewPoints); + } while (Math.abs(eachAngle) > maxAngle); // move existing nodes - RBush.prototype.fromJSON = function fromJSON (data) { - this.data = data; - return this; - }; - RBush.prototype._all = function _all (node, result) { - var nodesToSearch = []; - while (node) { - if (node.leaf) { result.push.apply(result, node.children); } - else { nodesToSearch.push.apply(nodesToSearch, node.children); } + for (j = 1; j < indexRange; j++) { + angle = startAngle + j * eachAngle; + loc = projection.invert([centroid[0] + Math.cos(angle) * radius, centroid[1] + Math.sin(angle) * radius]); + node = nodes[(j + startNodeIndex) % nodes.length]; + origNode = origNodes[node.id]; + nearNodes[node.id] = angle; + node = node.move(geoVecInterp(origNode.loc, loc, t)); + graph = graph.replace(node); + } // add new in between nodes if necessary - node = nodesToSearch.pop(); - } - return result; - }; - RBush.prototype._build = function _build (items, left, right, height) { + for (j = 0; j < numberNewPoints; j++) { + angle = startAngle + (indexRange + j) * eachAngle; + loc = projection.invert([centroid[0] + Math.cos(angle) * radius, centroid[1] + Math.sin(angle) * radius]); // choose a nearnode to use as the original - var N = right - left + 1; - var M = this._maxEntries; - var node; + var min = Infinity; - if (N <= M) { - // reached leaf level; return leaf - node = createNode(items.slice(left, right + 1)); - calcBBox(node, this.toBBox); - return node; - } + for (var nodeId in nearNodes) { + var nearAngle = nearNodes[nodeId]; + var dist = Math.abs(nearAngle - angle); - if (!height) { - // target height of the bulk-loaded tree - height = Math.ceil(Math.log(N) / Math.log(M)); + if (dist < min) { + min = dist; + origNode = origNodes[nodeId]; + } + } - // target number of root entries to maximize storage utilization - M = Math.ceil(N / Math.pow(M, height - 1)); - } + node = osmNode({ + loc: geoVecInterp(origNode.loc, loc, t) + }); + graph = graph.replace(node); + nodes.splice(endNodeIndex + j, 0, node); + inBetweenNodes.push(node.id); + } // Check for other ways that share these keyNodes.. + // If keyNodes are adjacent in both ways, + // we can add inBetweenNodes to that shared way too.. - node = createNode([]); - node.leaf = false; - node.height = height; - // split the items into M mostly square tiles + if (indexRange === 1 && inBetweenNodes.length) { + var startIndex1 = way.nodes.lastIndexOf(startNode.id); + var endIndex1 = way.nodes.lastIndexOf(endNode.id); + var wayDirection1 = endIndex1 - startIndex1; - var N2 = Math.ceil(N / M); - var N1 = N2 * Math.ceil(Math.sqrt(M)); + if (wayDirection1 < -1) { + wayDirection1 = 1; + } - multiSelect(items, left, right, N1, this.compareMinX); + var parentWays = graph.parentWays(keyNodes[i]); - for (var i = left; i <= right; i += N1) { + for (j = 0; j < parentWays.length; j++) { + var sharedWay = parentWays[j]; + if (sharedWay === way) continue; - var right2 = Math.min(i + N1 - 1, right); + if (sharedWay.areAdjacent(startNode.id, endNode.id)) { + var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id); + var endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id); + var wayDirection2 = endIndex2 - startIndex2; + var insertAt = endIndex2; - multiSelect(items, i, right2, N2, this.compareMinY); + if (wayDirection2 < -1) { + wayDirection2 = 1; + } - for (var j = i; j <= right2; j += N2) { + if (wayDirection1 !== wayDirection2) { + inBetweenNodes.reverse(); + insertAt = startIndex2; + } - var right3 = Math.min(j + N2 - 1, right2); + for (k = 0; k < inBetweenNodes.length; k++) { + sharedWay = sharedWay.addNode(inBetweenNodes[k], insertAt + k); + } - // pack each entry recursively - node.children.push(this._build(items, j, right3, height - 1)); + graph = graph.replace(sharedWay); + } } - } + } + } // update the way to have all the new nodes - calcBBox(node, this.toBBox); - return node; - }; + ids = nodes.map(function (n) { + return n.id; + }); + ids.push(ids[0]); + way = way.update({ + nodes: ids + }); + graph = graph.replace(way); + return graph; + }; - RBush.prototype._chooseSubtree = function _chooseSubtree (bbox, node, level, path) { - while (true) { - path.push(node); + action.makeConvex = function (graph) { + var way = graph.entity(wayId); + var nodes = utilArrayUniq(graph.childNodes(way)); + var points = nodes.map(function (n) { + return projection(n.loc); + }); + var sign = d3_polygonArea(points) > 0 ? 1 : -1; + var hull = d3_polygonHull(points); + var i, j; // D3 convex hulls go counterclockwise.. + + if (sign === -1) { + nodes.reverse(); + points.reverse(); + } - if (node.leaf || path.length - 1 === level) { break; } + for (i = 0; i < hull.length - 1; i++) { + var startIndex = points.indexOf(hull[i]); + var endIndex = points.indexOf(hull[i + 1]); + var indexRange = endIndex - startIndex; - var minArea = Infinity; - var minEnlargement = Infinity; - var targetNode = (void 0); + if (indexRange < 0) { + indexRange += nodes.length; + } // move interior nodes to the surface of the convex hull.. - for (var i = 0; i < node.children.length; i++) { - var child = node.children[i]; - var area = bboxArea(child); - var enlargement = enlargedArea(bbox, child) - area; - - // choose entry with the least area enlargement - if (enlargement < minEnlargement) { - minEnlargement = enlargement; - minArea = area < minArea ? area : minArea; - targetNode = child; - - } else if (enlargement === minEnlargement) { - // otherwise choose one with the smallest area - if (area < minArea) { - minArea = area; - targetNode = child; - } - } - } - node = targetNode || node.children[0]; + for (j = 1; j < indexRange; j++) { + var point = geoVecInterp(hull[i], hull[i + 1], j / indexRange); + var node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point)); + graph = graph.replace(node); + } } - return node; - }; + return graph; + }; - RBush.prototype._insert = function _insert (item, level, isNode) { - var bbox = isNode ? item : this.toBBox(item); - var insertPath = []; + action.disabled = function (graph) { + if (!graph.entity(wayId).isClosed()) { + return 'not_closed'; + } //disable when already circular - // find the best node for accommodating the item, saving all nodes along the path too - var node = this._chooseSubtree(bbox, this.data, level, insertPath); - // put the item into the node - node.children.push(item); - extend$1(node, bbox); + var way = graph.entity(wayId); + var nodes = utilArrayUniq(graph.childNodes(way)); + var points = nodes.map(function (n) { + return projection(n.loc); + }); + var hull = d3_polygonHull(points); + var epsilonAngle = Math.PI / 180; - // split on node overflow; propagate upwards if necessary - while (level >= 0) { - if (insertPath[level].children.length > this._maxEntries) { - this._split(insertPath, level); - level--; - } else { break; } + if (hull.length !== points.length || hull.length < 3) { + return false; } - // adjust bboxes along the insertion path - this._adjustParentBBoxes(bbox, insertPath, level); - }; - - // split overflowed node into two - RBush.prototype._split = function _split (insertPath, level) { - var node = insertPath[level]; - var M = node.children.length; - var m = this._minEntries; + var centroid = d3_polygonCentroid(points); + var radius = geoVecLengthSquare(centroid, points[0]); + var i, actualPoint; // compare distances between centroid and points - this._chooseSplitAxis(node, m, M); + for (i = 0; i < hull.length; i++) { + actualPoint = hull[i]; + var actualDist = geoVecLengthSquare(actualPoint, centroid); + var diff = Math.abs(actualDist - radius); //compare distances with epsilon-error (5%) - var splitIndex = this._chooseSplitIndex(node, m, M); + if (diff > 0.05 * radius) { + return false; + } + } //check if central angles are smaller than maxAngle - var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex)); - newNode.height = node.height; - newNode.leaf = node.leaf; - calcBBox(node, this.toBBox); - calcBBox(newNode, this.toBBox); + for (i = 0; i < hull.length; i++) { + actualPoint = hull[i]; + var nextPoint = hull[(i + 1) % hull.length]; + var startAngle = Math.atan2(actualPoint[1] - centroid[1], actualPoint[0] - centroid[0]); + var endAngle = Math.atan2(nextPoint[1] - centroid[1], nextPoint[0] - centroid[0]); + var angle = endAngle - startAngle; - if (level) { insertPath[level - 1].children.push(newNode); } - else { this._splitRoot(node, newNode); } - }; + if (angle < 0) { + angle = -angle; + } - RBush.prototype._splitRoot = function _splitRoot (node, newNode) { - // split root node - this.data = createNode([node, newNode]); - this.data.height = node.height + 1; - this.data.leaf = false; - calcBBox(this.data, this.toBBox); - }; + if (angle > Math.PI) { + angle = 2 * Math.PI - angle; + } - RBush.prototype._chooseSplitIndex = function _chooseSplitIndex (node, m, M) { - var index; - var minOverlap = Infinity; - var minArea = Infinity; + if (angle > maxAngle + epsilonAngle) { + return false; + } + } - for (var i = m; i <= M - m; i++) { - var bbox1 = distBBox(node, 0, i, this.toBBox); - var bbox2 = distBBox(node, i, M, this.toBBox); + return 'already_circular'; + }; - var overlap = intersectionArea(bbox1, bbox2); - var area = bboxArea(bbox1) + bboxArea(bbox2); + action.transitionable = true; + return action; + } - // choose distribution with minimum overlap - if (overlap < minOverlap) { - minOverlap = overlap; - index = i; + function actionDeleteWay(wayID) { + function canDeleteNode(node, graph) { + // don't delete nodes still attached to ways or relations + if (graph.parentWays(node).length || graph.parentRelations(node).length) return false; + var geometries = osmNodeGeometriesForTags(node.tags); // don't delete if this node can be a standalone point - minArea = area < minArea ? area : minArea; + if (geometries.point) return false; // delete if this node only be a vertex - } else if (overlap === minOverlap) { - // otherwise choose distribution with minimum area - if (area < minArea) { - minArea = area; - index = i; - } - } - } + if (geometries.vertex) return true; // iD doesn't know if this should be a point or vertex, + // so only delete if there are no interesting tags - return index || M - m; - }; + return !node.hasInterestingTags(); + } - // sorts node children by the best axis for split - RBush.prototype._chooseSplitAxis = function _chooseSplitAxis (node, m, M) { - var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX; - var compareMinY = node.leaf ? this.compareMinY : compareNodeMinY; - var xMargin = this._allDistMargin(node, m, M, compareMinX); - var yMargin = this._allDistMargin(node, m, M, compareMinY); + var action = function action(graph) { + var way = graph.entity(wayID); + graph.parentRelations(way).forEach(function (parent) { + parent = parent.removeMembersWithID(wayID); + graph = graph.replace(parent); - // if total distributions margin value is minimal for x, sort by minX, - // otherwise it's already sorted by minY - if (xMargin < yMargin) { node.children.sort(compareMinX); } - }; + if (parent.isDegenerate()) { + graph = actionDeleteRelation(parent.id)(graph); + } + }); + new Set(way.nodes).forEach(function (nodeID) { + graph = graph.replace(way.removeNode(nodeID)); + var node = graph.entity(nodeID); - // total margin of all possible split distributions where each node is at least m full - RBush.prototype._allDistMargin = function _allDistMargin (node, m, M, compare) { - node.children.sort(compare); + if (canDeleteNode(node, graph)) { + graph = graph.remove(node); + } + }); + return graph.remove(way); + }; - var toBBox = this.toBBox; - var leftBBox = distBBox(node, 0, m, toBBox); - var rightBBox = distBBox(node, M - m, M, toBBox); - var margin = bboxMargin(leftBBox) + bboxMargin(rightBBox); + return action; + } - for (var i = m; i < M - m; i++) { - var child = node.children[i]; - extend$1(leftBBox, node.leaf ? toBBox(child) : child); - margin += bboxMargin(leftBBox); - } + function actionDeleteMultiple(ids) { + var actions = { + way: actionDeleteWay, + node: actionDeleteNode, + relation: actionDeleteRelation + }; - for (var i$1 = M - m - 1; i$1 >= m; i$1--) { - var child$1 = node.children[i$1]; - extend$1(rightBBox, node.leaf ? toBBox(child$1) : child$1); - margin += bboxMargin(rightBBox); - } + var action = function action(graph) { + ids.forEach(function (id) { + if (graph.hasEntity(id)) { + // It may have been deleted already. + graph = actions[graph.entity(id).type](id)(graph); + } + }); + return graph; + }; - return margin; - }; + return action; + } - RBush.prototype._adjustParentBBoxes = function _adjustParentBBoxes (bbox, path, level) { - // adjust bboxes along the given tree path - for (var i = level; i >= 0; i--) { - extend$1(path[i], bbox); - } - }; + function actionDeleteRelation(relationID, allowUntaggedMembers) { + function canDeleteEntity(entity, graph) { + return !graph.parentWays(entity).length && !graph.parentRelations(entity).length && !entity.hasInterestingTags() && !allowUntaggedMembers; + } - RBush.prototype._condense = function _condense (path) { - // go through the path, removing empty nodes and updating bboxes - for (var i = path.length - 1, siblings = (void 0); i >= 0; i--) { - if (path[i].children.length === 0) { - if (i > 0) { - siblings = path[i - 1].children; - siblings.splice(siblings.indexOf(path[i]), 1); + var action = function action(graph) { + var relation = graph.entity(relationID); + graph.parentRelations(relation).forEach(function (parent) { + parent = parent.removeMembersWithID(relationID); + graph = graph.replace(parent); - } else { this.clear(); } + if (parent.isDegenerate()) { + graph = actionDeleteRelation(parent.id)(graph); + } + }); + var memberIDs = utilArrayUniq(relation.members.map(function (m) { + return m.id; + })); + memberIDs.forEach(function (memberID) { + graph = graph.replace(relation.removeMembersWithID(memberID)); + var entity = graph.entity(memberID); + + if (canDeleteEntity(entity, graph)) { + graph = actionDeleteMultiple([memberID])(graph); + } + }); + return graph.remove(relation); + }; - } else { calcBBox(path[i], this.toBBox); } - } - }; + return action; + } - function findItem(item, items, equalsFn) { - if (!equalsFn) { return items.indexOf(item); } + function actionDeleteNode(nodeId) { + var action = function action(graph) { + var node = graph.entity(nodeId); + graph.parentWays(node).forEach(function (parent) { + parent = parent.removeNode(nodeId); + graph = graph.replace(parent); + + if (parent.isDegenerate()) { + graph = actionDeleteWay(parent.id)(graph); + } + }); + graph.parentRelations(node).forEach(function (parent) { + parent = parent.removeMembersWithID(nodeId); + graph = graph.replace(parent); - for (var i = 0; i < items.length; i++) { - if (equalsFn(item, items[i])) { return i; } - } - return -1; - } + if (parent.isDegenerate()) { + graph = actionDeleteRelation(parent.id)(graph); + } + }); + return graph.remove(node); + }; - // calculate node's bbox from bboxes of its children - function calcBBox(node, toBBox) { - distBBox(node, 0, node.children.length, toBBox, node); + return action; } - // min bounding rectangle of node children from k to p-1 - function distBBox(node, k, p, toBBox, destNode) { - if (!destNode) { destNode = createNode(null); } - destNode.minX = Infinity; - destNode.minY = Infinity; - destNode.maxX = -Infinity; - destNode.maxY = -Infinity; + // + // First choose a node to be the survivor, with preference given + // to the oldest existing (not new) and "interesting" node. + // + // Tags and relation memberships of of non-surviving nodes are merged + // to the survivor. + // + // This is the inverse of `iD.actionDisconnect`. + // + // Reference: + // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as + // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java + // - for (var i = k; i < p; i++) { - var child = node.children[i]; - extend$1(destNode, node.leaf ? toBBox(child) : child); - } + function actionConnect(nodeIDs) { + var action = function action(graph) { + var survivor; + var node; + var parents; + var i, j; // Select the node with the ID passed as parameter if it is in the list, + // otherwise select the node with the oldest ID as the survivor, or the + // last one if there are only new nodes. - return destNode; - } + nodeIDs.reverse(); + var interestingIDs = []; - function extend$1(a, b) { - a.minX = Math.min(a.minX, b.minX); - a.minY = Math.min(a.minY, b.minY); - a.maxX = Math.max(a.maxX, b.maxX); - a.maxY = Math.max(a.maxY, b.maxY); - return a; - } + for (i = 0; i < nodeIDs.length; i++) { + node = graph.entity(nodeIDs[i]); - function compareNodeMinX(a, b) { return a.minX - b.minX; } - function compareNodeMinY(a, b) { return a.minY - b.minY; } + if (node.hasInterestingTags()) { + if (!node.isNew()) { + interestingIDs.push(node.id); + } + } + } - function bboxArea(a) { return (a.maxX - a.minX) * (a.maxY - a.minY); } - function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); } + survivor = graph.entity(utilOldestID(interestingIDs.length > 0 ? interestingIDs : nodeIDs)); // Replace all non-surviving nodes with the survivor and merge tags. - function enlargedArea(a, b) { - return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) * - (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY)); - } + for (i = 0; i < nodeIDs.length; i++) { + node = graph.entity(nodeIDs[i]); + if (node.id === survivor.id) continue; + parents = graph.parentWays(node); - function intersectionArea(a, b) { - var minX = Math.max(a.minX, b.minX); - var minY = Math.max(a.minY, b.minY); - var maxX = Math.min(a.maxX, b.maxX); - var maxY = Math.min(a.maxY, b.maxY); + for (j = 0; j < parents.length; j++) { + graph = graph.replace(parents[j].replaceNode(node.id, survivor.id)); + } - return Math.max(0, maxX - minX) * - Math.max(0, maxY - minY); - } + parents = graph.parentRelations(node); - function contains$1(a, b) { - return a.minX <= b.minX && - a.minY <= b.minY && - b.maxX <= a.maxX && - b.maxY <= a.maxY; - } + for (j = 0; j < parents.length; j++) { + graph = graph.replace(parents[j].replaceMember(node, survivor)); + } - function intersects(a, b) { - return b.minX <= a.maxX && - b.minY <= a.maxY && - b.maxX >= a.minX && - b.maxY >= a.minY; - } + survivor = survivor.mergeTags(node.tags); + graph = actionDeleteNode(node.id)(graph); + } - function createNode(children) { - return { - children: children, - height: 1, - leaf: true, - minX: Infinity, - minY: Infinity, - maxX: -Infinity, - maxY: -Infinity - }; - } + graph = graph.replace(survivor); // find and delete any degenerate ways created by connecting adjacent vertices - // sort an array so that items come in groups of n unsorted items, with groups sorted between each other; - // combines selection algorithm with binary divide & conquer approach + parents = graph.parentWays(survivor); - function multiSelect(arr, left, right, n, compare) { - var stack = [left, right]; + for (i = 0; i < parents.length; i++) { + if (parents[i].isDegenerate()) { + graph = actionDeleteWay(parents[i].id)(graph); + } + } - while (stack.length) { - right = stack.pop(); - left = stack.pop(); + return graph; + }; - if (right - left <= n) { continue; } + action.disabled = function (graph) { + var seen = {}; + var restrictionIDs = []; + var survivor; + var node, way; + var relations, relation, role; + var i, j, k; // Select the node with the oldest ID as the survivor. - var mid = left + Math.ceil((right - left) / n / 2) * n; - quickselect(arr, mid, left, right, compare); + survivor = graph.entity(utilOldestID(nodeIDs)); // 1. disable if the nodes being connected have conflicting relation roles - stack.push(left, mid, mid, right); - } - } + for (i = 0; i < nodeIDs.length; i++) { + node = graph.entity(nodeIDs[i]); + relations = graph.parentRelations(node); - var tiler = utilTiler(); - var dispatch$1 = dispatch('loaded'); - var _tileZoom = 14; - var _krUrlRoot = 'https://www.keepright.at'; - var _krData = { errorTypes: {}, localizeStrings: {} }; + for (j = 0; j < relations.length; j++) { + relation = relations[j]; + role = relation.memberById(node.id).role || ''; // if this node is a via node in a restriction, remember for later - // This gets reassigned if reset - var _cache; + if (relation.hasFromViaTo()) { + restrictionIDs.push(relation.id); + } - var _krRuleset = [ - // no 20 - multiple node on same spot - these are mostly boundaries overlapping roads - 30, 40, 50, 60, 70, 90, 100, 110, 120, 130, 150, 160, 170, 180, - 190, 191, 192, 193, 194, 195, 196, 197, 198, - 200, 201, 202, 203, 204, 205, 206, 207, 208, 210, 220, - 230, 231, 232, 270, 280, 281, 282, 283, 284, 285, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 300, 310, 311, 312, 313, - 320, 350, 360, 370, 380, 390, 400, 401, 402, 410, 411, 412, 413 - ]; + if (seen[relation.id] !== undefined && seen[relation.id] !== role) { + return 'relation'; + } else { + seen[relation.id] = role; + } + } + } // gather restrictions for parent ways - function abortRequest(controller) { - if (controller) { - controller.abort(); - } - } + for (i = 0; i < nodeIDs.length; i++) { + node = graph.entity(nodeIDs[i]); + var parents = graph.parentWays(node); - function abortUnwantedRequests(cache, tiles) { - Object.keys(cache.inflightTile).forEach(function (k) { - var wanted = tiles.find(function (tile) { return k === tile.id; }); - if (!wanted) { - abortRequest(cache.inflightTile[k]); - delete cache.inflightTile[k]; - } - }); - } + for (j = 0; j < parents.length; j++) { + var parent = parents[j]; + relations = graph.parentRelations(parent); + for (k = 0; k < relations.length; k++) { + relation = relations[k]; - function encodeIssueRtree(d) { - return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d }; - } + if (relation.hasFromViaTo()) { + restrictionIDs.push(relation.id); + } + } + } + } // test restrictions - // Replace or remove QAItem from rtree - function updateRtree(item, replace) { - _cache.rtree.remove(item, function (a, b) { return a.data.id === b.data.id; }); + restrictionIDs = utilArrayUniq(restrictionIDs); - if (replace) { - _cache.rtree.insert(item); - } - } + for (i = 0; i < restrictionIDs.length; i++) { + relation = graph.entity(restrictionIDs[i]); + if (!relation.isComplete(graph)) continue; + var memberWays = relation.members.filter(function (m) { + return m.type === 'way'; + }).map(function (m) { + return graph.entity(m.id); + }); + memberWays = utilArrayUniq(memberWays); + var f = relation.memberByRole('from'); + var t = relation.memberByRole('to'); + var isUturn = f.id === t.id; // 2a. disable if connection would damage a restriction + // (a key node is a node at the junction of ways) + + var nodes = { + from: [], + via: [], + to: [], + keyfrom: [], + keyto: [] + }; + for (j = 0; j < relation.members.length; j++) { + collectNodes(relation.members[j], nodes); + } - function tokenReplacements(d) { - if (!(d instanceof QAItem)) { return; } + nodes.keyfrom = utilArrayUniq(nodes.keyfrom.filter(hasDuplicates)); + nodes.keyto = utilArrayUniq(nodes.keyto.filter(hasDuplicates)); + var filter = keyNodeFilter(nodes.keyfrom, nodes.keyto); + nodes.from = nodes.from.filter(filter); + nodes.via = nodes.via.filter(filter); + nodes.to = nodes.to.filter(filter); + var connectFrom = false; + var connectVia = false; + var connectTo = false; + var connectKeyFrom = false; + var connectKeyTo = false; - var htmlRegex = new RegExp(/<\/[a-z][\s\S]*>/); - var replacements = {}; + for (j = 0; j < nodeIDs.length; j++) { + var n = nodeIDs[j]; - var issueTemplate = _krData.errorTypes[d.whichType]; - if (!issueTemplate) { - /* eslint-disable no-console */ - console.log('No Template: ', d.whichType); - console.log(' ', d.description); - /* eslint-enable no-console */ - return; - } + if (nodes.from.indexOf(n) !== -1) { + connectFrom = true; + } - // some descriptions are just fixed text - if (!issueTemplate.regex) { return; } + if (nodes.via.indexOf(n) !== -1) { + connectVia = true; + } - // regex pattern should match description with variable details captured - var errorRegex = new RegExp(issueTemplate.regex, 'i'); - var errorMatch = errorRegex.exec(d.description); - if (!errorMatch) { - /* eslint-disable no-console */ - console.log('Unmatched: ', d.whichType); - console.log(' ', d.description); - console.log(' ', errorRegex); - /* eslint-enable no-console */ - return; - } + if (nodes.to.indexOf(n) !== -1) { + connectTo = true; + } - for (var i = 1; i < errorMatch.length; i++) { // skip first - var capture = errorMatch[i]; - var idType = (void 0); + if (nodes.keyfrom.indexOf(n) !== -1) { + connectKeyFrom = true; + } - idType = 'IDs' in issueTemplate ? issueTemplate.IDs[i-1] : ''; - if (idType && capture) { // link IDs if present in the capture - capture = parseError(capture, idType); - } else if (htmlRegex.test(capture)) { // escape any html in non-IDs - capture = '\\' + capture + '\\'; - } else { - var compare = capture.toLowerCase(); - if (_krData.localizeStrings[compare]) { // some replacement strings can be localized - capture = _t('QA.keepRight.error_parts.' + _krData.localizeStrings[compare]); + if (nodes.keyto.indexOf(n) !== -1) { + connectKeyTo = true; + } } - } - replacements['var' + i] = capture; - } + if (connectFrom && connectTo && !isUturn) { + return 'restriction'; + } - return replacements; - } + if (connectFrom && connectVia) { + return 'restriction'; + } + if (connectTo && connectVia) { + return 'restriction'; + } // connecting to a key node - + // if both nodes are on a member way (i.e. part of the turn restriction), + // the connecting node must be adjacent to the key node. - function parseError(capture, idType) { - var compare = capture.toLowerCase(); - if (_krData.localizeStrings[compare]) { // some replacement strings can be localized - capture = _t('QA.keepRight.error_parts.' + _krData.localizeStrings[compare]); - } - switch (idType) { - // link a string like "this node" - case 'this': - capture = linkErrorObject(capture); - break; + if (connectKeyFrom || connectKeyTo) { + if (nodeIDs.length !== 2) { + return 'restriction'; + } - case 'url': - capture = linkURL(capture); - break; + var n0 = null; + var n1 = null; - // link an entity ID - case 'n': - case 'w': - case 'r': - capture = linkEntity(idType + capture); - break; + for (j = 0; j < memberWays.length; j++) { + way = memberWays[j]; - // some errors have more complex ID lists/variance - case '20': - capture = parse20(capture); - break; - case '211': - capture = parse211(capture); - break; - case '231': - capture = parse231(capture); - break; - case '294': - capture = parse294(capture); - break; - case '370': - capture = parse370(capture); - break; - } + if (way.contains(nodeIDs[0])) { + n0 = nodeIDs[0]; + } - return capture; + if (way.contains(nodeIDs[1])) { + n1 = nodeIDs[1]; + } + } + if (n0 && n1) { + // both nodes are part of the restriction + var ok = false; - function linkErrorObject(d) { - return ("" + d + ""); - } + for (j = 0; j < memberWays.length; j++) { + way = memberWays[j]; - function linkEntity(d) { - return ("" + d + ""); - } + if (way.areAdjacent(n0, n1)) { + ok = true; + break; + } + } - function linkURL(d) { - return ("" + d + ""); - } + if (!ok) { + return 'restriction'; + } + } + } // 2b. disable if nodes being connected will destroy a member way in a restriction + // (to test, make a copy and try actually connecting the nodes) - // arbitrary node list of form: #ID, #ID, #ID... - function parse211(capture) { - var newList = []; - var items = capture.split(', '); - items.forEach(function (item) { - // ID has # at the front - var id = linkEntity('n' + item.slice(1)); - newList.push(id); - }); + for (j = 0; j < memberWays.length; j++) { + way = memberWays[j].update({}); // make copy - return newList.join(', '); - } + for (k = 0; k < nodeIDs.length; k++) { + if (nodeIDs[k] === survivor.id) continue; - // arbitrary way list of form: #ID(layer),#ID(layer),#ID(layer)... - function parse231(capture) { - var newList = []; - // unfortunately 'layer' can itself contain commas, so we split on '),' - var items = capture.split('),'); + if (way.areAdjacent(nodeIDs[k], survivor.id)) { + way = way.removeNode(nodeIDs[k]); + } else { + way = way.replaceNode(nodeIDs[k], survivor.id); + } + } - items.forEach(function (item) { - var match = item.match(/\#(\d+)\((.+)\)?/); - if (match !== null && match.length > 2) { - newList.push(linkEntity('w' + match[1]) + ' ' + - _t('QA.keepRight.errorTypes.231.layer', { layer: match[2] }) - ); + if (way.isDegenerate()) { + return 'restriction'; + } } - }); - - return newList.join(', '); - } + } - // arbitrary node/relation list of form: from node #ID,to relation #ID,to node #ID... - function parse294(capture) { - var newList = []; - var items = capture.split(','); + return false; // if a key node appears multiple times (indexOf !== lastIndexOf) it's a FROM-VIA or TO-VIA junction - items.forEach(function (item) { - // item of form "from/to node/relation #ID" - item = item.split(' '); + function hasDuplicates(n, i, arr) { + return arr.indexOf(n) !== arr.lastIndexOf(n); + } - // to/from role is more clear in quotes - var role = "\"" + (item[0]) + "\""; + function keyNodeFilter(froms, tos) { + return function (n) { + return froms.indexOf(n) === -1 && tos.indexOf(n) === -1; + }; + } - // first letter of node/relation provides the type - var idType = item[1].slice(0,1); + function collectNodes(member, collection) { + var entity = graph.hasEntity(member.id); + if (!entity) return; + var role = member.role || ''; - // ID has # at the front - var id = item[2].slice(1); - id = linkEntity(idType + id); + if (!collection[role]) { + collection[role] = []; + } - newList.push((role + " " + (item[1]) + " " + id)); - }); + if (member.type === 'node') { + collection[role].push(member.id); - return newList.join(', '); - } + if (role === 'via') { + collection.keyfrom.push(member.id); + collection.keyto.push(member.id); + } + } else if (member.type === 'way') { + collection[role].push.apply(collection[role], entity.nodes); - // may or may not include the string "(including the name 'name')" - function parse370(capture) { - if (!capture) { return ''; } + if (role === 'from' || role === 'via') { + collection.keyfrom.push(entity.first()); + collection.keyfrom.push(entity.last()); + } - var match = capture.match(/\(including the name (\'.+\')\)/); - if (match && match.length) { - return _t('QA.keepRight.errorTypes.370.including_the_name', { name: match[1] }); + if (role === 'to' || role === 'via') { + collection.keyto.push(entity.first()); + collection.keyto.push(entity.last()); + } + } } - return ''; - } + }; - // arbitrary node list of form: #ID,#ID,#ID... - function parse20(capture) { - var newList = []; - var items = capture.split(','); + return action; + } - items.forEach(function (item) { - // ID has # at the front - var id = linkEntity('n' + item.slice(1)); - newList.push(id); + function actionCopyEntities(ids, fromGraph) { + var _copies = {}; + + var action = function action(graph) { + ids.forEach(function (id) { + fromGraph.entity(id).copy(fromGraph, _copies); }); - return newList.join(', '); - } - } + for (var id in _copies) { + graph = graph.replace(_copies[id]); + } + return graph; + }; - var serviceKeepRight = { - title: 'keepRight', + action.copies = function () { + return _copies; + }; - init: function init() { - _mainFileFetcher.get('keepRight') - .then(function (d) { return _krData = d; }); + return action; + } - if (!_cache) { - this.reset(); + function actionDeleteMember(relationId, memberIndex) { + return function (graph) { + var relation = graph.entity(relationId).removeMember(memberIndex); + graph = graph.replace(relation); + + if (relation.isDegenerate()) { + graph = actionDeleteRelation(relation.id)(graph); } - this.event = utilRebind(this, dispatch$1, 'on'); - }, + return graph; + }; + } - reset: function reset() { - if (_cache) { - Object.values(_cache.inflightTile).forEach(abortRequest); - } + function actionDiscardTags(difference, discardTags) { + discardTags = discardTags || {}; + return function (graph) { + difference.modified().forEach(checkTags); + difference.created().forEach(checkTags); + return graph; - _cache = { - data: {}, - loadedTile: {}, - inflightTile: {}, - inflightPost: {}, - closed: {}, - rtree: new RBush() - }; - }, + function checkTags(entity) { + var keys = Object.keys(entity.tags); + var didDiscard = false; + var tags = {}; + for (var i = 0; i < keys.length; i++) { + var k = keys[i]; - // KeepRight API: http://osm.mueschelsoft.de/keepright/interfacing.php - loadIssues: function loadIssues(projection) { - var this$1 = this; + if (discardTags[k] || !entity.tags[k]) { + didDiscard = true; + } else { + tags[k] = entity.tags[k]; + } + } - var options = { - format: 'geojson', - ch: _krRuleset - }; + if (didDiscard) { + graph = graph.replace(entity.update({ + tags: tags + })); + } + } + }; + } + + // + // Optionally, disconnect only the given ways. + // + // For testing convenience, accepts an ID to assign to the (first) new node. + // Normally, this will be undefined and the way will automatically + // be assigned a new ID. + // + // This is the inverse of `iD.actionConnect`. + // + // Reference: + // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as + // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java + // + + function actionDisconnect(nodeId, newNodeId) { + var wayIds; + var disconnectableRelationTypes = { + 'associatedStreet': true, + 'enforcement': true, + 'site': true + }; + + var action = function action(graph) { + var node = graph.entity(nodeId); + var connections = action.connections(graph); + connections.forEach(function (connection) { + var way = graph.entity(connection.wayID); + var newNode = osmNode({ + id: newNodeId, + loc: node.loc, + tags: node.tags + }); + graph = graph.replace(newNode); + + if (connection.index === 0 && way.isArea()) { + // replace shared node with shared node.. + graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id)); + } else if (way.isClosed() && connection.index === way.nodes.length - 1) { + // replace closing node with new new node.. + graph = graph.replace(way.unclose().addNode(newNode.id)); + } else { + // replace shared node with multiple new nodes.. + graph = graph.replace(way.updateNode(newNode.id, connection.index)); + } + }); + return graph; + }; - // determine the needed tiles to cover the view - var tiles = tiler - .zoomExtent([_tileZoom, _tileZoom]) - .getTiles(projection); + action.connections = function (graph) { + var candidates = []; + var keeping = false; + var parentWays = graph.parentWays(graph.entity(nodeId)); + var way, waynode; - // abort inflight requests that are no longer needed - abortUnwantedRequests(_cache, tiles); + for (var i = 0; i < parentWays.length; i++) { + way = parentWays[i]; - // issue new requests.. - tiles.forEach(function (tile) { - if (_cache.loadedTile[tile.id] || _cache.inflightTile[tile.id]) { return; } - - var ref = tile.extent.rectangle(); - var left = ref[0]; - var top = ref[1]; - var right = ref[2]; - var bottom = ref[3]; - var params = Object.assign({}, options, { left: left, bottom: bottom, right: right, top: top }); - var url = _krUrlRoot + "/export.php?" + utilQsString(params); - var controller = new AbortController(); + if (wayIds && wayIds.indexOf(way.id) === -1) { + keeping = true; + continue; + } - _cache.inflightTile[tile.id] = controller; + if (way.isArea() && way.nodes[0] === nodeId) { + candidates.push({ + wayID: way.id, + index: 0 + }); + } else { + for (var j = 0; j < way.nodes.length; j++) { + waynode = way.nodes[j]; - d3_json(url, { signal: controller.signal }) - .then(function (data) { - delete _cache.inflightTile[tile.id]; - _cache.loadedTile[tile.id] = true; - if (!data || !data.features || !data.features.length) { - throw new Error('No Data'); - } - - data.features.forEach(function (feature) { - var feature_properties = feature.properties; - var itemType = feature_properties.error_type; - var id = feature_properties.error_id; - var comment = feature_properties.comment; if ( comment === void 0 ) comment = null; - var objectId = feature_properties.object_id; - var objectType = feature_properties.object_type; - var schema = feature_properties.schema; - var title = feature_properties.title; - var loc = feature.geometry.coordinates; - var description = feature.properties.description; if ( description === void 0 ) description = ''; - - // if there is a parent, save its error type e.g.: - // Error 191 = "highway-highway" - // Error 190 = "intersections without junctions" (parent) - var issueTemplate = _krData.errorTypes[itemType]; - var parentIssueType = (Math.floor(itemType / 10) * 10).toString(); - - // try to handle error type directly, fallback to parent error type. - var whichType = issueTemplate ? itemType : parentIssueType; - var whichTemplate = _krData.errorTypes[whichType]; - - // Rewrite a few of the errors at this point.. - // This is done to make them easier to linkify and translate. - switch (whichType) { - case '170': - description = "This feature has a FIXME tag: " + description; - break; - case '292': - case '293': - description = description.replace('A turn-', 'This turn-'); - break; - case '294': - case '295': - case '296': - case '297': - case '298': - description = "This turn-restriction~" + description; - break; - case '300': - description = 'This highway is missing a maxspeed tag'; - break; - case '411': - case '412': - case '413': - description = "This feature~" + description; - break; + if (waynode === nodeId) { + if (way.isClosed() && parentWays.length > 1 && wayIds && wayIds.indexOf(way.id) !== -1 && j === way.nodes.length - 1) { + continue; } - // move markers slightly so it doesn't obscure the geometry, - // then move markers away from other coincident markers - var coincident = false; - do { - // first time, move marker up. after that, move marker right. - var delta = coincident ? [0.00001, 0] : [0, 0.00001]; - loc = geoVecAdd(loc, delta); - var bbox = geoExtent(loc).bbox(); - coincident = _cache.rtree.search(bbox).length; - } while (coincident); - - var d = new QAItem(loc, this$1, itemType, id, { - comment: comment, - description: description, - whichType: whichType, - parentIssueType: parentIssueType, - severity: whichTemplate.severity || 'error', - objectId: objectId, - objectType: objectType, - schema: schema, - title: title + candidates.push({ + wayID: way.id, + index: j }); + } + } + } + } - d.replacements = tokenReplacements(d); - - _cache.data[id] = d; - _cache.rtree.insert(encodeIssueRtree(d)); - }); - - dispatch$1.call('loaded'); - }) - .catch(function () { - delete _cache.inflightTile[tile.id]; - _cache.loadedTile[tile.id] = true; - }); + return keeping ? candidates : candidates.slice(1); + }; + action.disabled = function (graph) { + var connections = action.connections(graph); + if (connections.length === 0) return 'not_connected'; + var parentWays = graph.parentWays(graph.entity(nodeId)); + var seenRelationIds = {}; + var sharedRelation; + parentWays.forEach(function (way) { + var relations = graph.parentRelations(way); + relations.filter(function (relation) { + return !disconnectableRelationTypes[relation.tags.type]; + }).forEach(function (relation) { + if (relation.id in seenRelationIds) { + if (wayIds) { + if (wayIds.indexOf(way.id) !== -1 || wayIds.indexOf(seenRelationIds[relation.id]) !== -1) { + sharedRelation = relation; + } + } else { + sharedRelation = relation; + } + } else { + seenRelationIds[relation.id] = way.id; + } + }); }); - }, + if (sharedRelation) return 'relation'; + }; + action.limitWays = function (val) { + if (!arguments.length) return wayIds; + wayIds = val; + return action; + }; - postUpdate: function postUpdate(d, callback) { - var this$1 = this; + return action; + } - if (_cache.inflightPost[d.id]) { - return callback({ message: 'Error update already inflight', status: -2 }, d); - } + function actionExtract(entityID, projection) { + var extractedNodeID; - var params = { schema: d.schema, id: d.id }; + var action = function action(graph) { + var entity = graph.entity(entityID); - if (d.newStatus) { - params.st = d.newStatus; - } - if (d.newComment !== undefined) { - params.co = d.newComment; + if (entity.type === 'node') { + return extractFromNode(entity, graph); } - // NOTE: This throws a CORS err, but it seems successful. - // We don't care too much about the response, so this is fine. - var url = _krUrlRoot + "/comment.php?" + utilQsString(params); - var controller = new AbortController(); + return extractFromWayOrRelation(entity, graph); + }; - _cache.inflightPost[d.id] = controller; + function extractFromNode(node, graph) { + extractedNodeID = node.id; // Create a new node to replace the one we will detach - // Since this is expected to throw an error just continue as if it worked - // (worst case scenario the request truly fails and issue will show up if iD restarts) - d3_json(url, { signal: controller.signal }) - .finally(function () { - delete _cache.inflightPost[d.id]; - - if (d.newStatus === 'ignore') { - // ignore permanently (false positive) - this$1.removeItem(d); - } else if (d.newStatus === 'ignore_t') { - // ignore temporarily (error fixed) - this$1.removeItem(d); - _cache.closed[((d.schema) + ":" + (d.id))] = true; - } else { - d = this$1.replaceItem(d.update({ - comment: d.newComment, - newComment: undefined, - newState: undefined - })); - } + var replacement = osmNode({ + loc: node.loc + }); + graph = graph.replace(replacement); // Process each way in turn, updating the graph as we go - if (callback) { callback(null, d); } - }); - }, + graph = graph.parentWays(node).reduce(function (accGraph, parentWay) { + return accGraph.replace(parentWay.replaceNode(entityID, replacement.id)); + }, graph); // Process any relations too - // Get all cached QAItems covering the viewport - getItems: function getItems(projection) { - var viewport = projection.clipExtent(); - var min = [viewport[0][0], viewport[1][1]]; - var max = [viewport[1][0], viewport[0][1]]; - var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox(); + return graph.parentRelations(node).reduce(function (accGraph, parentRel) { + return accGraph.replace(parentRel.replaceMember(node, replacement)); + }, graph); + } - return _cache.rtree.search(bbox).map(function (d) { return d.data; }); - }, + function extractFromWayOrRelation(entity, graph) { + var fromGeometry = entity.geometry(graph); + var keysToCopyAndRetain = ['source', 'wheelchair']; + var keysToRetain = ['area']; + var buildingKeysToRetain = ['architect', 'building', 'height', 'layer']; + var extractedLoc = d3_geoPath(projection).centroid(entity.asGeoJSON(graph)); + extractedLoc = extractedLoc && projection.invert(extractedLoc); - // Get a QAItem from cache - // NOTE: Don't change method name until UI v3 is merged - getError: function getError(id) { - return _cache.data[id]; - }, + if (!extractedLoc || !isFinite(extractedLoc[0]) || !isFinite(extractedLoc[1])) { + extractedLoc = entity.extent(graph).center(); + } - // Replace a single QAItem in the cache - replaceItem: function replaceItem(item) { - if (!(item instanceof QAItem) || !item.id) { return; } + var indoorAreaValues = { + area: true, + corridor: true, + elevator: true, + level: true, + room: true + }; + var isBuilding = entity.tags.building && entity.tags.building !== 'no' || entity.tags['building:part'] && entity.tags['building:part'] !== 'no'; + var isIndoorArea = fromGeometry === 'area' && entity.tags.indoor && indoorAreaValues[entity.tags.indoor]; + var entityTags = Object.assign({}, entity.tags); // shallow copy - _cache.data[item.id] = item; - updateRtree(encodeIssueRtree(item), true); // true = replace - return item; - }, + var pointTags = {}; - // Remove a single QAItem from the cache - removeItem: function removeItem(item) { - if (!(item instanceof QAItem) || !item.id) { return; } + for (var key in entityTags) { + if (entity.type === 'relation' && key === 'type') { + continue; + } - delete _cache.data[item.id]; - updateRtree(encodeIssueRtree(item), false); // false = remove - }, + if (keysToRetain.indexOf(key) !== -1) { + continue; + } - issueURL: function issueURL(item) { - return (_krUrlRoot + "/report_map.php?schema=" + (item.schema) + "&error=" + (item.id)); - }, + if (isBuilding) { + // don't transfer building-related tags + if (buildingKeysToRetain.indexOf(key) !== -1 || key.match(/^building:.{1,}/) || key.match(/^roof:.{1,}/)) continue; + } // leave `indoor` tag on the area - // Get an array of issues closed during this session. - // Used to populate `closed:keepright` changeset tag - getClosedIDs: function getClosedIDs() { - return Object.keys(_cache.closed).sort(); - } - }; + if (isIndoorArea && key === 'indoor') { + continue; + } // copy the tag from the entity to the point - var tiler$1 = utilTiler(); - var dispatch$2 = dispatch('loaded'); - var _tileZoom$1 = 14; - var _impOsmUrls = { - ow: 'https://grab.community.improve-osm.org/directionOfFlowService', - mr: 'https://grab.community.improve-osm.org/missingGeoService', - tr: 'https://grab.community.improve-osm.org/turnRestrictionService' - }; - var _impOsmData = { icons: {} }; + pointTags[key] = entityTags[key]; // leave addresses and some other tags so they're on both features - // This gets reassigned if reset - var _cache$1; + if (keysToCopyAndRetain.indexOf(key) !== -1 || key.match(/^addr:.{1,}/)) { + continue; + } else if (isIndoorArea && key === 'level') { + // leave `level` on both features + continue; + } // remove the tag from the entity - function abortRequest$1(i) { - Object.values(i).forEach(function (controller) { - if (controller) { - controller.abort(); - } - }); - } - function abortUnwantedRequests$1(cache, tiles) { - Object.keys(cache.inflightTile).forEach(function (k) { - var wanted = tiles.find(function (tile) { return k === tile.id; }); - if (!wanted) { - abortRequest$1(cache.inflightTile[k]); - delete cache.inflightTile[k]; + delete entityTags[key]; } - }); - } - - function encodeIssueRtree$1(d) { - return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d }; - } - // Replace or remove QAItem from rtree - function updateRtree$1(item, replace) { - _cache$1.rtree.remove(item, function (a, b) { return a.data.id === b.data.id; }); + if (!isBuilding && !isIndoorArea && fromGeometry === 'area') { + // ensure that areas keep area geometry + entityTags.area = 'yes'; + } - if (replace) { - _cache$1.rtree.insert(item); + var replacement = osmNode({ + loc: extractedLoc, + tags: pointTags + }); + graph = graph.replace(replacement); + extractedNodeID = replacement.id; + return graph.replace(entity.update({ + tags: entityTags + })); } - } - function linkErrorObject(d) { - return ("" + d + ""); - } + action.getExtractedNodeID = function () { + return extractedNodeID; + }; - function linkEntity(d) { - return ("" + d + ""); + return action; } - function pointAverage(points) { - if (points.length) { - var sum = points.reduce( - function (acc, point) { return geoVecAdd(acc, [point.lon, point.lat]); }, - [0,0] - ); - return geoVecScale(sum, 1 / points.length); - } else { - return [0,0]; - } - } + // + // This is the inverse of `iD.actionSplit`. + // + // Reference: + // https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as + // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java + // - function relativeBearing(p1, p2) { - var angle = Math.atan2(p2.lon - p1.lon, p2.lat - p1.lat); - if (angle < 0) { - angle += 2 * Math.PI; - } + function actionJoin(ids) { + function groupEntitiesByGeometry(graph) { + var entities = ids.map(function (id) { + return graph.entity(id); + }); + return Object.assign({ + line: [] + }, utilArrayGroupBy(entities, function (entity) { + return entity.geometry(graph); + })); + } + + var action = function action(graph) { + var ways = ids.map(graph.entity, graph); // Prefer to keep an existing way. + // if there are multiple existing ways, keep the oldest one + // the oldest way is determined by the ID of the way. + + var survivorID = utilOldestID(ways.map(function (way) { + return way.id; + })); // if any of the ways are sided (e.g. coastline, cliff, kerb) + // sort them first so they establish the overall order - #6033 + + ways.sort(function (a, b) { + var aSided = a.isSided(); + var bSided = b.isSided(); + return aSided && !bSided ? -1 : bSided && !aSided ? 1 : 0; + }); + var sequences = osmJoinWays(ways, graph); + var joined = sequences[0]; // We might need to reverse some of these ways before joining them. #4688 + // `joined.actions` property will contain any actions we need to apply. + + graph = sequences.actions.reduce(function (g, action) { + return action(g); + }, graph); + var survivor = graph.entity(survivorID); + survivor = survivor.update({ + nodes: joined.nodes.map(function (n) { + return n.id; + }) + }); + graph = graph.replace(survivor); + joined.forEach(function (way) { + if (way.id === survivorID) return; + graph.parentRelations(way).forEach(function (parent) { + graph = graph.replace(parent.replaceMember(way, survivor)); + }); + survivor = survivor.mergeTags(way.tags); + graph = graph.replace(survivor); + graph = actionDeleteWay(way.id)(graph); + }); // Finds if the join created a single-member multipolygon, + // and if so turns it into a basic area instead + + function checkForSimpleMultipolygon() { + if (!survivor.isClosed()) return; + var multipolygons = graph.parentMultipolygons(survivor).filter(function (multipolygon) { + // find multipolygons where the survivor is the only member + return multipolygon.members.length === 1; + }); // skip if this is the single member of multiple multipolygons + + if (multipolygons.length !== 1) return; + var multipolygon = multipolygons[0]; + + for (var key in survivor.tags) { + if (multipolygon.tags[key] && // don't collapse if tags cannot be cleanly merged + multipolygon.tags[key] !== survivor.tags[key]) return; + } - // Return degrees - return angle * 180 / Math.PI; - } + survivor = survivor.mergeTags(multipolygon.tags); + graph = graph.replace(survivor); + graph = actionDeleteRelation(multipolygon.id, true + /* allow untagged members */ + )(graph); + var tags = Object.assign({}, survivor.tags); - // Assuming range [0,360) - function cardinalDirection(bearing) { - var dir = 45 * Math.round(bearing / 45); - var compass = { - 0: 'north', - 45: 'northeast', - 90: 'east', - 135: 'southeast', - 180: 'south', - 225: 'southwest', - 270: 'west', - 315: 'northwest', - 360: 'north' - }; + if (survivor.geometry(graph) !== 'area') { + // ensure the feature persists as an area + tags.area = 'yes'; + } - return _t(("QA.improveOSM.directions." + (compass[dir]))); - } + delete tags.type; // remove type=multipolygon - // Errors shouldn't obscure eachother - function preventCoincident(loc, bumpUp) { - var coincident = false; - do { - // first time, move marker up. after that, move marker right. - var delta = coincident ? [0.00001, 0] : (bumpUp ? [0, 0.00001] : [0, 0]); - loc = geoVecAdd(loc, delta); - var bbox = geoExtent(loc).bbox(); - coincident = _cache$1.rtree.search(bbox).length; - } while (coincident); + survivor = survivor.update({ + tags: tags + }); + graph = graph.replace(survivor); + } - return loc; - } + checkForSimpleMultipolygon(); + return graph; + }; // Returns the number of nodes the resultant way is expected to have - var serviceImproveOSM = { - title: 'improveOSM', - init: function init() { - _mainFileFetcher.get('qa_data') - .then(function (d) { return _impOsmData = d.improveOSM; }); + action.resultingWayNodesLength = function (graph) { + return ids.reduce(function (count, id) { + return count + graph.entity(id).nodes.length; + }, 0) - ids.length - 1; + }; - if (!_cache$1) { - this.reset(); + action.disabled = function (graph) { + var geometries = groupEntitiesByGeometry(graph); + + if (ids.length < 2 || ids.length !== geometries.line.length) { + return 'not_eligible'; } - this.event = utilRebind(this, dispatch$2, 'on'); - }, + var joined = osmJoinWays(ids.map(graph.entity, graph), graph); - reset: function reset() { - if (_cache$1) { - Object.values(_cache$1.inflightTile).forEach(abortRequest$1); + if (joined.length > 1) { + return 'not_adjacent'; } - _cache$1 = { - data: {}, - loadedTile: {}, - inflightTile: {}, - inflightPost: {}, - closed: {}, - rtree: new RBush() - }; - }, - loadIssues: function loadIssues(projection) { - var this$1 = this; + var i; // All joined ways must belong to the same set of (non-restriction) relations. + // Restriction relations have different logic, below, which allows some cases + // this prohibits, and prohibits some cases this allows. - var options = { - client: 'iD', - status: 'OPEN', - zoom: '19' // Use a high zoom so that clusters aren't returned + var sortedParentRelations = function sortedParentRelations(id) { + return graph.parentRelations(graph.entity(id)).filter(function (rel) { + return !rel.isRestriction() && !rel.isConnectivity(); + }).sort(function (a, b) { + return a.id - b.id; + }); }; - // determine the needed tiles to cover the view - var tiles = tiler$1 - .zoomExtent([_tileZoom$1, _tileZoom$1]) - .getTiles(projection); + var relsA = sortedParentRelations(ids[0]); + + for (i = 1; i < ids.length; i++) { + var relsB = sortedParentRelations(ids[i]); + + if (!utilArrayIdentical(relsA, relsB)) { + return 'conflicting_relations'; + } + } // Loop through all combinations of path-pairs + // to check potential intersections between all pairs + + + for (i = 0; i < ids.length - 1; i++) { + for (var j = i + 1; j < ids.length; j++) { + var path1 = graph.childNodes(graph.entity(ids[i])).map(function (e) { + return e.loc; + }); + var path2 = graph.childNodes(graph.entity(ids[j])).map(function (e) { + return e.loc; + }); + var intersections = geoPathIntersections(path1, path2); // Check if intersections are just nodes lying on top of + // each other/the line, as opposed to crossing it + + var common = utilArrayIntersection(joined[0].nodes.map(function (n) { + return n.loc.toString(); + }), intersections.map(function (n) { + return n.toString(); + })); + + if (common.length !== intersections.length) { + return 'paths_intersect'; + } + } + } + + var nodeIds = joined[0].nodes.map(function (n) { + return n.id; + }).slice(1, -1); + var relation; + var tags = {}; + var conflicting = false; + joined[0].forEach(function (way) { + var parents = graph.parentRelations(way); + parents.forEach(function (parent) { + if ((parent.isRestriction() || parent.isConnectivity()) && parent.members.some(function (m) { + return nodeIds.indexOf(m.id) >= 0; + })) { + relation = parent; + } + }); + + for (var k in way.tags) { + if (!(k in tags)) { + tags[k] = way.tags[k]; + } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) { + conflicting = true; + } + } + }); - // abort inflight requests that are no longer needed - abortUnwantedRequests$1(_cache$1, tiles); + if (relation) { + return relation.isRestriction() ? 'restriction' : 'connectivity'; + } - // issue new requests.. - tiles.forEach(function (tile) { - if (_cache$1.loadedTile[tile.id] || _cache$1.inflightTile[tile.id]) { return; } + if (conflicting) { + return 'conflicting_tags'; + } + }; - var ref = tile.extent.rectangle(); - var east = ref[0]; - var north = ref[1]; - var west = ref[2]; - var south = ref[3]; - var params = Object.assign({}, options, { east: east, south: south, west: west, north: north }); + return action; + } - // 3 separate requests to store for each tile - var requests = {}; + function actionMerge(ids) { + function groupEntitiesByGeometry(graph) { + var entities = ids.map(function (id) { + return graph.entity(id); + }); + return Object.assign({ + point: [], + area: [], + line: [], + relation: [] + }, utilArrayGroupBy(entities, function (entity) { + return entity.geometry(graph); + })); + } + + var action = function action(graph) { + var geometries = groupEntitiesByGeometry(graph); + var target = geometries.area[0] || geometries.line[0]; + var points = geometries.point; + points.forEach(function (point) { + target = target.mergeTags(point.tags); + graph = graph.replace(target); + graph.parentRelations(point).forEach(function (parent) { + graph = graph.replace(parent.replaceMember(point, target)); + }); + var nodes = utilArrayUniq(graph.childNodes(target)); + var removeNode = point; - Object.keys(_impOsmUrls).forEach(function (k) { - // We exclude WATER from missing geometry as it doesn't seem useful - // We use most confident one-way and turn restrictions only, still have false positives - var kParams = Object.assign({}, - params, - (k === 'mr') ? { type: 'PARKING,ROAD,BOTH,PATH' } : { confidenceLevel: 'C1' } - ); - var url = (_impOsmUrls[k]) + "/search?" + utilQsString(kParams); - var controller = new AbortController(); + if (!point.isNew()) { + // Try to preserve the original point if it already has + // an ID in the database. + var inserted = false; - requests[k] = controller; + var canBeReplaced = function canBeReplaced(node) { + return !(graph.parentWays(node).length > 1 || graph.parentRelations(node).length); + }; - d3_json(url, { signal: controller.signal }) - .then(function (data) { - delete _cache$1.inflightTile[tile.id][k]; - if (!Object.keys(_cache$1.inflightTile[tile.id]).length) { - delete _cache$1.inflightTile[tile.id]; - _cache$1.loadedTile[tile.id] = true; - } + var replaceNode = function replaceNode(node) { + graph = graph.replace(point.update({ + tags: node.tags, + loc: node.loc + })); + target = target.replaceNode(node.id, point.id); + graph = graph.replace(target); + removeNode = node; + inserted = true; + }; - // Road segments at high zoom == oneways - if (data.roadSegments) { - data.roadSegments.forEach(function (feature) { - // Position error at the approximate middle of the segment - var points = feature.points; - var wayId = feature.wayId; - var fromNodeId = feature.fromNodeId; - var toNodeId = feature.toNodeId; - var itemId = "" + wayId + fromNodeId + toNodeId; - var mid = points.length / 2; - var loc; - - // Even number of points, find midpoint of the middle two - // Odd number of points, use position of very middle point - if (mid % 1 === 0) { - loc = pointAverage([points[mid - 1], points[mid]]); - } else { - mid = points[Math.floor(mid)]; - loc = [mid.lon, mid.lat]; - } + var i; + var node; // First, try to replace a new child node on the target way. - // One-ways can land on same segment in opposite direction - loc = preventCoincident(loc, false); - - var d = new QAItem(loc, this$1, k, itemId, { - issueKey: k, // used as a category - identifier: { // used to post changes - wayId: wayId, - fromNodeId: fromNodeId, - toNodeId: toNodeId - }, - objectId: wayId, - objectType: 'way' - }); + for (i = 0; i < nodes.length; i++) { + node = nodes[i]; - // Variables used in the description - d.replacements = { - percentage: feature.percentOfTrips, - num_trips: feature.numberOfTrips, - highway: linkErrorObject(_t('QA.keepRight.error_parts.highway')), - from_node: linkEntity('n' + feature.fromNodeId), - to_node: linkEntity('n' + feature.toNodeId) - }; + if (canBeReplaced(node) && node.isNew()) { + replaceNode(node); + break; + } + } - _cache$1.data[d.id] = d; - _cache$1.rtree.insert(encodeIssueRtree$1(d)); - }); + if (!inserted && point.hasInterestingTags()) { + // No new child node found, try to find an existing, but + // uninteresting child node instead. + for (i = 0; i < nodes.length; i++) { + node = nodes[i]; + + if (canBeReplaced(node) && !node.hasInterestingTags()) { + replaceNode(node); + break; } + } - // Tiles at high zoom == missing roads - if (data.tiles) { - data.tiles.forEach(function (feature) { - var type = feature.type; - var x = feature.x; - var y = feature.y; - var numberOfTrips = feature.numberOfTrips; - var geoType = type.toLowerCase(); - var itemId = "" + geoType + x + y + numberOfTrips; - - // Average of recorded points should land on the missing geometry - // Missing geometry could happen to land on another error - var loc = pointAverage(feature.points); - loc = preventCoincident(loc, false); - - var d = new QAItem(loc, this$1, (k + "-" + geoType), itemId, { - issueKey: k, - identifier: { x: x, y: y } - }); + if (!inserted) { + // Still not inserted, try to find an existing, interesting, + // but more recent child node. + for (i = 0; i < nodes.length; i++) { + node = nodes[i]; - d.replacements = { - num_trips: numberOfTrips, - geometry_type: _t(("QA.improveOSM.geometry_types." + geoType)) - }; + if (canBeReplaced(node) && utilCompareIDs(point.id, node.id) < 0) { + replaceNode(node); + break; + } + } + } // If the point still hasn't been inserted, we give up. + // There are more interesting or older nodes on the way. - // -1 trips indicates data came from a 3rd party - if (numberOfTrips === -1) { - d.desc = _t('QA.improveOSM.error_types.mr.description_alt', d.replacements); - } + } + } - _cache$1.data[d.id] = d; - _cache$1.rtree.insert(encodeIssueRtree$1(d)); - }); - } + graph = graph.remove(removeNode); + }); - // Entities at high zoom == turn restrictions - if (data.entities) { - data.entities.forEach(function (feature) { - var point = feature.point; - var id = feature.id; - var segments = feature.segments; - var numberOfPasses = feature.numberOfPasses; - var turnType = feature.turnType; - var itemId = "" + (id.replace(/[,:+#]/g, '_')); - - // Turn restrictions could be missing at same junction - // We also want to bump the error up so node is accessible - var loc = preventCoincident([point.lon, point.lat], true); - - // Elements are presented in a strange way - var ids = id.split(','); - var from_way = ids[0]; - var via_node = ids[3]; - var to_way = ids[2].split(':')[1]; - - var d = new QAItem(loc, this$1, k, itemId, { - issueKey: k, - identifier: id, - objectId: via_node, - objectType: 'node' - }); + if (target.tags.area === 'yes') { + var tags = Object.assign({}, target.tags); // shallow copy - // Travel direction along from_way clarifies the turn restriction - var ref = segments[0].points; - var p1 = ref[0]; - var p2 = ref[1]; - var dir_of_travel = cardinalDirection(relativeBearing(p1, p2)); - - // Variables used in the description - d.replacements = { - num_passed: numberOfPasses, - num_trips: segments[0].numberOfTrips, - turn_restriction: turnType.toLowerCase(), - from_way: linkEntity('w' + from_way), - to_way: linkEntity('w' + to_way), - travel_direction: dir_of_travel, - junction: linkErrorObject(_t('QA.keepRight.error_parts.this_node')) - }; + delete tags.area; - _cache$1.data[d.id] = d; - _cache$1.rtree.insert(encodeIssueRtree$1(d)); - dispatch$2.call('loaded'); - }); - } - }) - .catch(function () { - delete _cache$1.inflightTile[tile.id][k]; - if (!Object.keys(_cache$1.inflightTile[tile.id]).length) { - delete _cache$1.inflightTile[tile.id]; - _cache$1.loadedTile[tile.id] = true; - } - }); - }); + if (osmTagSuggestingArea(tags)) { + // remove the `area` tag if area geometry is now implied - #3851 + target = target.update({ + tags: tags + }); + graph = graph.replace(target); + } + } - _cache$1.inflightTile[tile.id] = requests; - }); - }, + return graph; + }; - getComments: function getComments(item) { - var this$1 = this; + action.disabled = function (graph) { + var geometries = groupEntitiesByGeometry(graph); - // If comments already retrieved no need to do so again - if (item.comments) { - return Promise.resolve(item); + if (geometries.point.length === 0 || geometries.area.length + geometries.line.length !== 1 || geometries.relation.length !== 0) { + return 'not_eligible'; } + }; - var key = item.issueKey; - var qParams = {}; + return action; + } - if (key === 'ow') { - qParams = item.identifier; - } else if (key === 'mr') { - qParams.tileX = item.identifier.x; - qParams.tileY = item.identifier.y; - } else if (key === 'tr') { - qParams.targetId = item.identifier; + // + // 1. move all the nodes to a common location + // 2. `actionConnect` them + + function actionMergeNodes(nodeIDs, loc) { + // If there is a single "interesting" node, use that as the location. + // Otherwise return the average location of all the nodes. + function chooseLoc(graph) { + if (!nodeIDs.length) return null; + var sum = [0, 0]; + var interestingCount = 0; + var interestingLoc; + + for (var i = 0; i < nodeIDs.length; i++) { + var node = graph.entity(nodeIDs[i]); + + if (node.hasInterestingTags()) { + interestingLoc = ++interestingCount === 1 ? node.loc : null; + } + + sum = geoVecAdd(sum, node.loc); } - var url = (_impOsmUrls[key]) + "/retrieveComments?" + utilQsString(qParams); - var cacheComments = function (data) { - // Assign directly for immediate use afterwards - // comments are served newest to oldest - item.comments = data.comments ? data.comments.reverse() : []; - this$1.replaceItem(item); - }; + return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length); + } - return d3_json(url).then(cacheComments).then(function () { return item; }); - }, + var action = function action(graph) { + if (nodeIDs.length < 2) return graph; + var toLoc = loc; - postUpdate: function postUpdate(d, callback) { - if (!serviceOsm.authenticated()) { // Username required in payload - return callback({ message: 'Not Authenticated', status: -3}, d); + if (!toLoc) { + toLoc = chooseLoc(graph); } - if (_cache$1.inflightPost[d.id]) { - return callback({ message: 'Error update already inflight', status: -2 }, d); + + for (var i = 0; i < nodeIDs.length; i++) { + var node = graph.entity(nodeIDs[i]); + + if (node.loc !== toLoc) { + graph = graph.replace(node.move(toLoc)); + } } - // Payload can only be sent once username is established - serviceOsm.userDetails(sendPayload.bind(this)); + return actionConnect(nodeIDs)(graph); + }; - function sendPayload(err, user) { - var this$1 = this; + action.disabled = function (graph) { + if (nodeIDs.length < 2) return 'not_eligible'; - if (err) { return callback(err, d); } + for (var i = 0; i < nodeIDs.length; i++) { + var entity = graph.entity(nodeIDs[i]); + if (entity.type !== 'node') return 'not_eligible'; + } - var key = d.issueKey; - var url = (_impOsmUrls[key]) + "/comment"; - var payload = { - username: user.display_name, - targetIds: [ d.identifier ] - }; + return actionConnect(nodeIDs).disabled(graph); + }; - if (d.newStatus) { - payload.status = d.newStatus; - payload.text = 'status changed'; - } + return action; + } - // Comment take place of default text - if (d.newComment) { - payload.text = d.newComment; + function osmChangeset() { + if (!(this instanceof osmChangeset)) { + return new osmChangeset().initialize(arguments); + } else if (arguments.length) { + this.initialize(arguments); + } + } + osmEntity.changeset = osmChangeset; + osmChangeset.prototype = Object.create(osmEntity.prototype); + Object.assign(osmChangeset.prototype, { + type: 'changeset', + extent: function extent() { + return new geoExtent(); + }, + geometry: function geometry() { + return 'changeset'; + }, + asJXON: function asJXON() { + return { + osm: { + changeset: { + tag: Object.keys(this.tags).map(function (k) { + return { + '@k': k, + '@v': this.tags[k] + }; + }, this), + '@version': 0.6, + '@generator': 'iD' + } + } + }; + }, + // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange) + // XML. Returns a string. + osmChangeJXON: function osmChangeJXON(changes) { + var changeset_id = this.id; + + function nest(x, order) { + var groups = {}; + + for (var i = 0; i < x.length; i++) { + var tagName = Object.keys(x[i])[0]; + if (!groups[tagName]) groups[tagName] = []; + groups[tagName].push(x[i][tagName]); } - var controller = new AbortController(); - _cache$1.inflightPost[d.id] = controller; - - var options = { - method: 'POST', - signal: controller.signal, - body: JSON.stringify(payload) - }; + var ordered = {}; + order.forEach(function (o) { + if (groups[o]) ordered[o] = groups[o]; + }); + return ordered; + } // sort relations in a changeset by dependencies - d3_json(url, options) - .then(function () { - delete _cache$1.inflightPost[d.id]; - // Just a comment, update error in cache - if (!d.newStatus) { - var now = new Date(); - var comments = d.comments ? d.comments : []; + function sort(changes) { + // find a referenced relation in the current changeset + function resolve(item) { + return relations.find(function (relation) { + return item.keyAttributes.type === 'relation' && item.keyAttributes.ref === relation['@id']; + }); + } // a new item is an item that has not been already processed - comments.push({ - username: payload.username, - text: payload.text, - timestamp: now.getTime() / 1000 - }); - this$1.replaceItem(d.update({ - comments: comments, - newComment: undefined - })); - } else { - this$1.removeItem(d); - if (d.newStatus === 'SOLVED') { - // Keep track of the number of issues closed per type to tag the changeset - if (!(d.issueKey in _cache$1.closed)) { - _cache$1.closed[d.issueKey] = 0; - } - _cache$1.closed[d.issueKey] += 1; - } - } - if (callback) { callback(null, d); } - }) - .catch(function (err) { - delete _cache$1.inflightPost[d.id]; - if (callback) { callback(err.message); } + function isNew(item) { + return !sorted[item['@id']] && !processing.find(function (proc) { + return proc['@id'] === item['@id']; }); - } - }, - + } - // Get all cached QAItems covering the viewport - getItems: function getItems(projection) { - var viewport = projection.clipExtent(); - var min = [viewport[0][0], viewport[1][1]]; - var max = [viewport[1][0], viewport[0][1]]; - var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox(); + var processing = []; + var sorted = {}; + var relations = changes.relation; + if (!relations) return changes; - return _cache$1.rtree.search(bbox).map(function (d) { return d.data; }); - }, + for (var i = 0; i < relations.length; i++) { + var relation = relations[i]; // skip relation if already sorted - // Get a QAItem from cache - // NOTE: Don't change method name until UI v3 is merged - getError: function getError(id) { - return _cache$1.data[id]; - }, + if (!sorted[relation['@id']]) { + processing.push(relation); + } - // get the name of the icon to display for this item - getIcon: function getIcon(itemType) { - return _impOsmData.icons[itemType]; - }, + while (processing.length > 0) { + var next = processing[0], + deps = next.member.map(resolve).filter(Boolean).filter(isNew); - // Replace a single QAItem in the cache - replaceItem: function replaceItem(issue) { - if (!(issue instanceof QAItem) || !issue.id) { return; } + if (deps.length === 0) { + sorted[next['@id']] = next; + processing.shift(); + } else { + processing = deps.concat(processing); + } + } + } - _cache$1.data[issue.id] = issue; - updateRtree$1(encodeIssueRtree$1(issue), true); // true = replace - return issue; - }, + changes.relation = Object.values(sorted); + return changes; + } - // Remove a single QAItem from the cache - removeItem: function removeItem(issue) { - if (!(issue instanceof QAItem) || !issue.id) { return; } + function rep(entity) { + return entity.asJXON(changeset_id); + } - delete _cache$1.data[issue.id]; - updateRtree$1(encodeIssueRtree$1(issue), false); // false = remove + return { + osmChange: { + '@version': 0.6, + '@generator': 'iD', + 'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])), + 'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']), + 'delete': Object.assign(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), { + '@if-unused': true + }) + } + }; }, - - // Used to populate `closed:improveosm:*` changeset tags - getClosedCounts: function getClosedCounts() { - return _cache$1.closed; + asGeoJSON: function asGeoJSON() { + return {}; } - }; - - var defaults = createCommonjsModule(function (module) { - function getDefaults() { - return { - baseUrl: null, - breaks: false, - gfm: true, - headerIds: true, - headerPrefix: '', - highlight: null, - langPrefix: 'language-', - mangle: true, - pedantic: false, - renderer: null, - sanitize: false, - sanitizer: null, - silent: false, - smartLists: false, - smartypants: false, - tokenizer: null, - xhtml: false - }; - } + }); - function changeDefaults(newDefaults) { - module.exports.defaults = newDefaults; + function osmNote() { + if (!(this instanceof osmNote)) { + return new osmNote().initialize(arguments); + } else if (arguments.length) { + this.initialize(arguments); + } } - module.exports = { - defaults: getDefaults(), - getDefaults: getDefaults, - changeDefaults: changeDefaults + osmNote.id = function () { + return osmNote.id.next--; }; - }); - /** - * Helpers - */ - var escapeTest = /[&<>"']/; - var escapeReplace = /[&<>"']/g; - var escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/; - var escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g; - var escapeReplacements = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''' - }; - var getEscapeReplacement = function (ch) { return escapeReplacements[ch]; }; - function escape$1(html, encode) { - if (encode) { - if (escapeTest.test(html)) { - return html.replace(escapeReplace, getEscapeReplacement); + osmNote.id.next = -1; + Object.assign(osmNote.prototype, { + type: 'note', + initialize: function initialize(sources) { + for (var i = 0; i < sources.length; ++i) { + var source = sources[i]; + + for (var prop in source) { + if (Object.prototype.hasOwnProperty.call(source, prop)) { + if (source[prop] === undefined) { + delete this[prop]; + } else { + this[prop] = source[prop]; + } + } + } } - } else { - if (escapeTestNoEncode.test(html)) { - return html.replace(escapeReplaceNoEncode, getEscapeReplacement); + + if (!this.id) { + this.id = osmNote.id().toString(); } + + return this; + }, + extent: function extent() { + return new geoExtent(this.loc); + }, + update: function update(attrs) { + return osmNote(this, attrs); // {v: 1 + (this.v || 0)} + }, + isNew: function isNew() { + return this.id < 0; + }, + move: function move(loc) { + return this.update({ + loc: loc + }); } + }); - return html; + function osmRelation() { + if (!(this instanceof osmRelation)) { + return new osmRelation().initialize(arguments); + } else if (arguments.length) { + this.initialize(arguments); + } } + osmEntity.relation = osmRelation; + osmRelation.prototype = Object.create(osmEntity.prototype); - var unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig; + osmRelation.creationOrder = function (a, b) { + var aId = parseInt(osmEntity.id.toOSM(a.id), 10); + var bId = parseInt(osmEntity.id.toOSM(b.id), 10); + if (aId < 0 || bId < 0) return aId - bId; + return bId - aId; + }; - function unescape$1(html) { - // explicitly match decimal, hex, and named HTML entities - return html.replace(unescapeTest, function (_, n) { - n = n.toLowerCase(); - if (n === 'colon') { return ':'; } - if (n.charAt(0) === '#') { - return n.charAt(1) === 'x' - ? String.fromCharCode(parseInt(n.substring(2), 16)) - : String.fromCharCode(+n.substring(1)); + Object.assign(osmRelation.prototype, { + type: 'relation', + members: [], + copy: function copy(resolver, copies) { + if (copies[this.id]) return copies[this.id]; + var copy = osmEntity.prototype.copy.call(this, resolver, copies); + var members = this.members.map(function (member) { + return Object.assign({}, member, { + id: resolver.entity(member.id).copy(resolver, copies).id + }); + }); + copy = copy.update({ + members: members + }); + copies[this.id] = copy; + return copy; + }, + extent: function extent(resolver, memo) { + return resolver["transient"](this, 'extent', function () { + if (memo && memo[this.id]) return geoExtent(); + memo = memo || {}; + memo[this.id] = true; + var extent = geoExtent(); + + for (var i = 0; i < this.members.length; i++) { + var member = resolver.hasEntity(this.members[i].id); + + if (member) { + extent._extend(member.extent(resolver, memo)); + } + } + + return extent; + }); + }, + geometry: function geometry(graph) { + return graph["transient"](this, 'geometry', function () { + return this.isMultipolygon() ? 'area' : 'relation'; + }); + }, + isDegenerate: function isDegenerate() { + return this.members.length === 0; + }, + // Return an array of members, each extended with an 'index' property whose value + // is the member index. + indexedMembers: function indexedMembers() { + var result = new Array(this.members.length); + + for (var i = 0; i < this.members.length; i++) { + result[i] = Object.assign({}, this.members[i], { + index: i + }); } - return ''; - }); - } - var caret = /(^|[^\[])\^/g; - function edit(regex, opt) { - regex = regex.source || regex; - opt = opt || ''; - var obj = { - replace: function (name, val) { - val = val.source || val; - val = val.replace(caret, '$1'); - regex = regex.replace(name, val); - return obj; - }, - getRegex: function () { - return new RegExp(regex, opt); + return result; + }, + // Return the first member with the given role. A copy of the member object + // is returned, extended with an 'index' property whose value is the member index. + memberByRole: function memberByRole(role) { + for (var i = 0; i < this.members.length; i++) { + if (this.members[i].role === role) { + return Object.assign({}, this.members[i], { + index: i + }); + } } - }; - return obj; - } + }, + // Same as memberByRole, but returns all members with the given role + membersByRole: function membersByRole(role) { + var result = []; - var nonWordAndColonTest = /[^\w:]/g; - var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i; - function cleanUrl(sanitize, base, href) { - if (sanitize) { - var prot; - try { - prot = decodeURIComponent(unescape$1(href)) - .replace(nonWordAndColonTest, '') - .toLowerCase(); - } catch (e) { - return null; + for (var i = 0; i < this.members.length; i++) { + if (this.members[i].role === role) { + result.push(Object.assign({}, this.members[i], { + index: i + })); + } } - if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) { - return null; + + return result; + }, + // Return the first member with the given id. A copy of the member object + // is returned, extended with an 'index' property whose value is the member index. + memberById: function memberById(id) { + for (var i = 0; i < this.members.length; i++) { + if (this.members[i].id === id) { + return Object.assign({}, this.members[i], { + index: i + }); + } + } + }, + // Return the first member with the given id and role. A copy of the member object + // is returned, extended with an 'index' property whose value is the member index. + memberByIdAndRole: function memberByIdAndRole(id, role) { + for (var i = 0; i < this.members.length; i++) { + if (this.members[i].id === id && this.members[i].role === role) { + return Object.assign({}, this.members[i], { + index: i + }); + } + } + }, + addMember: function addMember(member, index) { + var members = this.members.slice(); + members.splice(index === undefined ? members.length : index, 0, member); + return this.update({ + members: members + }); + }, + updateMember: function updateMember(member, index) { + var members = this.members.slice(); + members.splice(index, 1, Object.assign({}, members[index], member)); + return this.update({ + members: members + }); + }, + removeMember: function removeMember(index) { + var members = this.members.slice(); + members.splice(index, 1); + return this.update({ + members: members + }); + }, + removeMembersWithID: function removeMembersWithID(id) { + var members = this.members.filter(function (m) { + return m.id !== id; + }); + return this.update({ + members: members + }); + }, + moveMember: function moveMember(fromIndex, toIndex) { + var members = this.members.slice(); + members.splice(toIndex, 0, members.splice(fromIndex, 1)[0]); + return this.update({ + members: members + }); + }, + // Wherever a member appears with id `needle.id`, replace it with a member + // with id `replacement.id`, type `replacement.type`, and the original role, + // By default, adding a duplicate member (by id and role) is prevented. + // Return an updated relation. + replaceMember: function replaceMember(needle, replacement, keepDuplicates) { + if (!this.memberById(needle.id)) return this; + var members = []; + + for (var i = 0; i < this.members.length; i++) { + var member = this.members[i]; + + if (member.id !== needle.id) { + members.push(member); + } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) { + members.push({ + id: replacement.id, + type: replacement.type, + role: member.role + }); + } } - } - if (base && !originIndependentUrl.test(href)) { - href = resolveUrl(base, href); - } - try { - href = encodeURI(href).replace(/%25/g, '%'); - } catch (e$1) { - return null; - } - return href; - } - var baseUrls = {}; - var justDomain = /^[^:]+:\/*[^/]*$/; - var protocol = /^([^:]+:)[\s\S]*$/; - var domain = /^([^:]+:\/*[^/]*)[\s\S]*$/; + return this.update({ + members: members + }); + }, + asJXON: function asJXON(changeset_id) { + var r = { + relation: { + '@id': this.osmId(), + '@version': this.version || 0, + member: this.members.map(function (member) { + return { + keyAttributes: { + type: member.type, + role: member.role, + ref: osmEntity.id.toOSM(member.id) + } + }; + }, this), + tag: Object.keys(this.tags).map(function (k) { + return { + keyAttributes: { + k: k, + v: this.tags[k] + } + }; + }, this) + } + }; - function resolveUrl(base, href) { - if (!baseUrls[' ' + base]) { - // we can ignore everything in base after the last slash of its path component, - // but we might need to add _that_ - // https://tools.ietf.org/html/rfc3986#section-3 - if (justDomain.test(base)) { - baseUrls[' ' + base] = base + '/'; - } else { - baseUrls[' ' + base] = rtrim(base, '/', true); + if (changeset_id) { + r.relation['@changeset'] = changeset_id; } - } - base = baseUrls[' ' + base]; - var relativeBase = base.indexOf(':') === -1; - if (href.substring(0, 2) === '//') { - if (relativeBase) { - return href; - } - return base.replace(protocol, '$1') + href; - } else if (href.charAt(0) === '/') { - if (relativeBase) { - return href; + return r; + }, + asGeoJSON: function asGeoJSON(resolver) { + return resolver["transient"](this, 'GeoJSON', function () { + if (this.isMultipolygon()) { + return { + type: 'MultiPolygon', + coordinates: this.multipolygon(resolver) + }; + } else { + return { + type: 'FeatureCollection', + properties: this.tags, + features: this.members.map(function (member) { + return Object.assign({ + role: member.role + }, resolver.entity(member.id).asGeoJSON(resolver)); + }) + }; + } + }); + }, + area: function area(resolver) { + return resolver["transient"](this, 'area', function () { + return d3_geoArea(this.asGeoJSON(resolver)); + }); + }, + isMultipolygon: function isMultipolygon() { + return this.tags.type === 'multipolygon'; + }, + isComplete: function isComplete(resolver) { + for (var i = 0; i < this.members.length; i++) { + if (!resolver.hasEntity(this.members[i].id)) { + return false; + } } - return base.replace(domain, '$1') + href; - } else { - return base + href; - } - } - var noopTest = { exec: function noopTest() {} }; + return true; + }, + hasFromViaTo: function hasFromViaTo() { + return this.members.some(function (m) { + return m.role === 'from'; + }) && this.members.some(function (m) { + return m.role === 'via'; + }) && this.members.some(function (m) { + return m.role === 'to'; + }); + }, + isRestriction: function isRestriction() { + return !!(this.tags.type && this.tags.type.match(/^restriction:?/)); + }, + isValidRestriction: function isValidRestriction() { + if (!this.isRestriction()) return false; + var froms = this.members.filter(function (m) { + return m.role === 'from'; + }); + var vias = this.members.filter(function (m) { + return m.role === 'via'; + }); + var tos = this.members.filter(function (m) { + return m.role === 'to'; + }); + if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false; + if (froms.some(function (m) { + return m.type !== 'way'; + })) return false; + if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false; + if (tos.some(function (m) { + return m.type !== 'way'; + })) return false; + if (vias.length === 0) return false; + if (vias.length > 1 && vias.some(function (m) { + return m.type !== 'way'; + })) return false; + return true; + }, + isConnectivity: function isConnectivity() { + return !!(this.tags.type && this.tags.type.match(/^connectivity:?/)); + }, + // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm], + // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings. + // + // This corresponds to the structure needed for rendering a multipolygon path using a + // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry. + // + // In the case of invalid geometries, this function will still return a result which + // includes the nodes of all way members, but some Nds may be unclosed and some inner + // rings not matched with the intended outer ring. + // + multipolygon: function multipolygon(resolver) { + var outers = this.members.filter(function (m) { + return 'outer' === (m.role || 'outer'); + }); + var inners = this.members.filter(function (m) { + return 'inner' === m.role; + }); + outers = osmJoinWays(outers, resolver); + inners = osmJoinWays(inners, resolver); - function merge$1(obj) { - var arguments$1 = arguments; + var sequenceToLineString = function sequenceToLineString(sequence) { + if (sequence.nodes.length > 2 && sequence.nodes[0] !== sequence.nodes[sequence.nodes.length - 1]) { + // close unclosed parts to ensure correct area rendering - #2945 + sequence.nodes.push(sequence.nodes[0]); + } - var i = 1, - target, - key; + return sequence.nodes.map(function (node) { + return node.loc; + }); + }; - for (; i < arguments.length; i++) { - target = arguments$1[i]; - for (key in target) { - if (Object.prototype.hasOwnProperty.call(target, key)) { - obj[key] = target[key]; + outers = outers.map(sequenceToLineString); + inners = inners.map(sequenceToLineString); + var result = outers.map(function (o) { + // Heuristic for detecting counterclockwise winding order. Assumes + // that OpenStreetMap polygons are not hemisphere-spanning. + return [d3_geoArea({ + type: 'Polygon', + coordinates: [o] + }) > 2 * Math.PI ? o.reverse() : o]; + }); + + function findOuter(inner) { + var o, outer; + + for (o = 0; o < outers.length; o++) { + outer = outers[o]; + + if (geoPolygonContainsPolygon(outer, inner)) { + return o; + } + } + + for (o = 0; o < outers.length; o++) { + outer = outers[o]; + + if (geoPolygonIntersectsPolygon(outer, inner, false)) { + return o; + } } } - } - return obj; - } + for (var i = 0; i < inners.length; i++) { + var inner = inners[i]; - function splitCells(tableRow, count) { - // ensure that every cell-delimiting pipe has a space - // before it to distinguish it from an escaped pipe - var row = tableRow.replace(/\|/g, function (match, offset, str) { - var escaped = false, - curr = offset; - while (--curr >= 0 && str[curr] === '\\') { escaped = !escaped; } - if (escaped) { - // odd number of slashes means | is escaped - // so we leave it alone - return '|'; + if (d3_geoArea({ + type: 'Polygon', + coordinates: [inner] + }) < 2 * Math.PI) { + inner = inner.reverse(); + } + + var o = findOuter(inners[i]); + + if (o !== undefined) { + result[o].push(inners[i]); } else { - // add space before unescaped | - return ' |'; + result.push([inners[i]]); // Invalid geometry } - }), - cells = row.split(/ \|/); - var i = 0; + } - if (cells.length > count) { - cells.splice(count); - } else { - while (cells.length < count) { cells.push(''); } + return result; } + }); - for (; i < cells.length; i++) { - // leading or trailing whitespace is ignored per the gfm spec - cells[i] = cells[i].trim().replace(/\\\|/g, '|'); - } - return cells; - } + var QAItem = /*#__PURE__*/function () { + function QAItem(loc, service, itemType, id, props) { + _classCallCheck$1(this, QAItem); - // Remove trailing 'c's. Equivalent to str.replace(/c*$/, ''). - // /c*$/ is vulnerable to REDOS. - // invert: Remove suffix of non-c chars instead. Default falsey. - function rtrim(str, c, invert) { - var l = str.length; - if (l === 0) { - return ''; - } + // Store required properties + this.loc = loc; + this.service = service.title; + this.itemType = itemType; // All issues must have an ID for selection, use generic if none specified - // Length of suffix matching the invert condition. - var suffLen = 0; + this.id = id ? id : "".concat(QAItem.id()); + this.update(props); // Some QA services have marker icons to differentiate issues - // Step left until we fail to match the invert condition. - while (suffLen < l) { - var currChar = str.charAt(l - suffLen - 1); - if (currChar === c && !invert) { - suffLen++; - } else if (currChar !== c && invert) { - suffLen++; - } else { - break; + if (service && typeof service.getIcon === 'function') { + this.icon = service.getIcon(itemType); } } - return str.substr(0, l - suffLen); - } + _createClass$1(QAItem, [{ + key: "update", + value: function update(props) { + var _this = this; - function findClosingBracket(str, b) { - if (str.indexOf(b[1]) === -1) { - return -1; - } - var l = str.length; - var level = 0, - i = 0; - for (; i < l; i++) { - if (str[i] === '\\') { - i++; - } else if (str[i] === b[0]) { - level++; - } else if (str[i] === b[1]) { - level--; - if (level < 0) { - return i; - } + // You can't override this initial information + var loc = this.loc, + service = this.service, + itemType = this.itemType, + id = this.id; + Object.keys(props).forEach(function (prop) { + return _this[prop] = props[prop]; + }); + this.loc = loc; + this.service = service; + this.itemType = itemType; + this.id = id; + return this; + } // Generic handling for newly created QAItems + + }], [{ + key: "id", + value: function id() { + return this.nextId--; } - } - return -1; - } + }]); + + return QAItem; + }(); + QAItem.nextId = -1; + + // + // Optionally, split only the given ways, if multiple ways share + // the given node. + // + // This is the inverse of `iD.actionJoin`. + // + // For testing convenience, accepts an ID to assign to the new way. + // Normally, this will be undefined and the way will automatically + // be assigned a new ID. + // + // Reference: + // https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as + // + + function actionSplit(nodeIds, newWayIds) { + // accept single ID for backwards-compatiblity + if (typeof nodeIds === 'string') nodeIds = [nodeIds]; + + var _wayIDs; // the strategy for picking which way will have a new version and which way is newly created + + + var _keepHistoryOn = 'longest'; // 'longest', 'first' + // The IDs of the ways actually created by running this action + + var _createdWayIDs = []; + + function dist(graph, nA, nB) { + var locA = graph.entity(nA).loc; + var locB = graph.entity(nB).loc; + var epsilon = 1e-6; + return locA && locB ? geoSphericalDistance(locA, locB) : epsilon; + } // If the way is closed, we need to search for a partner node + // to split the way at. + // + // The following looks for a node that is both far away from + // the initial node in terms of way segment length and nearby + // in terms of beeline-distance. This assures that areas get + // split on the most "natural" points (independent of the number + // of nodes). + // For example: bone-shaped areas get split across their waist + // line, circles across the diameter. + + + function splitArea(nodes, idxA, graph) { + var lengths = new Array(nodes.length); + var length; + var i; + var best = 0; + var idxB; - function checkSanitizeDeprecation(opt) { - if (opt && opt.sanitize && !opt.silent) { - console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options'); - } - } + function wrap(index) { + return utilWrap(index, nodes.length); + } // calculate lengths - var helpers = { - escape: escape$1, - unescape: unescape$1, - edit: edit, - cleanUrl: cleanUrl, - resolveUrl: resolveUrl, - noopTest: noopTest, - merge: merge$1, - splitCells: splitCells, - rtrim: rtrim, - findClosingBracket: findClosingBracket, - checkSanitizeDeprecation: checkSanitizeDeprecation - }; - var defaults$1 = defaults.defaults; - var rtrim$1 = helpers.rtrim; - var splitCells$1 = helpers.splitCells; - var escape$2 = helpers.escape; - var findClosingBracket$1 = helpers.findClosingBracket; + length = 0; - function outputLink(cap, link, raw) { - var href = link.href; - var title = link.title ? escape$2(link.title) : null; + for (i = wrap(idxA + 1); i !== idxA; i = wrap(i + 1)) { + length += dist(graph, nodes[i], nodes[wrap(i - 1)]); + lengths[i] = length; + } - if (cap[0].charAt(0) !== '!') { - return { - type: 'link', - raw: raw, - href: href, - title: title, - text: cap[1] - }; - } else { - return { - type: 'image', - raw: raw, - text: escape$2(cap[1]), - href: href, - title: title - }; - } - } + length = 0; - /** - * Tokenizer - */ - var Tokenizer_1 = /*@__PURE__*/(function () { - function Tokenizer(options) { - this.options = options || defaults$1; - } + for (i = wrap(idxA - 1); i !== idxA; i = wrap(i - 1)) { + length += dist(graph, nodes[i], nodes[wrap(i + 1)]); - Tokenizer.prototype.space = function space (src) { - var cap = this.rules.block.newline.exec(src); - if (cap) { - if (cap[0].length > 1) { - return { - type: 'space', - raw: cap[0] - }; + if (length < lengths[i]) { + lengths[i] = length; } - return { raw: '\n' }; - } - }; + } // determine best opposite node to split - Tokenizer.prototype.code = function code (src, tokens) { - var cap = this.rules.block.code.exec(src); - if (cap) { - var lastToken = tokens[tokens.length - 1]; - // An indented code block cannot interrupt a paragraph. - if (lastToken && lastToken.type === 'paragraph') { - tokens.pop(); - lastToken.text += '\n' + cap[0].trimRight(); - lastToken.raw += '\n' + cap[0]; - return lastToken; - } else { - var text = cap[0].replace(/^ {4}/gm, ''); - return { - type: 'code', - raw: cap[0], - codeBlockStyle: 'indented', - text: !this.options.pedantic - ? rtrim$1(text, '\n') - : text - }; + + for (i = 0; i < nodes.length; i++) { + var cost = lengths[i] / dist(graph, nodes[idxA], nodes[i]); + + if (cost > best) { + idxB = i; + best = cost; } } - }; - Tokenizer.prototype.fences = function fences (src) { - var cap = this.rules.block.fences.exec(src); - if (cap) { - return { - type: 'code', - raw: cap[0], - lang: cap[2] ? cap[2].trim() : cap[2], - text: cap[3] || '' - }; - } - }; + return idxB; + } - Tokenizer.prototype.heading = function heading (src) { - var cap = this.rules.block.heading.exec(src); - if (cap) { - return { - type: 'heading', - raw: cap[0], - depth: cap[1].length, - text: cap[2] - }; + function totalLengthBetweenNodes(graph, nodes) { + var totalLength = 0; + + for (var i = 0; i < nodes.length - 1; i++) { + totalLength += dist(graph, nodes[i], nodes[i + 1]); } - }; - Tokenizer.prototype.nptable = function nptable (src) { - var cap = this.rules.block.nptable.exec(src); - if (cap) { - var item = { - type: 'table', - header: splitCells$1(cap[1].replace(/^ *| *\| *$/g, '')), - align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */), - cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : [], - raw: cap[0] - }; + return totalLength; + } - if (item.header.length === item.align.length) { - var l = item.align.length; - var i; - for (i = 0; i < l; i++) { - if (/^ *-+: *$/.test(item.align[i])) { - item.align[i] = 'right'; - } else if (/^ *:-+: *$/.test(item.align[i])) { - item.align[i] = 'center'; - } else if (/^ *:-+ *$/.test(item.align[i])) { - item.align[i] = 'left'; - } else { - item.align[i] = null; - } - } + function split(graph, nodeId, wayA, newWayId) { + var wayB = osmWay({ + id: newWayId, + tags: wayA.tags + }); // `wayB` is the NEW way - l = item.cells.length; - for (i = 0; i < l; i++) { - item.cells[i] = splitCells$1(item.cells[i], item.header.length); - } + var origNodes = wayA.nodes.slice(); + var nodesA; + var nodesB; + var isArea = wayA.isArea(); + var isOuter = osmIsOldMultipolygonOuterMember(wayA, graph); - return item; + if (wayA.isClosed()) { + var nodes = wayA.nodes.slice(0, -1); + var idxA = nodes.indexOf(nodeId); + var idxB = splitArea(nodes, idxA, graph); + + if (idxB < idxA) { + nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1)); + nodesB = nodes.slice(idxB, idxA + 1); + } else { + nodesA = nodes.slice(idxA, idxB + 1); + nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1)); } + } else { + var idx = wayA.nodes.indexOf(nodeId, 1); + nodesA = wayA.nodes.slice(0, idx + 1); + nodesB = wayA.nodes.slice(idx); } - }; - Tokenizer.prototype.hr = function hr (src) { - var cap = this.rules.block.hr.exec(src); - if (cap) { - return { - type: 'hr', - raw: cap[0] - }; - } - }; + var lengthA = totalLengthBetweenNodes(graph, nodesA); + var lengthB = totalLengthBetweenNodes(graph, nodesB); - Tokenizer.prototype.blockquote = function blockquote (src) { - var cap = this.rules.block.blockquote.exec(src); - if (cap) { - var text = cap[0].replace(/^ *> ?/gm, ''); + if (_keepHistoryOn === 'longest' && lengthB > lengthA) { + // keep the history on the longer way, regardless of the node count + wayA = wayA.update({ + nodes: nodesB + }); + wayB = wayB.update({ + nodes: nodesA + }); + var temp = lengthA; + lengthA = lengthB; + lengthB = temp; + } else { + wayA = wayA.update({ + nodes: nodesA + }); + wayB = wayB.update({ + nodes: nodesB + }); + } - return { - type: 'blockquote', - raw: cap[0], - text: text - }; + if (wayA.tags.step_count) { + // divide up the the step count proportionally between the two ways + var stepCount = parseFloat(wayA.tags.step_count); + + if (stepCount && // ensure a number + isFinite(stepCount) && // ensure positive + stepCount > 0 && // ensure integer + Math.round(stepCount) === stepCount) { + var tagsA = Object.assign({}, wayA.tags); + var tagsB = Object.assign({}, wayB.tags); + var ratioA = lengthA / (lengthA + lengthB); + var countA = Math.round(stepCount * ratioA); + tagsA.step_count = countA.toString(); + tagsB.step_count = (stepCount - countA).toString(); + wayA = wayA.update({ + tags: tagsA + }); + wayB = wayB.update({ + tags: tagsB + }); + } } - }; - Tokenizer.prototype.list = function list (src) { - var cap = this.rules.block.list.exec(src); - if (cap) { - var raw = cap[0]; - var bull = cap[2]; - var isordered = bull.length > 1; + graph = graph.replace(wayA); + graph = graph.replace(wayB); + graph.parentRelations(wayA).forEach(function (relation) { + var member; // Turn restrictions - make sure: + // 1. Splitting a FROM/TO way - only `wayA` OR `wayB` remains in relation + // (whichever one is connected to the VIA node/ways) + // 2. Splitting a VIA way - `wayB` remains in relation as a VIA way - var list = { - type: 'list', - raw: raw, - ordered: isordered, - start: isordered ? +bull : '', - loose: false, - items: [] - }; + if (relation.hasFromViaTo()) { + var f = relation.memberByRole('from'); + var v = relation.membersByRole('via'); + var t = relation.memberByRole('to'); + var i; // 1. split a FROM/TO - // Get each top-level item. - var itemMatch = cap[0].match(this.rules.block.item); + if (f.id === wayA.id || t.id === wayA.id) { + var keepB = false; - var next = false, - item, - space, - b, - addBack, - loose, - istask, - ischecked; + if (v.length === 1 && v[0].type === 'node') { + // check via node + keepB = wayB.contains(v[0].id); + } else { + // check via way(s) + for (i = 0; i < v.length; i++) { + if (v[i].type === 'way') { + var wayVia = graph.hasEntity(v[i].id); + + if (wayVia && utilArrayIntersection(wayB.nodes, wayVia.nodes).length) { + keepB = true; + break; + } + } + } + } - var l = itemMatch.length; - for (var i = 0; i < l; i++) { - item = itemMatch[i]; - raw = item; + if (keepB) { + relation = relation.replaceMember(wayA, wayB); + graph = graph.replace(relation); + } // 2. split a VIA - // Remove the list item's bullet - // so it is seen as the next token. - space = item.length; - item = item.replace(/^ *([*+-]|\d+\.) */, ''); + } else { + for (i = 0; i < v.length; i++) { + if (v[i].type === 'way' && v[i].id === wayA.id) { + member = { + id: wayB.id, + type: 'way', + role: 'via' + }; + graph = actionAddMember(relation.id, member, v[i].index + 1)(graph); + break; + } + } + } // All other relations (Routes, Multipolygons, etc): + // 1. Both `wayA` and `wayB` remain in the relation + // 2. But must be inserted as a pair (see `actionAddMember` for details) - // Outdent whatever the - // list item contains. Hacky. - if (~item.indexOf('\n ')) { - space -= item.length; - item = !this.options.pedantic - ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '') - : item.replace(/^ {1,4}/gm, ''); + } else { + if (relation === isOuter) { + graph = graph.replace(relation.mergeTags(wayA.tags)); + graph = graph.replace(wayA.update({ + tags: {} + })); + graph = graph.replace(wayB.update({ + tags: {} + })); } - // Determine whether the next list item belongs here. - // Backpedal if it does not belong in this list. - if (i !== l - 1) { - b = this.rules.block.bullet.exec(itemMatch[i + 1])[0]; - if (bull.length > 1 ? b.length === 1 - : (b.length > 1 || (this.options.smartLists && b !== bull))) { - addBack = itemMatch.slice(i + 1).join('\n'); - list.raw = list.raw.substring(0, list.raw.length - addBack.length); - i = l - 1; - } - } + member = { + id: wayB.id, + type: 'way', + role: relation.memberById(wayA.id).role + }; + var insertPair = { + originalID: wayA.id, + insertedID: wayB.id, + nodes: origNodes + }; + graph = actionAddMember(relation.id, member, undefined, insertPair)(graph); + } + }); - // Determine whether item is loose or not. - // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/ - // for discount behavior. - loose = next || /\n\n(?!\s*$)/.test(item); - if (i !== l - 1) { - next = item.charAt(item.length - 1) === '\n'; - if (!loose) { loose = next; } - } + if (!isOuter && isArea) { + var multipolygon = osmRelation({ + tags: Object.assign({}, wayA.tags, { + type: 'multipolygon' + }), + members: [{ + id: wayA.id, + role: 'outer', + type: 'way' + }, { + id: wayB.id, + role: 'outer', + type: 'way' + }] + }); + graph = graph.replace(multipolygon); + graph = graph.replace(wayA.update({ + tags: {} + })); + graph = graph.replace(wayB.update({ + tags: {} + })); + } - if (loose) { - list.loose = true; - } + _createdWayIDs.push(wayB.id); - // Check for task list items - istask = /^\[[ xX]\] /.test(item); - ischecked = undefined; - if (istask) { - ischecked = item[1] !== ' '; - item = item.replace(/^\[[ xX]\] +/, ''); - } + return graph; + } - list.items.push({ - raw: raw, - task: istask, - checked: ischecked, - loose: loose, - text: item - }); - } + var action = function action(graph) { + _createdWayIDs = []; + var newWayIndex = 0; - return list; - } - }; + for (var i = 0; i < nodeIds.length; i++) { + var nodeId = nodeIds[i]; + var candidates = action.waysForNode(nodeId, graph); - Tokenizer.prototype.html = function html (src) { - var cap = this.rules.block.html.exec(src); - if (cap) { - return { - type: this.options.sanitize - ? 'paragraph' - : 'html', - raw: cap[0], - pre: !this.options.sanitizer - && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'), - text: this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape$2(cap[0])) : cap[0] - }; + for (var j = 0; j < candidates.length; j++) { + graph = split(graph, nodeId, candidates[j], newWayIds && newWayIds[newWayIndex]); + newWayIndex += 1; + } } + + return graph; }; - Tokenizer.prototype.def = function def (src) { - var cap = this.rules.block.def.exec(src); - if (cap) { - if (cap[3]) { cap[3] = cap[3].substring(1, cap[3].length - 1); } - var tag = cap[1].toLowerCase().replace(/\s+/g, ' '); - return { - tag: tag, - raw: cap[0], - href: cap[2], - title: cap[3] - }; - } + action.getCreatedWayIDs = function () { + return _createdWayIDs; }; - Tokenizer.prototype.table = function table (src) { - var cap = this.rules.block.table.exec(src); - if (cap) { - var item = { - type: 'table', - header: splitCells$1(cap[1].replace(/^ *| *\| *$/g, '')), - align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */), - cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : [] - }; + action.waysForNode = function (nodeId, graph) { + var node = graph.entity(nodeId); + var splittableParents = graph.parentWays(node).filter(isSplittable); - if (item.header.length === item.align.length) { - item.raw = cap[0]; + if (!_wayIDs) { + // If the ways to split aren't specified, only split the lines. + // If there are no lines to split, split the areas. + var hasLine = splittableParents.some(function (parent) { + return parent.geometry(graph) === 'line'; + }); - var l = item.align.length; - var i; - for (i = 0; i < l; i++) { - if (/^ *-+: *$/.test(item.align[i])) { - item.align[i] = 'right'; - } else if (/^ *:-+: *$/.test(item.align[i])) { - item.align[i] = 'center'; - } else if (/^ *:-+ *$/.test(item.align[i])) { - item.align[i] = 'left'; - } else { - item.align[i] = null; - } - } + if (hasLine) { + return splittableParents.filter(function (parent) { + return parent.geometry(graph) === 'line'; + }); + } + } - l = item.cells.length; - for (i = 0; i < l; i++) { - item.cells[i] = splitCells$1( - item.cells[i].replace(/^ *\| *| *\| *$/g, ''), - item.header.length); - } + return splittableParents; - return item; + function isSplittable(parent) { + // If the ways to split are specified, ignore everything else. + if (_wayIDs && _wayIDs.indexOf(parent.id) === -1) return false; // We can fake splitting closed ways at their endpoints... + + if (parent.isClosed()) return true; // otherwise, we can't split nodes at their endpoints. + + for (var i = 1; i < parent.nodes.length - 1; i++) { + if (parent.nodes[i] === nodeId) return true; } + + return false; } }; - Tokenizer.prototype.lheading = function lheading (src) { - var cap = this.rules.block.lheading.exec(src); - if (cap) { - return { - type: 'heading', - raw: cap[0], - depth: cap[2].charAt(0) === '=' ? 1 : 2, - text: cap[1] - }; - } + action.ways = function (graph) { + return utilArrayUniq([].concat.apply([], nodeIds.map(function (nodeId) { + return action.waysForNode(nodeId, graph); + }))); }; - Tokenizer.prototype.paragraph = function paragraph (src) { - var cap = this.rules.block.paragraph.exec(src); - if (cap) { - return { - type: 'paragraph', - raw: cap[0], - text: cap[1].charAt(cap[1].length - 1) === '\n' - ? cap[1].slice(0, -1) - : cap[1] - }; + action.disabled = function (graph) { + for (var i = 0; i < nodeIds.length; i++) { + var nodeId = nodeIds[i]; + var candidates = action.waysForNode(nodeId, graph); + + if (candidates.length === 0 || _wayIDs && _wayIDs.length !== candidates.length) { + return 'not_eligible'; + } } }; - Tokenizer.prototype.text = function text (src) { - var cap = this.rules.block.text.exec(src); - if (cap) { - return { - type: 'text', - raw: cap[0], - text: cap[0] - }; - } + action.limitWays = function (val) { + if (!arguments.length) return _wayIDs; + _wayIDs = val; + return action; }; - Tokenizer.prototype.escape = function escape$1 (src) { - var cap = this.rules.inline.escape.exec(src); - if (cap) { - return { - type: 'escape', - raw: cap[0], - text: escape$2(cap[1]) - }; - } + action.keepHistoryOn = function (val) { + if (!arguments.length) return _keepHistoryOn; + _keepHistoryOn = val; + return action; }; - Tokenizer.prototype.tag = function tag (src, inLink, inRawBlock) { - var cap = this.rules.inline.tag.exec(src); - if (cap) { - if (!inLink && /^/i.test(cap[0])) { - inLink = false; - } - if (!inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) { - inRawBlock = true; - } else if (inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) { - inRawBlock = false; - } + return action; + } - return { - type: this.options.sanitize - ? 'text' - : 'html', - raw: cap[0], - inLink: inLink, - inRawBlock: inRawBlock, - text: this.options.sanitize - ? (this.options.sanitizer - ? this.options.sanitizer(cap[0]) - : escape$2(cap[0])) - : cap[0] - }; - } - }; + function coreGraph(other, mutable) { + if (!(this instanceof coreGraph)) return new coreGraph(other, mutable); - Tokenizer.prototype.link = function link (src) { - var cap = this.rules.inline.link.exec(src); - if (cap) { - var lastParenIndex = findClosingBracket$1(cap[2], '()'); - if (lastParenIndex > -1) { - var start = cap[0].indexOf('!') === 0 ? 5 : 4; - var linkLen = start + cap[1].length + lastParenIndex; - cap[2] = cap[2].substring(0, lastParenIndex); - cap[0] = cap[0].substring(0, linkLen).trim(); - cap[3] = ''; - } - var href = cap[2]; - var title = ''; - if (this.options.pedantic) { - var link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href); + if (other instanceof coreGraph) { + var base = other.base(); + this.entities = Object.assign(Object.create(base.entities), other.entities); + this._parentWays = Object.assign(Object.create(base.parentWays), other._parentWays); + this._parentRels = Object.assign(Object.create(base.parentRels), other._parentRels); + } else { + this.entities = Object.create({}); + this._parentWays = Object.create({}); + this._parentRels = Object.create({}); + this.rebase(other || [], [this]); + } - if (link) { - href = link[1]; - title = link[3]; - } else { - title = ''; - } - } else { - title = cap[3] ? cap[3].slice(1, -1) : ''; - } - href = href.trim().replace(/^<([\s\S]*)>$/, '$1'); - var token = outputLink(cap, { - href: href ? href.replace(this.rules.inline._escapes, '$1') : href, - title: title ? title.replace(this.rules.inline._escapes, '$1') : title - }, cap[0]); - return token; - } - }; + this.transients = {}; + this._childNodes = {}; + this.frozen = !mutable; + } + coreGraph.prototype = { + hasEntity: function hasEntity(id) { + return this.entities[id]; + }, + entity: function entity(id) { + var entity = this.entities[id]; //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376 - Tokenizer.prototype.reflink = function reflink (src, links) { - var cap; - if ((cap = this.rules.inline.reflink.exec(src)) - || (cap = this.rules.inline.nolink.exec(src))) { - var link = (cap[2] || cap[1]).replace(/\s+/g, ' '); - link = links[link.toLowerCase()]; - if (!link || !link.href) { - var text = cap[0].charAt(0); - return { - type: 'text', - raw: text, - text: text - }; - } - var token = outputLink(cap, link, cap[0]); - return token; + if (!entity) { + entity = this.entities.__proto__[id]; // eslint-disable-line no-proto } - }; - Tokenizer.prototype.strong = function strong (src) { - var cap = this.rules.inline.strong.exec(src); - if (cap) { - return { - type: 'strong', - raw: cap[0], - text: cap[4] || cap[3] || cap[2] || cap[1] - }; + if (!entity) { + throw new Error('entity ' + id + ' not found'); } - }; - Tokenizer.prototype.em = function em (src) { - var cap = this.rules.inline.em.exec(src); - if (cap) { - return { - type: 'em', - raw: cap[0], - text: cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1] - }; + return entity; + }, + geometry: function geometry(id) { + return this.entity(id).geometry(this); + }, + "transient": function transient(entity, key, fn) { + var id = entity.id; + var transients = this.transients[id] || (this.transients[id] = {}); + + if (transients[key] !== undefined) { + return transients[key]; } - }; - Tokenizer.prototype.codespan = function codespan (src) { - var cap = this.rules.inline.code.exec(src); - if (cap) { - return { - type: 'codespan', - raw: cap[0], - text: escape$2(cap[2].trim(), true) - }; + transients[key] = fn.call(entity); + return transients[key]; + }, + parentWays: function parentWays(entity) { + var parents = this._parentWays[entity.id]; + var result = []; + + if (parents) { + parents.forEach(function (id) { + result.push(this.entity(id)); + }, this); } - }; - Tokenizer.prototype.br = function br (src) { - var cap = this.rules.inline.br.exec(src); - if (cap) { - return { - type: 'br', - raw: cap[0] - }; + return result; + }, + isPoi: function isPoi(entity) { + var parents = this._parentWays[entity.id]; + return !parents || parents.size === 0; + }, + isShared: function isShared(entity) { + var parents = this._parentWays[entity.id]; + return parents && parents.size > 1; + }, + parentRelations: function parentRelations(entity) { + var parents = this._parentRels[entity.id]; + var result = []; + + if (parents) { + parents.forEach(function (id) { + result.push(this.entity(id)); + }, this); } - }; - Tokenizer.prototype.del = function del (src) { - var cap = this.rules.inline.del.exec(src); - if (cap) { - return { - type: 'del', - raw: cap[0], - text: cap[1] - }; + return result; + }, + parentMultipolygons: function parentMultipolygons(entity) { + return this.parentRelations(entity).filter(function (relation) { + return relation.isMultipolygon(); + }); + }, + childNodes: function childNodes(entity) { + if (this._childNodes[entity.id]) return this._childNodes[entity.id]; + if (!entity.nodes) return []; + var nodes = []; + + for (var i = 0; i < entity.nodes.length; i++) { + nodes[i] = this.entity(entity.nodes[i]); } - }; + this._childNodes[entity.id] = nodes; + return this._childNodes[entity.id]; + }, + base: function base() { + return { + 'entities': Object.getPrototypeOf(this.entities), + 'parentWays': Object.getPrototypeOf(this._parentWays), + 'parentRels': Object.getPrototypeOf(this._parentRels) + }; + }, + // Unlike other graph methods, rebase mutates in place. This is because it + // is used only during the history operation that merges newly downloaded + // data into each state. To external consumers, it should appear as if the + // graph always contained the newly downloaded data. + rebase: function rebase(entities, stack, force) { + var base = this.base(); + var i, j, k, id; - Tokenizer.prototype.autolink = function autolink (src, mangle) { - var cap = this.rules.inline.autolink.exec(src); - if (cap) { - var text, href; - if (cap[2] === '@') { - text = escape$2(this.options.mangle ? mangle(cap[1]) : cap[1]); - href = 'mailto:' + text; - } else { - text = escape$2(cap[1]); - href = text; - } + for (i = 0; i < entities.length; i++) { + var entity = entities[i]; + if (!entity.visible || !force && base.entities[entity.id]) continue; // Merging data into the base graph - return { - type: 'link', - raw: cap[0], - text: text, - href: href, - tokens: [ - { - type: 'text', - raw: text, - text: text + base.entities[entity.id] = entity; + + this._updateCalculated(undefined, entity, base.parentWays, base.parentRels); // Restore provisionally-deleted nodes that are discovered to have an extant parent + + + if (entity.type === 'way') { + for (j = 0; j < entity.nodes.length; j++) { + id = entity.nodes[j]; + + for (k = 1; k < stack.length; k++) { + var ents = stack[k].entities; + + if (ents.hasOwnProperty(id) && ents[id] === undefined) { + delete ents[id]; + } } - ] - }; + } + } } - }; - Tokenizer.prototype.url = function url (src, mangle) { - var cap; - if (cap = this.rules.inline.url.exec(src)) { - var text, href; - if (cap[2] === '@') { - text = escape$2(this.options.mangle ? mangle(cap[0]) : cap[0]); - href = 'mailto:' + text; - } else { - // do extended autolink path validation - var prevCapZero; - do { - prevCapZero = cap[0]; - cap[0] = this.rules.inline._backpedal.exec(cap[0])[0]; - } while (prevCapZero !== cap[0]); - text = escape$2(cap[0]); - if (cap[1] === 'www.') { - href = 'http://' + text; - } else { - href = text; - } + for (i = 0; i < stack.length; i++) { + stack[i]._updateRebased(); + } + }, + _updateRebased: function _updateRebased() { + var base = this.base(); + Object.keys(this._parentWays).forEach(function (child) { + if (base.parentWays[child]) { + base.parentWays[child].forEach(function (id) { + if (!this.entities.hasOwnProperty(id)) { + this._parentWays[child].add(id); + } + }, this); } - return { - type: 'link', - raw: cap[0], - text: text, - href: href, - tokens: [ - { - type: 'text', - raw: text, - text: text + }, this); + Object.keys(this._parentRels).forEach(function (child) { + if (base.parentRels[child]) { + base.parentRels[child].forEach(function (id) { + if (!this.entities.hasOwnProperty(id)) { + this._parentRels[child].add(id); } - ] - }; - } - }; + }, this); + } + }, this); + this.transients = {}; // this._childNodes is not updated, under the assumption that + // ways are always downloaded with their child nodes. + }, + // Updates calculated properties (parentWays, parentRels) for the specified change + _updateCalculated: function _updateCalculated(oldentity, entity, parentWays, parentRels) { + parentWays = parentWays || this._parentWays; + parentRels = parentRels || this._parentRels; + var type = entity && entity.type || oldentity && oldentity.type; + var removed, added, i; + + if (type === 'way') { + // Update parentWays + if (oldentity && entity) { + removed = utilArrayDifference(oldentity.nodes, entity.nodes); + added = utilArrayDifference(entity.nodes, oldentity.nodes); + } else if (oldentity) { + removed = oldentity.nodes; + added = []; + } else if (entity) { + removed = []; + added = entity.nodes; + } - Tokenizer.prototype.inlineText = function inlineText (src, inRawBlock, smartypants) { - var cap = this.rules.inline.text.exec(src); - if (cap) { - var text; - if (inRawBlock) { - text = this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape$2(cap[0])) : cap[0]; - } else { - text = escape$2(this.options.smartypants ? smartypants(cap[0]) : cap[0]); + for (i = 0; i < removed.length; i++) { + // make a copy of prototype property, store as own property, and update.. + parentWays[removed[i]] = new Set(parentWays[removed[i]]); + parentWays[removed[i]]["delete"](oldentity.id); } - return { - type: 'text', - raw: cap[0], - text: text - }; - } - }; - return Tokenizer; - }()); + for (i = 0; i < added.length; i++) { + // make a copy of prototype property, store as own property, and update.. + parentWays[added[i]] = new Set(parentWays[added[i]]); + parentWays[added[i]].add(entity.id); + } + } else if (type === 'relation') { + // Update parentRels + // diff only on the IDs since the same entity can be a member multiple times with different roles + var oldentityMemberIDs = oldentity ? oldentity.members.map(function (m) { + return m.id; + }) : []; + var entityMemberIDs = entity ? entity.members.map(function (m) { + return m.id; + }) : []; + + if (oldentity && entity) { + removed = utilArrayDifference(oldentityMemberIDs, entityMemberIDs); + added = utilArrayDifference(entityMemberIDs, oldentityMemberIDs); + } else if (oldentity) { + removed = oldentityMemberIDs; + added = []; + } else if (entity) { + removed = []; + added = entityMemberIDs; + } - var noopTest$1 = helpers.noopTest; - var edit$1 = helpers.edit; - var merge$2 = helpers.merge; + for (i = 0; i < removed.length; i++) { + // make a copy of prototype property, store as own property, and update.. + parentRels[removed[i]] = new Set(parentRels[removed[i]]); + parentRels[removed[i]]["delete"](oldentity.id); + } - /** - * Block-Level Grammar - */ - var block = { - newline: /^\n+/, - code: /^( {4}[^\n]+\n*)+/, - fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/, - hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/, - heading: /^ {0,3}(#{1,6}) +([^\n]*?)(?: +#+)? *(?:\n+|$)/, - blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/, - list: /^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/, - html: '^ {0,3}(?:' // optional indentation - + '<(script|pre|style)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)' // (1) - + '|comment[^\\n]*(\\n+|$)' // (2) - + '|<\\?[\\s\\S]*?\\?>\\n*' // (3) - + '|\\n*' // (4) - + '|\\n*' // (5) - + '|)[\\s\\S]*?(?:\\n{2,}|$)' // (6) - + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag - + '|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag - + ')', - def: /^ {0,3}\[(label)\]: *\n? *]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/, - nptable: noopTest$1, - table: noopTest$1, - lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/, - // regex template, placeholders will be replaced according to different paragraph - // interruption rules of commonmark and the original markdown spec: - _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html)[^\n]+)*)/, - text: /^[^\n]+/ - }; + for (i = 0; i < added.length; i++) { + // make a copy of prototype property, store as own property, and update.. + parentRels[added[i]] = new Set(parentRels[added[i]]); + parentRels[added[i]].add(entity.id); + } + } + }, + replace: function replace(entity) { + if (this.entities[entity.id] === entity) return this; + return this.update(function () { + this._updateCalculated(this.entities[entity.id], entity); - block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/; - block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/; - block.def = edit$1(block.def) - .replace('label', block._label) - .replace('title', block._title) - .getRegex(); - - block.bullet = /(?:[*+-]|\d{1,9}\.)/; - block.item = /^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/; - block.item = edit$1(block.item, 'gm') - .replace(/bull/g, block.bullet) - .getRegex(); - - block.list = edit$1(block.list) - .replace(/bull/g, block.bullet) - .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))') - .replace('def', '\\n+(?=' + block.def.source + ')') - .getRegex(); - - block._tag = 'address|article|aside|base|basefont|blockquote|body|caption' - + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption' - + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe' - + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option' - + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr' - + '|track|ul'; - block._comment = //; - block.html = edit$1(block.html, 'i') - .replace('comment', block._comment) - .replace('tag', block._tag) - .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/) - .getRegex(); - - block.paragraph = edit$1(block._paragraph) - .replace('hr', block.hr) - .replace('heading', ' {0,3}#{1,6} ') - .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs - .replace('blockquote', ' {0,3}>') - .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n') - .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt - .replace('html', ')|<(?:script|pre|style|!--)') - .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks - .getRegex(); - - block.blockquote = edit$1(block.blockquote) - .replace('paragraph', block.paragraph) - .getRegex(); + this.entities[entity.id] = entity; + }); + }, + remove: function remove(entity) { + return this.update(function () { + this._updateCalculated(entity, undefined); - /** - * Normal Block Grammar - */ + this.entities[entity.id] = undefined; + }); + }, + revert: function revert(id) { + var baseEntity = this.base().entities[id]; + var headEntity = this.entities[id]; + if (headEntity === baseEntity) return this; + return this.update(function () { + this._updateCalculated(headEntity, baseEntity); + + delete this.entities[id]; + }); + }, + update: function update() { + var graph = this.frozen ? coreGraph(this, true) : this; - block.normal = merge$2({}, block); + for (var i = 0; i < arguments.length; i++) { + arguments[i].call(graph, graph); + } - /** - * GFM Block Grammar - */ + if (this.frozen) graph.frozen = true; + return graph; + }, + // Obliterates any existing entities + load: function load(entities) { + var base = this.base(); + this.entities = Object.create(base.entities); - block.gfm = merge$2({}, block.normal, { - nptable: '^ *([^|\\n ].*\\|.*)\\n' // Header - + ' *([-:]+ *\\|[-| :]*)' // Align - + '(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)', // Cells - table: '^ *\\|(.+)\\n' // Header - + ' *\\|?( *[-:]+[-| :]*)' // Align - + '(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)' // Cells - }); + for (var i in entities) { + this.entities[i] = entities[i]; - block.gfm.nptable = edit$1(block.gfm.nptable) - .replace('hr', block.hr) - .replace('heading', ' {0,3}#{1,6} ') - .replace('blockquote', ' {0,3}>') - .replace('code', ' {4}[^\\n]') - .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n') - .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt - .replace('html', ')|<(?:script|pre|style|!--)') - .replace('tag', block._tag) // tables can be interrupted by type (6) html blocks - .getRegex(); - - block.gfm.table = edit$1(block.gfm.table) - .replace('hr', block.hr) - .replace('heading', ' {0,3}#{1,6} ') - .replace('blockquote', ' {0,3}>') - .replace('code', ' {4}[^\\n]') - .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n') - .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt - .replace('html', ')|<(?:script|pre|style|!--)') - .replace('tag', block._tag) // tables can be interrupted by type (6) html blocks - .getRegex(); + this._updateCalculated(base.entities[i], this.entities[i]); + } - /** - * Pedantic grammar (original John Gruber's loose markdown specification) - */ + return this; + } + }; - block.pedantic = merge$2({}, block.normal, { - html: edit$1( - '^ *(?:comment *(?:\\n|\\s*$)' - + '|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)' // closed tag - + '|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))') - .replace('comment', block._comment) - .replace(/tag/g, '(?!(?:' - + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub' - + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)' - + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b') - .getRegex(), - def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, - heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/, - fences: noopTest$1, // fences not supported - paragraph: edit$1(block.normal._paragraph) - .replace('hr', block.hr) - .replace('heading', ' *#{1,6} *[^\n]') - .replace('lheading', block.lheading) - .replace('blockquote', ' {0,3}>') - .replace('|fences', '') - .replace('|list', '') - .replace('|html', '') - .getRegex() - }); + function osmTurn(turn) { + if (!(this instanceof osmTurn)) { + return new osmTurn(turn); + } - /** - * Inline-Level Grammar - */ - var inline = { - escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, - autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/, - url: noopTest$1, - tag: '^comment' - + '|^' // self-closing tag - + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag - + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. - + '|^' // declaration, e.g. - + '|^', // CDATA section - link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/, - reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/, - nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/, - strong: /^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/, - em: /^_([^\s_])_(?!_)|^_([^\s_<][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_<][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s*<\[])\*(?!\*)|^\*([^\s<"][\s\S]*?[^\s\[\*])\*(?![\]`punctuation])|^\*([^\s*"<\[][\s\S]*[^\s])\*(?!\*)/, - code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, - br: /^( {2,}|\\)\n(?!\s*$)/, - del: noopTest$1, - text: /^(`+|[^`])(?:[\s\S]*?(?:(?=[\\?@\\[^_{|}~'; - inline.em = edit$1(inline.em).replace(/punctuation/g, inline._punctuation).getRegex(); + var vgraph = coreGraph(); // virtual graph - inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g; + var i, j, k; - inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/; - 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])?)+(?![-_])/; - inline.autolink = edit$1(inline.autolink) - .replace('scheme', inline._scheme) - .replace('email', inline._email) - .getRegex(); + function memberOfRestriction(entity) { + return graph.parentRelations(entity).some(function (r) { + return r.isRestriction(); + }); + } - inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/; + function isRoad(way) { + if (way.isArea() || way.isDegenerate()) return false; + var roads = { + 'motorway': true, + 'motorway_link': true, + 'trunk': true, + 'trunk_link': true, + 'primary': true, + 'primary_link': true, + 'secondary': true, + 'secondary_link': true, + 'tertiary': true, + 'tertiary_link': true, + 'residential': true, + 'unclassified': true, + 'living_street': true, + 'service': true, + 'road': true, + 'track': true + }; + return roads[way.tags.highway]; + } + + var startNode = graph.entity(startVertexId); + var checkVertices = [startNode]; + var checkWays; + var vertices = []; + var vertexIds = []; + var vertex; + var ways = []; + var wayIds = []; + var way; + var nodes = []; + var node; + var parents = []; + var parent; // `actions` will store whatever actions must be performed to satisfy + // preconditions for adding a turn restriction to this intersection. + // - Remove any existing degenerate turn restrictions (missing from/to, etc) + // - Reverse oneways so that they are drawn in the forward direction + // - Split ways on key vertices + + var actions = []; // STEP 1: walk the graph outwards from starting vertex to search + // for more key vertices and ways to include in the intersection.. + + while (checkVertices.length) { + vertex = checkVertices.pop(); // check this vertex for parent ways that are roads + + checkWays = graph.parentWays(vertex); + var hasWays = false; + + for (i = 0; i < checkWays.length; i++) { + way = checkWays[i]; + if (!isRoad(way) && !memberOfRestriction(way)) continue; + ways.push(way); // it's a road, or it's already in a turn restriction + + hasWays = true; // check the way's children for more key vertices + + nodes = utilArrayUniq(graph.childNodes(way)); + + for (j = 0; j < nodes.length; j++) { + node = nodes[j]; + if (node === vertex) continue; // same thing + + if (vertices.indexOf(node) !== -1) continue; // seen it already + + if (geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue; // too far from start + // a key vertex will have parents that are also roads + + var hasParents = false; + parents = graph.parentWays(node); + + for (k = 0; k < parents.length; k++) { + parent = parents[k]; + if (parent === way) continue; // same thing + + if (ways.indexOf(parent) !== -1) continue; // seen it already + + if (!isRoad(parent)) continue; // not a road + + hasParents = true; + break; + } - inline.tag = edit$1(inline.tag) - .replace('comment', block._comment) - .replace('attribute', inline._attribute) - .getRegex(); + if (hasParents) { + checkVertices.push(node); + } + } + } - inline._label = /(?:\[[^\[\]]*\]|\\.|`[^`]*`|[^\[\]\\`])*?/; - inline._href = /<(?:\\[<>]?|[^\s<>\\])*>|[^\s\x00-\x1f]*/; - inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/; + if (hasWays) { + vertices.push(vertex); + } + } - inline.link = edit$1(inline.link) - .replace('label', inline._label) - .replace('href', inline._href) - .replace('title', inline._title) - .getRegex(); + vertices = utilArrayUniq(vertices); + ways = utilArrayUniq(ways); // STEP 2: Build a virtual graph containing only the entities in the intersection.. + // Everything done after this step should act on the virtual graph + // Any actions that must be performed later to the main graph go in `actions` array - inline.reflink = edit$1(inline.reflink) - .replace('label', inline._label) - .getRegex(); + ways.forEach(function (way) { + graph.childNodes(way).forEach(function (node) { + vgraph = vgraph.replace(node); + }); + vgraph = vgraph.replace(way); + graph.parentRelations(way).forEach(function (relation) { + if (relation.isRestriction()) { + if (relation.isValidRestriction(graph)) { + vgraph = vgraph.replace(relation); + } else if (relation.isComplete(graph)) { + actions.push(actionDeleteRelation(relation.id)); + } + } + }); + }); // STEP 3: Force all oneways to be drawn in the forward direction - /** - * Normal Inline Grammar - */ + ways.forEach(function (w) { + var way = vgraph.entity(w.id); - inline.normal = merge$2({}, inline); + if (way.tags.oneway === '-1') { + var action = actionReverse(way.id, { + reverseOneway: true + }); + actions.push(action); + vgraph = action(vgraph); + } + }); // STEP 4: Split ways on key vertices + + var origCount = osmEntity.id.next.way; + vertices.forEach(function (v) { + // This is an odd way to do it, but we need to find all the ways that + // will be split here, then split them one at a time to ensure that these + // actions can be replayed on the main graph exactly in the same order. + // (It is unintuitive, but the order of ways returned from graph.parentWays() + // is arbitrary, depending on how the main graph and vgraph were built) + var splitAll = actionSplit([v.id]).keepHistoryOn('first'); + + if (!splitAll.disabled(vgraph)) { + splitAll.ways(vgraph).forEach(function (way) { + var splitOne = actionSplit([v.id]).limitWays([way.id]).keepHistoryOn('first'); + actions.push(splitOne); + vgraph = splitOne(vgraph); + }); + } + }); // In here is where we should also split the intersection at nearby junction. + // for https://github.com/mapbox/iD-internal/issues/31 + // nearbyVertices.forEach(function(v) { + // }); + // Reasons why we reset the way id count here: + // 1. Continuity with way ids created by the splits so that we can replay + // these actions later if the user decides to create a turn restriction + // 2. Avoids churning way ids just by hovering over a vertex + // and displaying the turn restriction editor - /** - * Pedantic Inline Grammar - */ + osmEntity.id.next.way = origCount; // STEP 5: Update arrays to point to vgraph entities - inline.pedantic = merge$2({}, inline.normal, { - strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/, - em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/, - link: edit$1(/^!?\[(label)\]\((.*?)\)/) - .replace('label', inline._label) - .getRegex(), - reflink: edit$1(/^!?\[(label)\]\s*\[([^\]]*)\]/) - .replace('label', inline._label) - .getRegex() - }); + vertexIds = vertices.map(function (v) { + return v.id; + }); + vertices = []; + ways = []; + vertexIds.forEach(function (id) { + var vertex = vgraph.entity(id); + var parents = vgraph.parentWays(vertex); + vertices.push(vertex); + ways = ways.concat(parents); + }); + vertices = utilArrayUniq(vertices); + ways = utilArrayUniq(ways); + vertexIds = vertices.map(function (v) { + return v.id; + }); + wayIds = ways.map(function (w) { + return w.id; + }); // STEP 6: Update the ways with some metadata that will be useful for + // walking the intersection graph later and rendering turn arrows. - /** - * GFM Inline Grammar - */ + function withMetadata(way, vertexIds) { + var __oneWay = way.isOneWay(); // which affixes are key vertices? - inline.gfm = merge$2({}, inline.normal, { - escape: edit$1(inline.escape).replace('])', '~|])').getRegex(), - _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/, - url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/, - _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/, - del: /^~+(?=\S)([\s\S]*?\S)~+/, - text: /^(`+|[^`])(?:[\s\S]*?(?:(?=[\\ 0.5) { - ch = 'x' + ch.toString(16); - } - out += '&#' + ch + ';'; + return way.update({ + __first: __first, + __last: __last, + __from: __from, + __via: __via, + __to: __to, + __oneWay: __oneWay + }); } - return out; - } + ways = []; + wayIds.forEach(function (id) { + var way = withMetadata(vgraph.entity(id), vertexIds); + vgraph = vgraph.replace(way); + ways.push(way); + }); // STEP 7: Simplify - This is an iterative process where we: + // 1. Find trivial vertices with only 2 parents + // 2. trim off the leaf way from those vertices and remove from vgraph - /** - * Block Lexer - */ - var Lexer_1 = /*@__PURE__*/(function () { - function Lexer(options) { - this.tokens = []; - this.tokens.links = Object.create(null); - this.options = options || defaults$2; - this.options.tokenizer = this.options.tokenizer || new Tokenizer_1(); - this.tokenizer = this.options.tokenizer; - this.tokenizer.options = this.options; + var keepGoing; + var removeWayIds = []; + var removeVertexIds = []; - var rules = { - block: block$1.normal, - inline: inline$1.normal - }; + do { + keepGoing = false; + checkVertices = vertexIds.slice(); - if (this.options.pedantic) { - rules.block = block$1.pedantic; - rules.inline = inline$1.pedantic; - } else if (this.options.gfm) { - rules.block = block$1.gfm; - if (this.options.breaks) { - rules.inline = inline$1.breaks; - } else { - rules.inline = inline$1.gfm; - } - } - this.tokenizer.rules = rules; - } + for (i = 0; i < checkVertices.length; i++) { + var vertexId = checkVertices[i]; + vertex = vgraph.hasEntity(vertexId); - var staticAccessors = { rules: { configurable: true } }; + if (!vertex) { + if (vertexIds.indexOf(vertexId) !== -1) { + vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one + } - /** - * Expose Rules - */ - staticAccessors.rules.get = function () { - return { - block: block$1, - inline: inline$1 - }; - }; + removeVertexIds.push(vertexId); + continue; + } - /** - * Static Lex Method - */ - Lexer.lex = function lex (src, options) { - var lexer = new Lexer(options); - return lexer.lex(src); - }; + parents = vgraph.parentWays(vertex); - /** - * Preprocessing - */ - Lexer.prototype.lex = function lex (src) { - src = src - .replace(/\r\n|\r/g, '\n') - .replace(/\t/g, ' '); + if (parents.length < 3) { + if (vertexIds.indexOf(vertexId) !== -1) { + vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one + } + } - this.blockTokens(src, this.tokens, true); + if (parents.length === 2) { + // vertex with 2 parents is trivial + var a = parents[0]; + var b = parents[1]; + var aIsLeaf = a && !a.__via; + var bIsLeaf = b && !b.__via; + var leaf, survivor; - this.inline(this.tokens); + if (aIsLeaf && !bIsLeaf) { + leaf = a; + survivor = b; + } else if (!aIsLeaf && bIsLeaf) { + leaf = b; + survivor = a; + } - return this.tokens; - }; + if (leaf && survivor) { + survivor = withMetadata(survivor, vertexIds); // update survivor way - /** - * Lexing - */ - Lexer.prototype.blockTokens = function blockTokens (src, tokens, top) { - if ( tokens === void 0 ) tokens = []; - if ( top === void 0 ) top = true; - - src = src.replace(/^ +$/gm, ''); - var token, i, l; - - while (src) { - // newline - if (token = this.tokenizer.space(src)) { - src = src.substring(token.raw.length); - if (token.type) { - tokens.push(token); + vgraph = vgraph.replace(survivor).remove(leaf); // update graph + + removeWayIds.push(leaf.id); + keepGoing = true; } - continue; } - // code - if (token = this.tokenizer.code(src, tokens)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } + parents = vgraph.parentWays(vertex); - // fences - if (token = this.tokenizer.fences(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } + if (parents.length < 2) { + // vertex is no longer a key vertex + if (vertexIds.indexOf(vertexId) !== -1) { + vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one + } - // heading - if (token = this.tokenizer.heading(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; + removeVertexIds.push(vertexId); + keepGoing = true; } - // table no leading pipe (gfm) - if (token = this.tokenizer.nptable(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; + if (parents.length < 1) { + // vertex is no longer attached to anything + vgraph = vgraph.remove(vertex); } + } + } while (keepGoing); - // hr - if (token = this.tokenizer.hr(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } + vertices = vertices.filter(function (vertex) { + return removeVertexIds.indexOf(vertex.id) === -1; + }).map(function (vertex) { + return vgraph.entity(vertex.id); + }); + ways = ways.filter(function (way) { + return removeWayIds.indexOf(way.id) === -1; + }).map(function (way) { + return vgraph.entity(way.id); + }); // OK! Here is our intersection.. + + var intersection = { + graph: vgraph, + actions: actions, + vertices: vertices, + ways: ways + }; // Get all the valid turns through this intersection given a starting way id. + // This operates on the virtual graph for everything. + // + // Basically, walk through all possible paths from starting way, + // honoring the existing turn restrictions as we go (watch out for loops!) + // + // For each path found, generate and return a `osmTurn` datastructure. + // - // blockquote - if (token = this.tokenizer.blockquote(src)) { - src = src.substring(token.raw.length); - token.tokens = this.blockTokens(token.text, [], top); - tokens.push(token); - continue; - } + intersection.turns = function (fromWayId, maxViaWay) { + if (!fromWayId) return []; + if (!maxViaWay) maxViaWay = 0; + var vgraph = intersection.graph; + var keyVertexIds = intersection.vertices.map(function (v) { + return v.id; + }); + var start = vgraph.entity(fromWayId); + if (!start || !(start.__from || start.__via)) return []; // maxViaWay=0 from-*-to (0 vias) + // maxViaWay=1 from-*-via-*-to (1 via max) + // maxViaWay=2 from-*-via-*-via-*-to (2 vias max) - // list - if (token = this.tokenizer.list(src)) { - src = src.substring(token.raw.length); - l = token.items.length; - for (i = 0; i < l; i++) { - token.items[i].tokens = this.blockTokens(token.items[i].text, [], false); - } - tokens.push(token); - continue; - } + var maxPathLength = maxViaWay * 2 + 3; + var turns = []; + step(start); + return turns; // traverse the intersection graph and find all the valid paths - // html - if (token = this.tokenizer.html(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } + function step(entity, currPath, currRestrictions, matchedRestriction) { + currPath = (currPath || []).slice(); // shallow copy - // def - if (top && (token = this.tokenizer.def(src))) { - src = src.substring(token.raw.length); - if (!this.tokens.links[token.tag]) { - this.tokens.links[token.tag] = { - href: token.href, - title: token.title - }; - } - continue; - } + if (currPath.length >= maxPathLength) return; + currPath.push(entity.id); + currRestrictions = (currRestrictions || []).slice(); // shallow copy - // table (gfm) - if (token = this.tokenizer.table(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } + var i, j; - // lheading - if (token = this.tokenizer.lheading(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } + if (entity.type === 'node') { + var parents = vgraph.parentWays(entity); + var nextWays = []; // which ways can we step into? - // top-level paragraph - if (top && (token = this.tokenizer.paragraph(src))) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } + for (i = 0; i < parents.length; i++) { + var way = parents[i]; // if next way is a oneway incoming to this vertex, skip - // text - if (token = this.tokenizer.text(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } + if (way.__oneWay && way.nodes[0] !== entity.id) continue; // if we have seen it before (allowing for an initial u-turn), skip - if (src) { - var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0); - if (this.options.silent) { - console.error(errMsg); - break; - } else { - throw new Error(errMsg); - } - } - } + if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue; // Check all "current" restrictions (where we've already walked the `FROM`) - return tokens; - }; + var restrict = null; - Lexer.prototype.inline = function inline (tokens) { - var i, - j, - k, - l2, - row, - token; + for (j = 0; j < currRestrictions.length; j++) { + var restriction = currRestrictions[j]; + var f = restriction.memberByRole('from'); + var v = restriction.membersByRole('via'); + var t = restriction.memberByRole('to'); + var isOnly = /^only_/.test(restriction.tags.restriction); // Does the current path match this turn restriction? - var l = tokens.length; - for (i = 0; i < l; i++) { - token = tokens[i]; - switch (token.type) { - case 'paragraph': - case 'text': - case 'heading': { - token.tokens = []; - this.inlineTokens(token.text, token.tokens); - break; - } - case 'table': { - token.tokens = { - header: [], - cells: [] - }; + var matchesFrom = f.id === fromWayId; + var matchesViaTo = false; + var isAlongOnlyPath = false; + + if (t.id === way.id) { + // match TO + if (v.length === 1 && v[0].type === 'node') { + // match VIA node + matchesViaTo = v[0].id === entity.id && (matchesFrom && currPath.length === 2 || !matchesFrom && currPath.length > 2); + } else { + // match all VIA ways + var pathVias = []; + + for (k = 2; k < currPath.length; k += 2) { + // k = 2 skips FROM + pathVias.push(currPath[k]); // (path goes way-node-way...) + } + + var restrictionVias = []; + + for (k = 0; k < v.length; k++) { + if (v[k].type === 'way') { + restrictionVias.push(v[k].id); + } + } - // header - l2 = token.header.length; - for (j = 0; j < l2; j++) { - token.tokens.header[j] = []; - this.inlineTokens(token.header[j], token.tokens.header[j]); - } - - // cells - l2 = token.cells.length; - for (j = 0; j < l2; j++) { - row = token.cells[j]; - token.tokens.cells[j] = []; - for (k = 0; k < row.length; k++) { - token.tokens.cells[j][k] = []; - this.inlineTokens(row[k], token.tokens.cells[j][k]); + var diff = utilArrayDifference(pathVias, restrictionVias); + matchesViaTo = !diff.length; + } + } else if (isOnly) { + for (k = 0; k < v.length; k++) { + // way doesn't match TO, but is one of the via ways along the path of an "only" + if (v[k].type === 'way' && v[k].id === way.id) { + isAlongOnlyPath = true; + break; + } + } } + + if (matchesViaTo) { + if (isOnly) { + restrict = { + id: restriction.id, + direct: matchesFrom, + from: f.id, + only: true, + end: true + }; + } else { + restrict = { + id: restriction.id, + direct: matchesFrom, + from: f.id, + no: true, + end: true + }; + } + } else { + // indirect - caused by a different nearby restriction + if (isAlongOnlyPath) { + restrict = { + id: restriction.id, + direct: false, + from: f.id, + only: true, + end: false + }; + } else if (isOnly) { + restrict = { + id: restriction.id, + direct: false, + from: f.id, + no: true, + end: true + }; + } + } // stop looking if we find a "direct" restriction (matching FROM, VIA, TO) + + + if (restrict && restrict.direct) break; } - break; - } - case 'blockquote': { - this.inline(token.tokens); - break; + nextWays.push({ + way: way, + restrict: restrict + }); } - case 'list': { - l2 = token.items.length; - for (j = 0; j < l2; j++) { - this.inline(token.items[j].tokens); + + nextWays.forEach(function (nextWay) { + step(nextWay.way, currPath, currRestrictions, nextWay.restrict); + }); + } else { + // entity.type === 'way' + if (currPath.length >= 3) { + // this is a "complete" path.. + var turnPath = currPath.slice(); // shallow copy + // an indirect restriction - only include the partial path (starting at FROM) + + if (matchedRestriction && matchedRestriction.direct === false) { + for (i = 0; i < turnPath.length; i++) { + if (turnPath[i] === matchedRestriction.from) { + turnPath = turnPath.slice(i); + break; + } + } } - break; + + var turn = pathToTurn(turnPath); + + if (turn) { + if (matchedRestriction) { + turn.restrictionID = matchedRestriction.id; + turn.no = matchedRestriction.no; + turn.only = matchedRestriction.only; + turn.direct = matchedRestriction.direct; + } + + turns.push(osmTurn(turn)); + } + + if (currPath[0] === currPath[2]) return; // if we made a u-turn - stop here } - } - } - return tokens; - }; + if (matchedRestriction && matchedRestriction.end) return; // don't advance any further + // which nodes can we step into? - /** - * Lexing/Compiling - */ - Lexer.prototype.inlineTokens = function inlineTokens (src, tokens, inLink, inRawBlock) { - if ( tokens === void 0 ) tokens = []; - if ( inLink === void 0 ) inLink = false; - if ( inRawBlock === void 0 ) inRawBlock = false; - - var token; - - while (src) { - // escape - if (token = this.tokenizer.escape(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } + var n1 = vgraph.entity(entity.first()); + var n2 = vgraph.entity(entity.last()); + var dist = geoSphericalDistance(n1.loc, n2.loc); + var nextNodes = []; - // tag - if (token = this.tokenizer.tag(src, inLink, inRawBlock)) { - src = src.substring(token.raw.length); - inLink = token.inLink; - inRawBlock = token.inRawBlock; - tokens.push(token); - continue; - } + if (currPath.length > 1) { + if (dist > maxDistance) return; // the next node is too far - // link - if (token = this.tokenizer.link(src)) { - src = src.substring(token.raw.length); - if (token.type === 'link') { - token.tokens = this.inlineTokens(token.text, [], true, inRawBlock); + if (!entity.__via) return; // this way is a leaf / can't be a via } - tokens.push(token); - continue; - } - // reflink, nolink - if (token = this.tokenizer.reflink(src, this.tokens.links)) { - src = src.substring(token.raw.length); - if (token.type === 'link') { - token.tokens = this.inlineTokens(token.text, [], true, inRawBlock); + if (!entity.__oneWay && // bidirectional.. + keyVertexIds.indexOf(n1.id) !== -1 && // key vertex.. + currPath.indexOf(n1.id) === -1) { + // haven't seen it yet.. + nextNodes.push(n1); // can advance to first node } - tokens.push(token); - continue; - } - - // strong - if (token = this.tokenizer.strong(src)) { - src = src.substring(token.raw.length); - token.tokens = this.inlineTokens(token.text, [], inLink, inRawBlock); - tokens.push(token); - continue; - } - // em - if (token = this.tokenizer.em(src)) { - src = src.substring(token.raw.length); - token.tokens = this.inlineTokens(token.text, [], inLink, inRawBlock); - tokens.push(token); - continue; - } + if (keyVertexIds.indexOf(n2.id) !== -1 && // key vertex.. + currPath.indexOf(n2.id) === -1) { + // haven't seen it yet.. + nextNodes.push(n2); // can advance to last node + } - // code - if (token = this.tokenizer.codespan(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } + nextNodes.forEach(function (nextNode) { + // gather restrictions FROM this way + var fromRestrictions = vgraph.parentRelations(entity).filter(function (r) { + if (!r.isRestriction()) return false; + var f = r.memberByRole('from'); + if (!f || f.id !== entity.id) return false; + var isOnly = /^only_/.test(r.tags.restriction); + if (!isOnly) return true; // `only_` restrictions only matter along the direction of the VIA - #4849 - // br - if (token = this.tokenizer.br(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } + var isOnlyVia = false; + var v = r.membersByRole('via'); - // del (gfm) - if (token = this.tokenizer.del(src)) { - src = src.substring(token.raw.length); - token.tokens = this.inlineTokens(token.text, [], inLink, inRawBlock); - tokens.push(token); - continue; - } + if (v.length === 1 && v[0].type === 'node') { + // via node + isOnlyVia = v[0].id === nextNode.id; + } else { + // via way(s) + for (var i = 0; i < v.length; i++) { + if (v[i].type !== 'way') continue; + var viaWay = vgraph.entity(v[i].id); + + if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) { + isOnlyVia = true; + break; + } + } + } - // autolink - if (token = this.tokenizer.autolink(src, mangle)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; + return isOnlyVia; + }); + step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false); + }); } - - // url (gfm) - if (!inLink && (token = this.tokenizer.url(src, mangle))) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; + } // assumes path is alternating way-node-way of odd length + + + function pathToTurn(path) { + if (path.length < 3) return; + var fromWayId, fromNodeId, fromVertexId; + var toWayId, toNodeId, toVertexId; + var viaWayIds, viaNodeId, isUturn; + fromWayId = path[0]; + toWayId = path[path.length - 1]; + + if (path.length === 3 && fromWayId === toWayId) { + // u turn + var way = vgraph.entity(fromWayId); + if (way.__oneWay) return null; + isUturn = true; + viaNodeId = fromVertexId = toVertexId = path[1]; + fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId); + } else { + isUturn = false; + fromVertexId = path[1]; + fromNodeId = adjacentNode(fromWayId, fromVertexId); + toVertexId = path[path.length - 2]; + toNodeId = adjacentNode(toWayId, toVertexId); + + if (path.length === 3) { + viaNodeId = path[1]; + } else { + viaWayIds = path.filter(function (entityId) { + return entityId[0] === 'w'; + }); + viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1); // remove first, last + } } - // text - if (token = this.tokenizer.inlineText(src, inRawBlock, smartypants)) { - src = src.substring(token.raw.length); - tokens.push(token); - continue; - } + return { + key: path.join('_'), + path: path, + from: { + node: fromNodeId, + way: fromWayId, + vertex: fromVertexId + }, + via: { + node: viaNodeId, + ways: viaWayIds + }, + to: { + node: toNodeId, + way: toWayId, + vertex: toVertexId + }, + u: isUturn + }; - if (src) { - var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0); - if (this.options.silent) { - console.error(errMsg); - break; - } else { - throw new Error(errMsg); - } + function adjacentNode(wayId, affixId) { + var nodes = vgraph.entity(wayId).nodes; + return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2]; } } - - return tokens; }; - Object.defineProperties( Lexer, staticAccessors ); - - return Lexer; - }()); - - var defaults$3 = defaults.defaults; - var cleanUrl$1 = helpers.cleanUrl; - var escape$3 = helpers.escape; + return intersection; + } + function osmInferRestriction(graph, turn, projection) { + var fromWay = graph.entity(turn.from.way); + var fromNode = graph.entity(turn.from.node); + var fromVertex = graph.entity(turn.from.vertex); + var toWay = graph.entity(turn.to.way); + var toNode = graph.entity(turn.to.node); + var toVertex = graph.entity(turn.to.vertex); + var fromOneWay = fromWay.tags.oneway === 'yes'; + var toOneWay = toWay.tags.oneway === 'yes'; + var angle = (geoAngle(fromVertex, fromNode, projection) - geoAngle(toVertex, toNode, projection)) * 180 / Math.PI; - /** - * Renderer - */ - var Renderer_1 = /*@__PURE__*/(function () { - function Renderer(options) { - this.options = options || defaults$3; + while (angle < 0) { + angle += 360; } - Renderer.prototype.code = function code (code$1, infostring, escaped) { - var lang = (infostring || '').match(/\S*/)[0]; - if (this.options.highlight) { - var out = this.options.highlight(code$1, lang); - if (out != null && out !== code$1) { - escaped = true; - code$1 = out; - } - } - - if (!lang) { - return '
'
-	        + (escaped ? code$1 : escape$3(code$1, true))
-	        + '
'; - } + if (fromNode === toNode) { + return 'no_u_turn'; + } - return '
'
-	      + (escaped ? code$1 : escape$3(code$1, true))
-	      + '
\n'; - }; + if ((angle < 23 || angle > 336) && fromOneWay && toOneWay) { + return 'no_u_turn'; // wider tolerance for u-turn if both ways are oneway + } - Renderer.prototype.blockquote = function blockquote (quote) { - return '
\n' + quote + '
\n'; - }; + if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex) { + return 'no_u_turn'; // even wider tolerance for u-turn if there is a via way (from !== to) + } - Renderer.prototype.html = function html (html$1) { - return html$1; - }; + if (angle < 158) { + return 'no_right_turn'; + } - Renderer.prototype.heading = function heading (text, level, raw, slugger) { - if (this.options.headerIds) { - return '' - + text - + '\n'; - } - // ignore IDs - return '' + text + '\n'; - }; + if (angle > 202) { + return 'no_left_turn'; + } - Renderer.prototype.hr = function hr () { - return this.options.xhtml ? '
\n' : '
\n'; - }; + return 'no_straight_on'; + } - Renderer.prototype.list = function list (body, ordered, start) { - var type = ordered ? 'ol' : 'ul', - startatt = (ordered && start !== 1) ? (' start="' + start + '"') : ''; - return '<' + type + startatt + '>\n' + body + '\n'; - }; + function actionMergePolygon(ids, newRelationId) { + function groupEntities(graph) { + var entities = ids.map(function (id) { + return graph.entity(id); + }); + var geometryGroups = utilArrayGroupBy(entities, function (entity) { + if (entity.type === 'way' && entity.isClosed()) { + return 'closedWay'; + } else if (entity.type === 'relation' && entity.isMultipolygon()) { + return 'multipolygon'; + } else { + return 'other'; + } + }); + return Object.assign({ + closedWay: [], + multipolygon: [], + other: [] + }, geometryGroups); + } - Renderer.prototype.listitem = function listitem (text) { - return '
  • ' + text + '
  • \n'; - }; + var action = function action(graph) { + var entities = groupEntities(graph); // An array representing all the polygons that are part of the multipolygon. + // + // Each element is itself an array of objects with an id property, and has a + // locs property which is an array of the locations forming the polygon. + + var polygons = entities.multipolygon.reduce(function (polygons, m) { + return polygons.concat(osmJoinWays(m.members, graph)); + }, []).concat(entities.closedWay.map(function (d) { + var member = [{ + id: d.id + }]; + member.nodes = graph.childNodes(d); + return member; + })); // contained is an array of arrays of boolean values, + // where contained[j][k] is true iff the jth way is + // contained by the kth way. + + var contained = polygons.map(function (w, i) { + return polygons.map(function (d, n) { + if (i === n) return null; + return geoPolygonContainsPolygon(d.nodes.map(function (n) { + return n.loc; + }), w.nodes.map(function (n) { + return n.loc; + })); + }); + }); // Sort all polygons as either outer or inner ways - Renderer.prototype.checkbox = function checkbox (checked) { - return ' '; - }; + var members = []; + var outer = true; - Renderer.prototype.paragraph = function paragraph (text) { - return '

    ' + text + '

    \n'; - }; + while (polygons.length) { + extractUncontained(polygons); + polygons = polygons.filter(isContained); + contained = contained.filter(isContained).map(filterContained); + } - Renderer.prototype.table = function table (header, body) { - if (body) { body = '' + body + ''; } + function isContained(d, i) { + return contained[i].some(function (val) { + return val; + }); + } - return '\n' - + '\n' - + header - + '\n' - + body - + '
    \n'; - }; + function filterContained(d) { + return d.filter(isContained); + } - Renderer.prototype.tablerow = function tablerow (content) { - return '\n' + content + '\n'; - }; + function extractUncontained(polygons) { + polygons.forEach(function (d, i) { + if (!isContained(d, i)) { + d.forEach(function (member) { + members.push({ + type: 'way', + id: member.id, + role: outer ? 'outer' : 'inner' + }); + }); + } + }); + outer = !outer; + } // Move all tags to one relation. + // Keep the oldest multipolygon alive if it exists. - Renderer.prototype.tablecell = function tablecell (content, flags) { - var type = flags.header ? 'th' : 'td'; - var tag = flags.align - ? '<' + type + ' align="' + flags.align + '">' - : '<' + type + '>'; - return tag + content + '\n'; - }; - // span level renderer - Renderer.prototype.strong = function strong (text) { - return '' + text + ''; - }; + var relation; - Renderer.prototype.em = function em (text) { - return '' + text + ''; - }; + if (entities.multipolygon.length > 0) { + var oldestID = utilOldestID(entities.multipolygon.map(function (entity) { + return entity.id; + })); + relation = entities.multipolygon.find(function (entity) { + return entity.id === oldestID; + }); + } else { + relation = osmRelation({ + id: newRelationId, + tags: { + type: 'multipolygon' + } + }); + } - Renderer.prototype.codespan = function codespan (text) { - return '' + text + ''; - }; + entities.multipolygon.forEach(function (m) { + if (m.id !== relation.id) { + relation = relation.mergeTags(m.tags); + graph = graph.remove(m); + } + }); + entities.closedWay.forEach(function (way) { + function isThisOuter(m) { + return m.id === way.id && m.role !== 'inner'; + } - Renderer.prototype.br = function br () { - return this.options.xhtml ? '
    ' : '
    '; + if (members.some(isThisOuter)) { + relation = relation.mergeTags(way.tags); + graph = graph.replace(way.update({ + tags: {} + })); + } + }); + return graph.replace(relation.update({ + members: members, + tags: utilObjectOmit(relation.tags, ['area']) + })); }; - Renderer.prototype.del = function del (text) { - return '' + text + ''; - }; + action.disabled = function (graph) { + var entities = groupEntities(graph); - Renderer.prototype.link = function link (href, title, text) { - href = cleanUrl$1(this.options.sanitize, this.options.baseUrl, href); - if (href === null) { - return text; - } - var out = '
    0 || entities.closedWay.length + entities.multipolygon.length < 2) { + return 'not_eligible'; } - out += '>' + text + ''; - return out; - }; - Renderer.prototype.image = function image (href, title, text) { - href = cleanUrl$1(this.options.sanitize, this.options.baseUrl, href); - if (href === null) { - return text; + if (!entities.multipolygon.every(function (r) { + return r.isComplete(graph); + })) { + return 'incomplete_relation'; } - var out = '' + text + '' : '>'; - return out; }; - Renderer.prototype.text = function text (text$1) { - return text$1; - }; + return action; + } - return Renderer; - }()); + var DESCRIPTORS$1 = descriptors; + var objectDefinePropertyModule = objectDefineProperty; + var regExpFlags = regexpFlags$1; + var fails$4 = fails$V; - /** - * TextRenderer - * returns only the textual part of the token - */ - var TextRenderer_1 = /*@__PURE__*/(function () { - function TextRenderer () {} + var RegExpPrototype = RegExp.prototype; - TextRenderer.prototype.strong = function strong (text) { - return text; - }; + var FORCED$2 = DESCRIPTORS$1 && fails$4(function () { + // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe + return Object.getOwnPropertyDescriptor(RegExpPrototype, 'flags').get.call({ dotAll: true, sticky: true }) !== 'sy'; + }); - TextRenderer.prototype.em = function em (text) { - return text; - }; + // `RegExp.prototype.flags` getter + // https://tc39.es/ecma262/#sec-get-regexp.prototype.flags + if (FORCED$2) objectDefinePropertyModule.f(RegExpPrototype, 'flags', { + configurable: true, + get: regExpFlags + }); - TextRenderer.prototype.codespan = function codespan (text) { - return text; - }; + var fastDeepEqual = function equal(a, b) { + if (a === b) return true; - TextRenderer.prototype.del = function del (text) { - return text; - }; + if (a && b && _typeof(a) == 'object' && _typeof(b) == 'object') { + if (a.constructor !== b.constructor) return false; + var length, i, keys; - TextRenderer.prototype.html = function html (text) { - return text; - }; + if (Array.isArray(a)) { + length = a.length; + if (length != b.length) return false; - TextRenderer.prototype.text = function text (text$1) { - return text$1; - }; + for (i = length; i-- !== 0;) { + if (!equal(a[i], b[i])) return false; + } - TextRenderer.prototype.link = function link (href, title, text) { - return '' + text; - }; + return true; + } - TextRenderer.prototype.image = function image (href, title, text) { - return '' + text; - }; + if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags; + if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf(); + if (a.toString !== Object.prototype.toString) return a.toString() === b.toString(); + keys = Object.keys(a); + length = keys.length; + if (length !== Object.keys(b).length) return false; - TextRenderer.prototype.br = function br () { - return ''; - }; + for (i = length; i-- !== 0;) { + if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false; + } - return TextRenderer; - }()); + for (i = length; i-- !== 0;) { + var key = keys[i]; + if (!equal(a[key], b[key])) return false; + } - /** - * Slugger generates header id - */ - var Slugger_1 = /*@__PURE__*/(function () { - function Slugger() { - this.seen = {}; - } + return true; + } // true if both NaN, false otherwise - /** - * Convert string to unique id - */ - Slugger.prototype.slug = function slug (value) { - var slug = value - .toLowerCase() - .trim() - // remove html tags - .replace(/<[!\/a-z].*?>/ig, '') - // remove unwanted chars - .replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '') - .replace(/\s/g, '-'); - - if (this.seen.hasOwnProperty(slug)) { - var originalSlug = slug; - do { - this.seen[originalSlug]++; - slug = originalSlug + '-' + this.seen[originalSlug]; - } while (this.seen.hasOwnProperty(slug)); - } - this.seen[slug] = 0; - return slug; - }; + return a !== a && b !== b; + }; - return Slugger; - }()); + // J. W. Hunt and M. D. McIlroy, An algorithm for differential buffer + // comparison, Bell Telephone Laboratories CSTR #41 (1976) + // http://www.cs.dartmouth.edu/~doug/ + // https://en.wikipedia.org/wiki/Longest_common_subsequence_problem + // + // Expects two arrays, finds longest common sequence - var defaults$4 = defaults.defaults; - var unescape$2 = helpers.unescape; + function LCS(buffer1, buffer2) { + var equivalenceClasses = {}; - /** - * Parsing & Compiling - */ - var Parser_1 = /*@__PURE__*/(function () { - function Parser(options) { - this.options = options || defaults$4; - this.options.renderer = this.options.renderer || new Renderer_1(); - this.renderer = this.options.renderer; - this.renderer.options = this.options; - this.textRenderer = new TextRenderer_1(); - this.slugger = new Slugger_1(); + for (var j = 0; j < buffer2.length; j++) { + var item = buffer2[j]; + + if (equivalenceClasses[item]) { + equivalenceClasses[item].push(j); + } else { + equivalenceClasses[item] = [j]; + } } - /** - * Static Parse Method - */ - Parser.parse = function parse (tokens, options) { - var parser = new Parser(options); - return parser.parse(tokens); + var NULLRESULT = { + buffer1index: -1, + buffer2index: -1, + chain: null }; + var candidates = [NULLRESULT]; - /** - * Parse Loop - */ - Parser.prototype.parse = function parse (tokens, top) { - if ( top === void 0 ) top = true; + for (var i = 0; i < buffer1.length; i++) { + var _item = buffer1[i]; + var buffer2indices = equivalenceClasses[_item] || []; + var r = 0; + var c = candidates[0]; - var out = '', - i, - j, - k, - l2, - l3, - row, - cell, - header, - body, - token, - ordered, - start, - loose, - itemBody, - item, - checked, - task, - checkbox; - - var l = tokens.length; - for (i = 0; i < l; i++) { - token = tokens[i]; - switch (token.type) { - case 'space': { - continue; - } - case 'hr': { - out += this.renderer.hr(); - continue; - } - case 'heading': { - out += this.renderer.heading( - this.parseInline(token.tokens), - token.depth, - unescape$2(this.parseInline(token.tokens, this.textRenderer)), - this.slugger); - continue; - } - case 'code': { - out += this.renderer.code(token.text, - token.lang, - token.escaped); - continue; - } - case 'table': { - header = ''; - - // header - cell = ''; - l2 = token.header.length; - for (j = 0; j < l2; j++) { - cell += this.renderer.tablecell( - this.parseInline(token.tokens.header[j]), - { header: true, align: token.align[j] } - ); - } - header += this.renderer.tablerow(cell); - - body = ''; - l2 = token.cells.length; - for (j = 0; j < l2; j++) { - row = token.tokens.cells[j]; - - cell = ''; - l3 = row.length; - for (k = 0; k < l3; k++) { - cell += this.renderer.tablecell( - this.parseInline(row[k]), - { header: false, align: token.align[k] } - ); - } + for (var jx = 0; jx < buffer2indices.length; jx++) { + var _j = buffer2indices[jx]; + var s = void 0; - body += this.renderer.tablerow(cell); - } - out += this.renderer.table(header, body); - continue; - } - case 'blockquote': { - body = this.parse(token.tokens); - out += this.renderer.blockquote(body); - continue; + for (s = r; s < candidates.length; s++) { + if (candidates[s].buffer2index < _j && (s === candidates.length - 1 || candidates[s + 1].buffer2index > _j)) { + break; } - case 'list': { - ordered = token.ordered; - start = token.start; - loose = token.loose; - l2 = token.items.length; - - body = ''; - for (j = 0; j < l2; j++) { - item = token.items[j]; - checked = item.checked; - task = item.task; - - itemBody = ''; - if (item.task) { - checkbox = this.renderer.checkbox(checked); - if (loose) { - if (item.tokens[0].type === 'text') { - item.tokens[0].text = checkbox + ' ' + item.tokens[0].text; - if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') { - item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text; - } - } else { - item.tokens.unshift({ - type: 'text', - text: checkbox - }); - } - } else { - itemBody += checkbox; - } - } + } - itemBody += this.parse(item.tokens, loose); - body += this.renderer.listitem(itemBody, task, checked); - } + if (s < candidates.length) { + var newCandidate = { + buffer1index: i, + buffer2index: _j, + chain: candidates[s] + }; - out += this.renderer.list(body, ordered, start); - continue; - } - case 'html': { - // TODO parse inline content if parameter markdown=1 - out += this.renderer.html(token.text); - continue; - } - case 'paragraph': { - out += this.renderer.paragraph(this.parseInline(token.tokens)); - continue; - } - case 'text': { - body = token.tokens ? this.parseInline(token.tokens) : token.text; - while (i + 1 < l && tokens[i + 1].type === 'text') { - token = tokens[++i]; - body += '\n' + (token.tokens ? this.parseInline(token.tokens) : token.text); - } - out += top ? this.renderer.paragraph(body) : body; - continue; - } - default: { - var errMsg = 'Token with "' + token.type + '" type was not found.'; - if (this.options.silent) { - console.error(errMsg); - return; - } else { - throw new Error(errMsg); - } + if (r === candidates.length) { + candidates.push(c); + } else { + candidates[r] = c; } - } - } - - return out; - }; - /** - * Parse Inline Tokens - */ - Parser.prototype.parseInline = function parseInline (tokens, renderer) { - renderer = renderer || this.renderer; - var out = '', - i, - token; + r = s + 1; + c = newCandidate; - var l = tokens.length; - for (i = 0; i < l; i++) { - token = tokens[i]; - switch (token.type) { - case 'escape': { - out += renderer.text(token.text); - break; - } - case 'html': { - out += renderer.html(token.text); - break; - } - case 'link': { - out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer)); - break; - } - case 'image': { - out += renderer.image(token.href, token.title, token.text); - break; - } - case 'strong': { - out += renderer.strong(this.parseInline(token.tokens, renderer)); - break; - } - case 'em': { - out += renderer.em(this.parseInline(token.tokens, renderer)); - break; - } - case 'codespan': { - out += renderer.codespan(token.text); - break; - } - case 'br': { - out += renderer.br(); - break; - } - case 'del': { - out += renderer.del(this.parseInline(token.tokens, renderer)); - break; - } - case 'text': { - out += renderer.text(token.text); - break; - } - default: { - var errMsg = 'Token with "' + token.type + '" type was not found.'; - if (this.options.silent) { - console.error(errMsg); - return; - } else { - throw new Error(errMsg); - } + if (r === candidates.length) { + break; // no point in examining further (j)s } } } - return out; - }; - return Parser; - }()); + candidates[r] = c; + } // At this point, we know the LCS: it's in the reverse of the + // linked-list through .chain of candidates[candidates.length - 1]. - var merge$3 = helpers.merge; - var checkSanitizeDeprecation$1 = helpers.checkSanitizeDeprecation; - var escape$4 = helpers.escape; - var getDefaults = defaults.getDefaults; - var changeDefaults = defaults.changeDefaults; - var defaults$5 = defaults.defaults; - /** - * Marked - */ - function marked(src, opt, callback) { - // throw error in case of non string input - if (typeof src === 'undefined' || src === null) { - throw new Error('marked(): input parameter is undefined or null'); - } - if (typeof src !== 'string') { - throw new Error('marked(): input parameter is of type ' - + Object.prototype.toString.call(src) + ', string expected'); - } + return candidates[candidates.length - 1]; + } // We apply the LCS to build a 'comm'-style picture of the + // offsets and lengths of mismatched chunks in the input + // buffers. This is used by diff3MergeRegions. - if (callback || typeof opt === 'function') { - if (!callback) { - callback = opt; - opt = null; - } - opt = merge$3({}, marked.defaults, opt || {}); - checkSanitizeDeprecation$1(opt); - var highlight = opt.highlight; - var tokens, - pending, - i = 0; + function diffIndices(buffer1, buffer2) { + var lcs = LCS(buffer1, buffer2); + var result = []; + var tail1 = buffer1.length; + var tail2 = buffer2.length; - try { - tokens = Lexer_1.lex(src, opt); - } catch (e) { - return callback(e); + for (var candidate = lcs; candidate !== null; candidate = candidate.chain) { + var mismatchLength1 = tail1 - candidate.buffer1index - 1; + var mismatchLength2 = tail2 - candidate.buffer2index - 1; + tail1 = candidate.buffer1index; + tail2 = candidate.buffer2index; + + if (mismatchLength1 || mismatchLength2) { + result.push({ + buffer1: [tail1 + 1, mismatchLength1], + buffer1Content: buffer1.slice(tail1 + 1, tail1 + 1 + mismatchLength1), + buffer2: [tail2 + 1, mismatchLength2], + buffer2Content: buffer2.slice(tail2 + 1, tail2 + 1 + mismatchLength2) + }); } + } - pending = tokens.length; + result.reverse(); + return result; + } // We apply the LCS to build a JSON representation of a + // independently derived from O, returns a fairly complicated + // internal representation of merge decisions it's taken. The + // interested reader may wish to consult + // + // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce. + // 'A Formal Investigation of ' In Arvind and Prasad, + // editors, Foundations of Software Technology and Theoretical + // Computer Science (FSTTCS), December 2007. + // + // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf) + // - var done = function(err) { - if (err) { - opt.highlight = highlight; - return callback(err); - } - var out; + function diff3MergeRegions(a, o, b) { + // "hunks" are array subsets where `a` or `b` are different from `o` + // https://www.gnu.org/software/diffutils/manual/html_node/diff3-Hunks.html + var hunks = []; - try { - out = Parser_1.parse(tokens, opt); - } catch (e) { - err = e; - } + function addHunk(h, ab) { + hunks.push({ + ab: ab, + oStart: h.buffer1[0], + oLength: h.buffer1[1], + // length of o to remove + abStart: h.buffer2[0], + abLength: h.buffer2[1] // length of a/b to insert + // abContent: (ab === 'a' ? a : b).slice(h.buffer2[0], h.buffer2[0] + h.buffer2[1]) - opt.highlight = highlight; + }); + } - return err - ? callback(err) - : callback(null, out); - }; + diffIndices(o, a).forEach(function (item) { + return addHunk(item, 'a'); + }); + diffIndices(o, b).forEach(function (item) { + return addHunk(item, 'b'); + }); + hunks.sort(function (x, y) { + return x.oStart - y.oStart; + }); + var results = []; + var currOffset = 0; - if (!highlight || highlight.length < 3) { - return done(); + function advanceTo(endOffset) { + if (endOffset > currOffset) { + results.push({ + stable: true, + buffer: 'o', + bufferStart: currOffset, + bufferLength: endOffset - currOffset, + bufferContent: o.slice(currOffset, endOffset) + }); + currOffset = endOffset; } + } - delete opt.highlight; + while (hunks.length) { + var hunk = hunks.shift(); + var regionStart = hunk.oStart; + var regionEnd = hunk.oStart + hunk.oLength; + var regionHunks = [hunk]; + advanceTo(regionStart); // Try to pull next overlapping hunk into this region + + while (hunks.length) { + var nextHunk = hunks[0]; + var nextHunkStart = nextHunk.oStart; + if (nextHunkStart > regionEnd) break; // no overlap - if (!pending) { return done(); } + regionEnd = Math.max(regionEnd, nextHunkStart + nextHunk.oLength); + regionHunks.push(hunks.shift()); + } - for (; i < tokens.length; i++) { - (function(token) { - if (token.type !== 'code') { - return --pending || done(); - } - return highlight(token.text, token.lang, function(err, code) { - if (err) { return done(err); } - if (code == null || code === token.text) { - return --pending || done(); - } - token.text = code; - token.escaped = true; - --pending || done(); + if (regionHunks.length === 1) { + // Only one hunk touches this region, meaning that there is no conflict here. + // Either `a` or `b` is inserting into a region of `o` unchanged by the other. + if (hunk.abLength > 0) { + var buffer = hunk.ab === 'a' ? a : b; + results.push({ + stable: true, + buffer: hunk.ab, + bufferStart: hunk.abStart, + bufferLength: hunk.abLength, + bufferContent: buffer.slice(hunk.abStart, hunk.abStart + hunk.abLength) }); - })(tokens[i]); + } + } else { + // A true a/b conflict. Determine the bounds involved from `a`, `o`, and `b`. + // Effectively merge all the `a` hunks into one giant hunk, then do the + // same for the `b` hunks; then, correct for skew in the regions of `o` + // that each side changed, and report appropriate spans for the three sides. + var bounds = { + a: [a.length, -1, o.length, -1], + b: [b.length, -1, o.length, -1] + }; + + while (regionHunks.length) { + hunk = regionHunks.shift(); + var oStart = hunk.oStart; + var oEnd = oStart + hunk.oLength; + var abStart = hunk.abStart; + var abEnd = abStart + hunk.abLength; + var _b = bounds[hunk.ab]; + _b[0] = Math.min(abStart, _b[0]); + _b[1] = Math.max(abEnd, _b[1]); + _b[2] = Math.min(oStart, _b[2]); + _b[3] = Math.max(oEnd, _b[3]); + } + + var aStart = bounds.a[0] + (regionStart - bounds.a[2]); + var aEnd = bounds.a[1] + (regionEnd - bounds.a[3]); + var bStart = bounds.b[0] + (regionStart - bounds.b[2]); + var bEnd = bounds.b[1] + (regionEnd - bounds.b[3]); + var result = { + stable: false, + aStart: aStart, + aLength: aEnd - aStart, + aContent: a.slice(aStart, aEnd), + oStart: regionStart, + oLength: regionEnd - regionStart, + oContent: o.slice(regionStart, regionEnd), + bStart: bStart, + bLength: bEnd - bStart, + bContent: b.slice(bStart, bEnd) + }; + results.push(result); } - return; + currOffset = regionEnd; } - try { - opt = merge$3({}, marked.defaults, opt || {}); - checkSanitizeDeprecation$1(opt); - return Parser_1.parse(Lexer_1.lex(src, opt), opt); - } catch (e$1) { - e$1.message += '\nPlease report this to https://github.com/markedjs/marked.'; - if ((opt || marked.defaults).silent) { - return '

    An error occurred:

    '
    -	        + escape$4(e$1.message + '', true)
    -	        + '
    '; + + advanceTo(o.length); + return results; + } // Applies the output of diff3MergeRegions to actually + // construct the merged buffer; the returned result alternates + // between 'ok' and 'conflict' blocks. + // A "false conflict" is where `a` and `b` both change the same from `o` + + + function diff3Merge(a, o, b, options) { + var defaults = { + excludeFalseConflicts: true, + stringSeparator: /\s+/ + }; + options = Object.assign(defaults, options); + var aString = typeof a === 'string'; + var oString = typeof o === 'string'; + var bString = typeof b === 'string'; + if (aString) a = a.split(options.stringSeparator); + if (oString) o = o.split(options.stringSeparator); + if (bString) b = b.split(options.stringSeparator); + var results = []; + var regions = diff3MergeRegions(a, o, b); + var okBuffer = []; + + function flushOk() { + if (okBuffer.length) { + results.push({ + ok: okBuffer + }); } - throw e$1; + + okBuffer = []; } - } - /** - * Options - */ + function isFalseConflict(a, b) { + if (a.length !== b.length) return false; - marked.options = - marked.setOptions = function(opt) { - merge$3(marked.defaults, opt); - changeDefaults(marked.defaults); - return marked; - }; + for (var i = 0; i < a.length; i++) { + if (a[i] !== b[i]) return false; + } - marked.getDefaults = getDefaults; + return true; + } + + regions.forEach(function (region) { + if (region.stable) { + var _okBuffer; - marked.defaults = defaults$5; + (_okBuffer = okBuffer).push.apply(_okBuffer, _toConsumableArray(region.bufferContent)); + } else { + if (options.excludeFalseConflicts && isFalseConflict(region.aContent, region.bContent)) { + var _okBuffer2; - /** - * Use Extension - */ + (_okBuffer2 = okBuffer).push.apply(_okBuffer2, _toConsumableArray(region.aContent)); + } else { + flushOk(); + results.push({ + conflict: { + a: region.aContent, + aIndex: region.aStart, + o: region.oContent, + oIndex: region.oStart, + b: region.bContent, + bIndex: region.bStart + } + }); + } + } + }); + flushOk(); + return results; + } - marked.use = function(extension) { - var opts = merge$3({}, extension); - if (extension.renderer) { - var renderer = marked.defaults.renderer || new Renderer_1(); - var loop = function ( prop ) { - var prevRenderer = renderer[prop]; - renderer[prop] = function () { - var args = [], len = arguments.length; - while ( len-- ) args[ len ] = arguments[ len ]; - - var ret = extension.renderer[prop].apply(renderer, args); - if (ret === false) { - ret = prevRenderer.apply(renderer, args); - } - return ret; - }; - }; + var lodash = {exports: {}}; + + (function (module, exports) { + (function () { + /** Used as a safe reference for `undefined` in pre-ES5 environments. */ + var undefined$1; + /** Used as the semantic version number. */ + + var VERSION = '4.17.21'; + /** Used as the size to enable large array optimizations. */ + + var LARGE_ARRAY_SIZE = 200; + /** Error message constants. */ + + var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.', + FUNC_ERROR_TEXT = 'Expected a function', + INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`'; + /** Used to stand-in for `undefined` hash values. */ + + var HASH_UNDEFINED = '__lodash_hash_undefined__'; + /** Used as the maximum memoize cache size. */ + + var MAX_MEMOIZE_SIZE = 500; + /** Used as the internal argument placeholder. */ + + var PLACEHOLDER = '__lodash_placeholder__'; + /** Used to compose bitmasks for cloning. */ + + var CLONE_DEEP_FLAG = 1, + CLONE_FLAT_FLAG = 2, + CLONE_SYMBOLS_FLAG = 4; + /** Used to compose bitmasks for value comparisons. */ + + var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; + /** Used to compose bitmasks for function metadata. */ + + var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_BOUND_FLAG = 4, + WRAP_CURRY_FLAG = 8, + WRAP_CURRY_RIGHT_FLAG = 16, + WRAP_PARTIAL_FLAG = 32, + WRAP_PARTIAL_RIGHT_FLAG = 64, + WRAP_ARY_FLAG = 128, + WRAP_REARG_FLAG = 256, + WRAP_FLIP_FLAG = 512; + /** Used as default options for `_.truncate`. */ + + var DEFAULT_TRUNC_LENGTH = 30, + DEFAULT_TRUNC_OMISSION = '...'; + /** Used to detect hot functions by number of calls within a span of milliseconds. */ + + var HOT_COUNT = 800, + HOT_SPAN = 16; + /** Used to indicate the type of lazy iteratees. */ + + var LAZY_FILTER_FLAG = 1, + LAZY_MAP_FLAG = 2, + LAZY_WHILE_FLAG = 3; + /** Used as references for various `Number` constants. */ + + var INFINITY = 1 / 0, + MAX_SAFE_INTEGER = 9007199254740991, + MAX_INTEGER = 1.7976931348623157e+308, + NAN = 0 / 0; + /** Used as references for the maximum length and index of an array. */ + + var MAX_ARRAY_LENGTH = 4294967295, + MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, + HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; + /** Used to associate wrap methods with their bit flags. */ + + var wrapFlags = [['ary', WRAP_ARY_FLAG], ['bind', WRAP_BIND_FLAG], ['bindKey', WRAP_BIND_KEY_FLAG], ['curry', WRAP_CURRY_FLAG], ['curryRight', WRAP_CURRY_RIGHT_FLAG], ['flip', WRAP_FLIP_FLAG], ['partial', WRAP_PARTIAL_FLAG], ['partialRight', WRAP_PARTIAL_RIGHT_FLAG], ['rearg', WRAP_REARG_FLAG]]; + /** `Object#toString` result references. */ + + var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + asyncTag = '[object AsyncFunction]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + domExcTag = '[object DOMException]', + errorTag = '[object Error]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + mapTag = '[object Map]', + numberTag = '[object Number]', + nullTag = '[object Null]', + objectTag = '[object Object]', + promiseTag = '[object Promise]', + proxyTag = '[object Proxy]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + symbolTag = '[object Symbol]', + undefinedTag = '[object Undefined]', + weakMapTag = '[object WeakMap]', + weakSetTag = '[object WeakSet]'; + var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + /** Used to match empty string literals in compiled template source. */ + + var reEmptyStringLeading = /\b__p \+= '';/g, + reEmptyStringMiddle = /\b(__p \+=) '' \+/g, + reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g; + /** Used to match HTML entities and HTML characters. */ + + var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g, + reUnescapedHtml = /[&<>"']/g, + reHasEscapedHtml = RegExp(reEscapedHtml.source), + reHasUnescapedHtml = RegExp(reUnescapedHtml.source); + /** Used to match template delimiters. */ + + var reEscape = /<%-([\s\S]+?)%>/g, + reEvaluate = /<%([\s\S]+?)%>/g, + reInterpolate = /<%=([\s\S]+?)%>/g; + /** Used to match property names within property paths. */ + + var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/, + rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + /** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ - for (var prop in extension.renderer) loop( prop ); - opts.renderer = renderer; - } - if (extension.tokenizer) { - var tokenizer = marked.defaults.tokenizer || new Tokenizer_1(); - var loop$1 = function ( prop ) { - var prevTokenizer = tokenizer[prop$1]; - tokenizer[prop$1] = function () { - var args = [], len = arguments.length; - while ( len-- ) args[ len ] = arguments[ len ]; - - var ret = extension.tokenizer[prop$1].apply(tokenizer, args); - if (ret === false) { - ret = prevTokenizer.apply(tokenizer, args); - } - return ret; - }; - }; + var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, + reHasRegExpChar = RegExp(reRegExpChar.source); + /** Used to match leading whitespace. */ - for (var prop$1 in extension.tokenizer) loop$1( prop ); - opts.tokenizer = tokenizer; - } - marked.setOptions(opts); - }; + var reTrimStart = /^\s+/; + /** Used to match a single whitespace character. */ - /** - * Expose - */ + var reWhitespace = /\s/; + /** Used to match wrap detail comments. */ - marked.Parser = Parser_1; - marked.parser = Parser_1.parse; + var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, + reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, + reSplitDetails = /,? & /; + /** Used to match words composed of alphanumeric characters. */ - marked.Renderer = Renderer_1; - marked.TextRenderer = TextRenderer_1; + var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; + /** + * Used to validate the `validate` option in `_.template` variable. + * + * Forbids characters which could potentially change the meaning of the function argument definition: + * - "()," (modification of function parameters) + * - "=" (default value) + * - "[]{}" (destructuring of function parameters) + * - "/" (beginning of a comment) + * - whitespace + */ - marked.Lexer = Lexer_1; - marked.lexer = Lexer_1.lex; + var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/; + /** Used to match backslashes in property paths. */ - marked.Tokenizer = Tokenizer_1; + var reEscapeChar = /\\(\\)?/g; + /** + * Used to match + * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components). + */ - marked.Slugger = Slugger_1; + var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g; + /** Used to match `RegExp` flags from their coerced string values. */ + + var reFlags = /\w*$/; + /** Used to detect bad signed hexadecimal string values. */ + + var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; + /** Used to detect binary string values. */ + + var reIsBinary = /^0b[01]+$/i; + /** Used to detect host constructors (Safari). */ + + var reIsHostCtor = /^\[object .+?Constructor\]$/; + /** Used to detect octal string values. */ + + var reIsOctal = /^0o[0-7]+$/i; + /** Used to detect unsigned integer values. */ + + var reIsUint = /^(?:0|[1-9]\d*)$/; + /** Used to match Latin Unicode letters (excluding mathematical operators). */ + + var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; + /** Used to ensure capturing order of template delimiters. */ + + var reNoMatch = /($^)/; + /** Used to match unescaped characters in compiled string literals. */ + + var reUnescapedString = /['\n\r\u2028\u2029\\]/g; + /** Used to compose unicode character classes. */ + + var rsAstralRange = "\\ud800-\\udfff", + rsComboMarksRange = "\\u0300-\\u036f", + reComboHalfMarksRange = "\\ufe20-\\ufe2f", + rsComboSymbolsRange = "\\u20d0-\\u20ff", + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, + rsDingbatRange = "\\u2700-\\u27bf", + rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff', + rsMathOpRange = '\\xac\\xb1\\xd7\\xf7', + rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf', + rsPunctuationRange = "\\u2000-\\u206f", + rsSpaceRange = " \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000", + rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde', + rsVarRange = "\\ufe0e\\ufe0f", + rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange; + /** Used to compose unicode capture groups. */ + + var rsApos = "['\u2019]", + rsAstral = '[' + rsAstralRange + ']', + rsBreak = '[' + rsBreakRange + ']', + rsCombo = '[' + rsComboRange + ']', + rsDigits = '\\d+', + rsDingbat = '[' + rsDingbatRange + ']', + rsLower = '[' + rsLowerRange + ']', + rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']', + rsFitz = "\\ud83c[\\udffb-\\udfff]", + rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', + rsNonAstral = '[^' + rsAstralRange + ']', + rsRegional = "(?:\\ud83c[\\udde6-\\uddff]){2}", + rsSurrPair = "[\\ud800-\\udbff][\\udc00-\\udfff]", + rsUpper = '[' + rsUpperRange + ']', + rsZWJ = "\\u200d"; + /** Used to compose unicode regexes. */ + + var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')', + rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')', + rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?', + rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?', + reOptMod = rsModifier + '?', + rsOptVar = '[' + rsVarRange + ']?', + rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', + rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])', + rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])', + rsSeq = rsOptVar + reOptMod + rsOptJoin, + rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq, + rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')'; + /** Used to match apostrophes. */ + + var reApos = RegExp(rsApos, 'g'); + /** + * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and + * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols). + */ - marked.parse = marked; + var reComboMark = RegExp(rsCombo, 'g'); + /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ + + var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g'); + /** Used to match complex or compound words. */ + + var reUnicodeWord = RegExp([rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')', rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')', rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower, rsUpper + '+' + rsOptContrUpper, rsOrdUpper, rsOrdLower, rsDigits, rsEmoji].join('|'), 'g'); + /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */ + + var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']'); + /** Used to detect strings that need a more robust regexp to match words. */ + + var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; + /** Used to assign default `context` object properties. */ + + var contextProps = ['Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array', 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object', 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array', 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap', '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout']; + /** Used to make template sourceURLs easier to identify. */ + + var templateCounter = -1; + /** Used to identify `toStringTag` values of typed arrays. */ + + var typedArrayTags = {}; + typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true; + typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; + /** Used to identify `toStringTag` values supported by `_.clone`. */ + + var cloneableTags = {}; + cloneableTags[argsTag] = cloneableTags[arrayTag] = cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = cloneableTags[boolTag] = cloneableTags[dateTag] = cloneableTags[float32Tag] = cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[mapTag] = cloneableTags[numberTag] = cloneableTags[objectTag] = cloneableTags[regexpTag] = cloneableTags[setTag] = cloneableTags[stringTag] = cloneableTags[symbolTag] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; + cloneableTags[errorTag] = cloneableTags[funcTag] = cloneableTags[weakMapTag] = false; + /** Used to map Latin Unicode letters to basic Latin letters. */ + + var deburredLetters = { + // Latin-1 Supplement block. + '\xc0': 'A', + '\xc1': 'A', + '\xc2': 'A', + '\xc3': 'A', + '\xc4': 'A', + '\xc5': 'A', + '\xe0': 'a', + '\xe1': 'a', + '\xe2': 'a', + '\xe3': 'a', + '\xe4': 'a', + '\xe5': 'a', + '\xc7': 'C', + '\xe7': 'c', + '\xd0': 'D', + '\xf0': 'd', + '\xc8': 'E', + '\xc9': 'E', + '\xca': 'E', + '\xcb': 'E', + '\xe8': 'e', + '\xe9': 'e', + '\xea': 'e', + '\xeb': 'e', + '\xcc': 'I', + '\xcd': 'I', + '\xce': 'I', + '\xcf': 'I', + '\xec': 'i', + '\xed': 'i', + '\xee': 'i', + '\xef': 'i', + '\xd1': 'N', + '\xf1': 'n', + '\xd2': 'O', + '\xd3': 'O', + '\xd4': 'O', + '\xd5': 'O', + '\xd6': 'O', + '\xd8': 'O', + '\xf2': 'o', + '\xf3': 'o', + '\xf4': 'o', + '\xf5': 'o', + '\xf6': 'o', + '\xf8': 'o', + '\xd9': 'U', + '\xda': 'U', + '\xdb': 'U', + '\xdc': 'U', + '\xf9': 'u', + '\xfa': 'u', + '\xfb': 'u', + '\xfc': 'u', + '\xdd': 'Y', + '\xfd': 'y', + '\xff': 'y', + '\xc6': 'Ae', + '\xe6': 'ae', + '\xde': 'Th', + '\xfe': 'th', + '\xdf': 'ss', + // Latin Extended-A block. + "\u0100": 'A', + "\u0102": 'A', + "\u0104": 'A', + "\u0101": 'a', + "\u0103": 'a', + "\u0105": 'a', + "\u0106": 'C', + "\u0108": 'C', + "\u010A": 'C', + "\u010C": 'C', + "\u0107": 'c', + "\u0109": 'c', + "\u010B": 'c', + "\u010D": 'c', + "\u010E": 'D', + "\u0110": 'D', + "\u010F": 'd', + "\u0111": 'd', + "\u0112": 'E', + "\u0114": 'E', + "\u0116": 'E', + "\u0118": 'E', + "\u011A": 'E', + "\u0113": 'e', + "\u0115": 'e', + "\u0117": 'e', + "\u0119": 'e', + "\u011B": 'e', + "\u011C": 'G', + "\u011E": 'G', + "\u0120": 'G', + "\u0122": 'G', + "\u011D": 'g', + "\u011F": 'g', + "\u0121": 'g', + "\u0123": 'g', + "\u0124": 'H', + "\u0126": 'H', + "\u0125": 'h', + "\u0127": 'h', + "\u0128": 'I', + "\u012A": 'I', + "\u012C": 'I', + "\u012E": 'I', + "\u0130": 'I', + "\u0129": 'i', + "\u012B": 'i', + "\u012D": 'i', + "\u012F": 'i', + "\u0131": 'i', + "\u0134": 'J', + "\u0135": 'j', + "\u0136": 'K', + "\u0137": 'k', + "\u0138": 'k', + "\u0139": 'L', + "\u013B": 'L', + "\u013D": 'L', + "\u013F": 'L', + "\u0141": 'L', + "\u013A": 'l', + "\u013C": 'l', + "\u013E": 'l', + "\u0140": 'l', + "\u0142": 'l', + "\u0143": 'N', + "\u0145": 'N', + "\u0147": 'N', + "\u014A": 'N', + "\u0144": 'n', + "\u0146": 'n', + "\u0148": 'n', + "\u014B": 'n', + "\u014C": 'O', + "\u014E": 'O', + "\u0150": 'O', + "\u014D": 'o', + "\u014F": 'o', + "\u0151": 'o', + "\u0154": 'R', + "\u0156": 'R', + "\u0158": 'R', + "\u0155": 'r', + "\u0157": 'r', + "\u0159": 'r', + "\u015A": 'S', + "\u015C": 'S', + "\u015E": 'S', + "\u0160": 'S', + "\u015B": 's', + "\u015D": 's', + "\u015F": 's', + "\u0161": 's', + "\u0162": 'T', + "\u0164": 'T', + "\u0166": 'T', + "\u0163": 't', + "\u0165": 't', + "\u0167": 't', + "\u0168": 'U', + "\u016A": 'U', + "\u016C": 'U', + "\u016E": 'U', + "\u0170": 'U', + "\u0172": 'U', + "\u0169": 'u', + "\u016B": 'u', + "\u016D": 'u', + "\u016F": 'u', + "\u0171": 'u', + "\u0173": 'u', + "\u0174": 'W', + "\u0175": 'w', + "\u0176": 'Y', + "\u0177": 'y', + "\u0178": 'Y', + "\u0179": 'Z', + "\u017B": 'Z', + "\u017D": 'Z', + "\u017A": 'z', + "\u017C": 'z', + "\u017E": 'z', + "\u0132": 'IJ', + "\u0133": 'ij', + "\u0152": 'Oe', + "\u0153": 'oe', + "\u0149": "'n", + "\u017F": 's' + }; + /** Used to map characters to HTML entities. */ + + var htmlEscapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }; + /** Used to map HTML entities to characters. */ + + var htmlUnescapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'" + }; + /** Used to escape characters for inclusion in compiled string literals. */ + + var stringEscapes = { + '\\': '\\', + "'": "'", + '\n': 'n', + '\r': 'r', + "\u2028": 'u2028', + "\u2029": 'u2029' + }; + /** Built-in method references without a dependency on `root`. */ + + var freeParseFloat = parseFloat, + freeParseInt = parseInt; + /** Detect free variable `global` from Node.js. */ + + var freeGlobal = _typeof(commonjsGlobal) == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal; + /** Detect free variable `self`. */ + + var freeSelf = (typeof self === "undefined" ? "undefined" : _typeof(self)) == 'object' && self && self.Object === Object && self; + /** Used as a reference to the global object. */ + + var root = freeGlobal || freeSelf || Function('return this')(); + /** Detect free variable `exports`. */ + + var freeExports = exports && !exports.nodeType && exports; + /** Detect free variable `module`. */ + + var freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module; + /** Detect the popular CommonJS extension `module.exports`. */ + + var moduleExports = freeModule && freeModule.exports === freeExports; + /** Detect free variable `process` from Node.js. */ + + var freeProcess = moduleExports && freeGlobal.process; + /** Used to access faster Node.js helpers. */ + + var nodeUtil = function () { + try { + // Use `util.types` for Node.js 10+. + var types = freeModule && freeModule.require && freeModule.require('util').types; - var marked_1 = marked; + if (types) { + return types; + } // Legacy `process.binding('util')` for Node.js < 10. - var tiler$2 = utilTiler(); - var dispatch$3 = dispatch('loaded'); - var _tileZoom$2 = 14; - var _osmoseUrlRoot = 'https://osmose.openstreetmap.fr/api/0.3'; - var _osmoseData = { icons: {}, items: [] }; - // This gets reassigned if reset - var _cache$2; + return freeProcess && freeProcess.binding && freeProcess.binding('util'); + } catch (e) {} + }(); + /* Node.js helper references. */ - function abortRequest$2(controller) { - if (controller) { - controller.abort(); - } - } - function abortUnwantedRequests$2(cache, tiles) { - Object.keys(cache.inflightTile).forEach(function (k) { - var wanted = tiles.find(function (tile) { return k === tile.id; }); - if (!wanted) { - abortRequest$2(cache.inflightTile[k]); - delete cache.inflightTile[k]; - } - }); - } + var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer, + nodeIsDate = nodeUtil && nodeUtil.isDate, + nodeIsMap = nodeUtil && nodeUtil.isMap, + nodeIsRegExp = nodeUtil && nodeUtil.isRegExp, + nodeIsSet = nodeUtil && nodeUtil.isSet, + nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; + /*--------------------------------------------------------------------------*/ - function encodeIssueRtree$2(d) { - return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d }; - } + /** + * A faster alternative to `Function#apply`, this function invokes `func` + * with the `this` binding of `thisArg` and the arguments of `args`. + * + * @private + * @param {Function} func The function to invoke. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} args The arguments to invoke `func` with. + * @returns {*} Returns the result of `func`. + */ - // Replace or remove QAItem from rtree - function updateRtree$2(item, replace) { - _cache$2.rtree.remove(item, function (a, b) { return a.data.id === b.data.id; }); + function apply(func, thisArg, args) { + switch (args.length) { + case 0: + return func.call(thisArg); - if (replace) { - _cache$2.rtree.insert(item); - } - } + case 1: + return func.call(thisArg, args[0]); - // Issues shouldn't obscure eachother - function preventCoincident$1(loc) { - var coincident = false; - do { - // first time, move marker up. after that, move marker right. - var delta = coincident ? [0.00001, 0] : [0, 0.00001]; - loc = geoVecAdd(loc, delta); - var bbox = geoExtent(loc).bbox(); - coincident = _cache$2.rtree.search(bbox).length; - } while (coincident); + case 2: + return func.call(thisArg, args[0], args[1]); - return loc; - } + case 3: + return func.call(thisArg, args[0], args[1], args[2]); + } - var serviceOsmose = { - title: 'osmose', + return func.apply(thisArg, args); + } + /** + * A specialized version of `baseAggregator` for arrays. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform keys. + * @param {Object} accumulator The initial aggregated object. + * @returns {Function} Returns `accumulator`. + */ - init: function init() { - _mainFileFetcher.get('qa_data') - .then(function (d) { - _osmoseData = d.osmose; - _osmoseData.items = Object.keys(d.osmose.icons) - .map(function (s) { return s.split('-')[0]; }) - .reduce(function (unique, item) { return unique.indexOf(item) !== -1 ? unique : unique.concat( [item]); }, []); - }); - if (!_cache$2) { - this.reset(); - } + function arrayAggregator(array, setter, iteratee, accumulator) { + var index = -1, + length = array == null ? 0 : array.length; - this.event = utilRebind(this, dispatch$3, 'on'); - }, + while (++index < length) { + var value = array[index]; + setter(accumulator, value, iteratee(value), array); + } - reset: function reset() { - var _strings = {}; - var _colors = {}; - if (_cache$2) { - Object.values(_cache$2.inflightTile).forEach(abortRequest$2); - // Strings and colors are static and should not be re-populated - _strings = _cache$2.strings; - _colors = _cache$2.colors; + return accumulator; } - _cache$2 = { - data: {}, - loadedTile: {}, - inflightTile: {}, - inflightPost: {}, - closed: {}, - rtree: new RBush(), - strings: _strings, - colors: _colors - }; - }, + /** + * A specialized version of `_.forEach` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ - loadIssues: function loadIssues(projection) { - var this$1 = this; - var params = { - // Tiles return a maximum # of issues - // So we want to filter our request for only types iD supports - item: _osmoseData.items - }; + function arrayEach(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length; - // determine the needed tiles to cover the view - var tiles = tiler$2 - .zoomExtent([_tileZoom$2, _tileZoom$2]) - .getTiles(projection); + while (++index < length) { + if (iteratee(array[index], index, array) === false) { + break; + } + } - // abort inflight requests that are no longer needed - abortUnwantedRequests$2(_cache$2, tiles); + return array; + } + /** + * A specialized version of `_.forEachRight` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ - // issue new requests.. - tiles.forEach(function (tile) { - if (_cache$2.loadedTile[tile.id] || _cache$2.inflightTile[tile.id]) { return; } - var ref = tile.xyz; - var x = ref[0]; - var y = ref[1]; - var z = ref[2]; - var url = _osmoseUrlRoot + "/issues/" + z + "/" + x + "/" + y + ".json?" + utilQsString(params); + function arrayEachRight(array, iteratee) { + var length = array == null ? 0 : array.length; - var controller = new AbortController(); - _cache$2.inflightTile[tile.id] = controller; + while (length--) { + if (iteratee(array[length], length, array) === false) { + break; + } + } - d3_json(url, { signal: controller.signal }) - .then(function (data) { - delete _cache$2.inflightTile[tile.id]; - _cache$2.loadedTile[tile.id] = true; - - if (data.features) { - data.features.forEach(function (issue) { - var ref = issue.properties; - var item = ref.item; - var cl = ref.class; - var id = ref.uuid; - /* Osmose issues are uniquely identified by a unique - `item` and `class` combination (both integer values) */ - var itemType = item + "-" + cl; - - // Filter out unsupported issue types (some are too specific or advanced) - if (itemType in _osmoseData.icons) { - var loc = issue.geometry.coordinates; // lon, lat - loc = preventCoincident$1(loc); - - var d = new QAItem(loc, this$1, itemType, id, { item: item }); - - // Setting elems here prevents UI detail requests - if (item === 8300 || item === 8360) { - d.elems = []; - } + return array; + } + /** + * A specialized version of `_.every` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + */ - _cache$2.data[d.id] = d; - _cache$2.rtree.insert(encodeIssueRtree$2(d)); - } - }); - } - dispatch$3.call('loaded'); - }) - .catch(function () { - delete _cache$2.inflightTile[tile.id]; - _cache$2.loadedTile[tile.id] = true; - }); - }); - }, + function arrayEvery(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length; - loadIssueDetail: function loadIssueDetail(issue) { - var this$1 = this; + while (++index < length) { + if (!predicate(array[index], index, array)) { + return false; + } + } - // Issue details only need to be fetched once - if (issue.elems !== undefined) { - return Promise.resolve(issue); + return true; } + /** + * A specialized version of `_.filter` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ - var url = _osmoseUrlRoot + "/issue/" + (issue.id) + "?langs=" + (_mainLocalizer.localeCode()); - var cacheDetails = function (data) { - // Associated elements used for highlighting - // Assign directly for immediate use in the callback - issue.elems = data.elems.map(function (e) { return e.type.substring(0,1) + e.id; }); - - // Some issues have instance specific detail in a subtitle - issue.detail = data.subtitle ? marked_1(data.subtitle.auto) : ''; - - this$1.replaceItem(issue); - }; - return d3_json(url).then(cacheDetails).then(function () { return issue; }); - }, + function arrayFilter(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length, + resIndex = 0, + result = []; - loadStrings: function loadStrings(locale) { - if ( locale === void 0 ) locale=_mainLocalizer.localeCode(); + while (++index < length) { + var value = array[index]; - var items = Object.keys(_osmoseData.icons); + if (predicate(value, index, array)) { + result[resIndex++] = value; + } + } - if ( - locale in _cache$2.strings - && Object.keys(_cache$2.strings[locale]).length === items.length - ) { - return Promise.resolve(_cache$2.strings[locale]); + return result; } + /** + * A specialized version of `_.includes` for arrays without support for + * specifying an index to search from. + * + * @private + * @param {Array} [array] The array to inspect. + * @param {*} target The value to search for. + * @returns {boolean} Returns `true` if `target` is found, else `false`. + */ - // May be partially populated already if some requests were successful - if (!(locale in _cache$2.strings)) { - _cache$2.strings[locale] = {}; + + function arrayIncludes(array, value) { + var length = array == null ? 0 : array.length; + return !!length && baseIndexOf(array, value, 0) > -1; } + /** + * This function is like `arrayIncludes` except that it accepts a comparator. + * + * @private + * @param {Array} [array] The array to inspect. + * @param {*} target The value to search for. + * @param {Function} comparator The comparator invoked per element. + * @returns {boolean} Returns `true` if `target` is found, else `false`. + */ - // Only need to cache strings for supported issue types - // Using multiple individual item + class requests to reduce fetched data size - var allRequests = items.map(function (itemType) { - // No need to request data we already have - if (itemType in _cache$2.strings[locale]) { return; } - var cacheData = function (data) { - // Bunch of nested single value arrays of objects - var ref = data.categories; - var cat = ref[0]; if ( cat === void 0 ) cat = {items:[]}; - var ref$1 = cat.items; - var item = ref$1[0]; if ( item === void 0 ) item = {class:[]}; - var ref$2 = item.class; - var cl = ref$2[0]; if ( cl === void 0 ) cl = null; - - // If null default value is reached, data wasn't as expected (or was empty) - if (!cl) { - /* eslint-disable no-console */ - console.log(("Osmose strings request (" + itemType + ") had unexpected data")); - /* eslint-enable no-console */ - return; - } + function arrayIncludesWith(array, value, comparator) { + var index = -1, + length = array == null ? 0 : array.length; - // Cache served item colors to automatically style issue markers later - var itemInt = item.item; - var color = item.color; - if (/^#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}/.test(color)) { - _cache$2.colors[itemInt] = color; + while (++index < length) { + if (comparator(value, array[index])) { + return true; } + } - // Value of root key will be null if no string exists - // If string exists, value is an object with key 'auto' for string - var title = cl.title; - var detail = cl.detail; - var fix = cl.fix; - var trap = cl.trap; - - // Osmose titles shouldn't contain markdown - var issueStrings = {}; - if (title) { issueStrings.title = title.auto; } - if (detail) { issueStrings.detail = marked_1(detail.auto); } - if (trap) { issueStrings.trap = marked_1(trap.auto); } - if (fix) { issueStrings.fix = marked_1(fix.auto); } - - _cache$2.strings[locale][itemType] = issueStrings; - }; - - var ref = itemType.split('-'); - var item = ref[0]; - var cl = ref[1]; + return false; + } + /** + * A specialized version of `_.map` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ - // Osmose API falls back to English strings where untranslated or if locale doesn't exist - var url = _osmoseUrlRoot + "/items/" + item + "/class/" + cl + "?langs=" + locale; - return d3_json(url).then(cacheData); - }); + function arrayMap(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length, + result = Array(length); - return Promise.all(allRequests).then(function () { return _cache$2.strings[locale]; }); - }, + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } - getStrings: function getStrings(itemType, locale) { - if ( locale === void 0 ) locale=_mainLocalizer.localeCode(); + return result; + } + /** + * Appends the elements of `values` to `array`. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to append. + * @returns {Array} Returns `array`. + */ - // No need to fallback to English, Osmose API handles this for us - return (locale in _cache$2.strings) ? _cache$2.strings[locale][itemType] : {}; - }, - getColor: function getColor(itemType) { - return (itemType in _cache$2.colors) ? _cache$2.colors[itemType] : '#FFFFFF'; - }, + function arrayPush(array, values) { + var index = -1, + length = values.length, + offset = array.length; - postUpdate: function postUpdate(issue, callback) { - var this$1 = this; + while (++index < length) { + array[offset + index] = values[index]; + } - if (_cache$2.inflightPost[issue.id]) { - return callback({ message: 'Issue update already inflight', status: -2 }, issue); + return array; } + /** + * A specialized version of `_.reduce` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {boolean} [initAccum] Specify using the first element of `array` as + * the initial value. + * @returns {*} Returns the accumulated value. + */ - // UI sets the status to either 'done' or 'false' - var url = _osmoseUrlRoot + "/issue/" + (issue.id) + "/" + (issue.newStatus); - var controller = new AbortController(); - var after = function () { - delete _cache$2.inflightPost[issue.id]; - this$1.removeItem(issue); - if (issue.newStatus === 'done') { - // Keep track of the number of issues closed per `item` to tag the changeset - if (!(issue.item in _cache$2.closed)) { - _cache$2.closed[issue.item] = 0; - } - _cache$2.closed[issue.item] += 1; + function arrayReduce(array, iteratee, accumulator, initAccum) { + var index = -1, + length = array == null ? 0 : array.length; + + if (initAccum && length) { + accumulator = array[++index]; } - if (callback) { callback(null, issue); } - }; - _cache$2.inflightPost[issue.id] = controller; + while (++index < length) { + accumulator = iteratee(accumulator, array[index], index, array); + } - fetch(url, { signal: controller.signal }) - .then(after) - .catch(function (err) { - delete _cache$2.inflightPost[issue.id]; - if (callback) { callback(err.message); } - }); - }, + return accumulator; + } + /** + * A specialized version of `_.reduceRight` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {boolean} [initAccum] Specify using the last element of `array` as + * the initial value. + * @returns {*} Returns the accumulated value. + */ - // Get all cached QAItems covering the viewport - getItems: function getItems(projection) { - var viewport = projection.clipExtent(); - var min = [viewport[0][0], viewport[1][1]]; - var max = [viewport[1][0], viewport[0][1]]; - var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox(); - return _cache$2.rtree.search(bbox).map(function (d) { return d.data; }); - }, + function arrayReduceRight(array, iteratee, accumulator, initAccum) { + var length = array == null ? 0 : array.length; - // Get a QAItem from cache - // NOTE: Don't change method name until UI v3 is merged - getError: function getError(id) { - return _cache$2.data[id]; - }, + if (initAccum && length) { + accumulator = array[--length]; + } - // get the name of the icon to display for this item - getIcon: function getIcon(itemType) { - return _osmoseData.icons[itemType]; - }, + while (length--) { + accumulator = iteratee(accumulator, array[length], length, array); + } - // Replace a single QAItem in the cache - replaceItem: function replaceItem(item) { - if (!(item instanceof QAItem) || !item.id) { return; } + return accumulator; + } + /** + * A specialized version of `_.some` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ - _cache$2.data[item.id] = item; - updateRtree$2(encodeIssueRtree$2(item), true); // true = replace - return item; - }, - // Remove a single QAItem from the cache - removeItem: function removeItem(item) { - if (!(item instanceof QAItem) || !item.id) { return; } + function arraySome(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length; - delete _cache$2.data[item.id]; - updateRtree$2(encodeIssueRtree$2(item), false); // false = remove - }, + while (++index < length) { + if (predicate(array[index], index, array)) { + return true; + } + } - // Used to populate `closed:osmose:*` changeset tags - getClosedCounts: function getClosedCounts() { - return _cache$2.closed; - }, + return false; + } + /** + * Gets the size of an ASCII `string`. + * + * @private + * @param {string} string The string inspect. + * @returns {number} Returns the string size. + */ - itemURL: function itemURL(item) { - return ("https://osmose.openstreetmap.fr/en/error/" + (item.id)); - } - }; - /* - A standalone SVG element that contains only a `defs` sub-element. To be - used once globally, since defs IDs must be unique within a document. - */ - function svgDefs(context) { + var asciiSize = baseProperty('length'); + /** + * Converts an ASCII `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ - function drawDefs(selection) { - var defs = selection.append('defs'); - - // add markers - defs - .append('marker') - .attr('id', 'ideditor-oneway-marker') - .attr('viewBox', '0 0 10 5') - .attr('refX', 2.5) - .attr('refY', 2.5) - .attr('markerWidth', 2) - .attr('markerHeight', 2) - .attr('markerUnits', 'strokeWidth') - .attr('orient', 'auto') - .append('path') - .attr('class', 'oneway-marker-path') - .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') - .attr('stroke', 'none') - .attr('fill', '#000') - .attr('opacity', '0.75'); - - // SVG markers have to be given a colour where they're defined - // (they can't inherit it from the line they're attached to), - // so we need to manually define markers for each color of tag - // (also, it's slightly nicer if we can control the - // positioning for different tags) - function addSidedMarker(name, color, offset) { - defs - .append('marker') - .attr('id', 'ideditor-sided-marker-' + name) - .attr('viewBox', '0 0 2 2') - .attr('refX', 1) - .attr('refY', -offset) - .attr('markerWidth', 1.5) - .attr('markerHeight', 1.5) - .attr('markerUnits', 'strokeWidth') - .attr('orient', 'auto') - .append('path') - .attr('class', 'sided-marker-path sided-marker-' + name + '-path') - .attr('d', 'M 0,0 L 1,1 L 2,0 z') - .attr('stroke', 'none') - .attr('fill', color); - } - addSidedMarker('natural', 'rgb(170, 170, 170)', 0); - // for a coastline, the arrows are (somewhat unintuitively) on - // the water side, so let's color them blue (with a gap) to - // give a stronger indication - addSidedMarker('coastline', '#77dede', 1); - addSidedMarker('waterway', '#77dede', 1); - // barriers have a dashed line, and separating the triangle - // from the line visually suits that - addSidedMarker('barrier', '#ddd', 1); - addSidedMarker('man_made', '#fff', 0); - - defs - .append('marker') - .attr('id', 'ideditor-viewfield-marker') - .attr('viewBox', '0 0 16 16') - .attr('refX', 8) - .attr('refY', 16) - .attr('markerWidth', 4) - .attr('markerHeight', 4) - .attr('markerUnits', 'strokeWidth') - .attr('orient', 'auto') - .append('path') - .attr('class', 'viewfield-marker-path') - .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') - .attr('fill', '#333') - .attr('fill-opacity', '0.75') - .attr('stroke', '#fff') - .attr('stroke-width', '0.5px') - .attr('stroke-opacity', '0.75'); - - defs - .append('marker') - .attr('id', 'ideditor-viewfield-marker-wireframe') - .attr('viewBox', '0 0 16 16') - .attr('refX', 8) - .attr('refY', 16) - .attr('markerWidth', 4) - .attr('markerHeight', 4) - .attr('markerUnits', 'strokeWidth') - .attr('orient', 'auto') - .append('path') - .attr('class', 'viewfield-marker-path') - .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') - .attr('fill', 'none') - .attr('stroke', '#fff') - .attr('stroke-width', '0.5px') - .attr('stroke-opacity', '0.75'); - - // add patterns - var patterns = defs.selectAll('pattern') - .data([ - // pattern name, pattern image name - ['beach', 'dots'], - ['construction', 'construction'], - ['cemetery', 'cemetery'], - ['cemetery_christian', 'cemetery_christian'], - ['cemetery_buddhist', 'cemetery_buddhist'], - ['cemetery_muslim', 'cemetery_muslim'], - ['cemetery_jewish', 'cemetery_jewish'], - ['farmland', 'farmland'], - ['farmyard', 'farmyard'], - ['forest', 'forest'], - ['forest_broadleaved', 'forest_broadleaved'], - ['forest_needleleaved', 'forest_needleleaved'], - ['forest_leafless', 'forest_leafless'], - ['golf_green', 'grass'], - ['grass', 'grass'], - ['landfill', 'landfill'], - ['meadow', 'grass'], - ['orchard', 'orchard'], - ['pond', 'pond'], - ['quarry', 'quarry'], - ['scrub', 'bushes'], - ['vineyard', 'vineyard'], - ['water_standing', 'lines'], - ['waves', 'waves'], - ['wetland', 'wetland'], - ['wetland_marsh', 'wetland_marsh'], - ['wetland_swamp', 'wetland_swamp'], - ['wetland_bog', 'wetland_bog'], - ['wetland_reedbed', 'wetland_reedbed'] - ]) - .enter() - .append('pattern') - .attr('id', function (d) { return 'ideditor-pattern-' + d[0]; }) - .attr('width', 32) - .attr('height', 32) - .attr('patternUnits', 'userSpaceOnUse'); - - patterns - .append('rect') - .attr('x', 0) - .attr('y', 0) - .attr('width', 32) - .attr('height', 32) - .attr('class', function (d) { return 'pattern-color-' + d[0]; }); - - patterns - .append('image') - .attr('x', 0) - .attr('y', 0) - .attr('width', 32) - .attr('height', 32) - .attr('xlink:href', function (d) { - return context.imagePath('pattern/' + d[1] + '.png'); - }); + function asciiToArray(string) { + return string.split(''); + } + /** + * Splits an ASCII `string` into an array of its words. + * + * @private + * @param {string} The string to inspect. + * @returns {Array} Returns the words of `string`. + */ - // add clip paths - defs.selectAll('clipPath') - .data([12, 18, 20, 32, 45]) - .enter() - .append('clipPath') - .attr('id', function (d) { return 'ideditor-clip-square-' + d; }) - .append('rect') - .attr('x', 0) - .attr('y', 0) - .attr('width', function (d) { return d; }) - .attr('height', function (d) { return d; }); - // add symbol spritesheets - defs - .call(drawDefs.addSprites, [ - 'iD-sprite', 'maki-sprite', 'temaki-sprite', 'fa-sprite', 'tnp-sprite', 'community-sprite' - ], true); + function asciiWords(string) { + return string.match(reAsciiWord) || []; } + /** + * The base implementation of methods like `_.findKey` and `_.findLastKey`, + * without support for iteratee shorthands, which iterates over `collection` + * using `eachFunc`. + * + * @private + * @param {Array|Object} collection The collection to inspect. + * @param {Function} predicate The function invoked per iteration. + * @param {Function} eachFunc The function to iterate over `collection`. + * @returns {*} Returns the found element or its key, else `undefined`. + */ - drawDefs.addSprites = function(selection, ids, overrideColors) { - var spritesheets = selection.selectAll('.spritesheet'); - var currData = spritesheets.data(); - var data = utilArrayUniq(currData.concat(ids)); - - spritesheets - .data(data) - .enter() - .append('g') - .attr('class', function(d) { return 'spritesheet spritesheet-' + d; }) - .each(function(d) { - var url = context.imagePath(d + '.svg'); - var node = select(this).node(); - - svg(url) - .then(function(svg) { - node.appendChild( - select(svg.documentElement).attr('id', 'ideditor-' + d).node() - ); - if (overrideColors && d !== 'iD-sprite') { // allow icon colors to be overridden.. - select(node).selectAll('path') - .attr('fill', 'currentColor'); - } - }) - .catch(function() { - /* ignore */ - }); - }); - }; + function baseFindKey(collection, predicate, eachFunc) { + var result; + eachFunc(collection, function (value, key, collection) { + if (predicate(value, key, collection)) { + result = key; + return false; + } + }); + return result; + } + /** + * The base implementation of `_.findIndex` and `_.findLastIndex` without + * support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} predicate The function invoked per iteration. + * @param {number} fromIndex The index to search from. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {number} Returns the index of the matched value, else `-1`. + */ - return drawDefs; - } - - /* global Mapillary:false */ - - - var apibase = 'https://a.mapillary.com/v3/'; - var viewercss = 'mapillary-js/mapillary.min.css'; - var viewerjs = 'mapillary-js/mapillary.min.js'; - var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi'; - var mapFeatureConfig = { - values: [ - 'construction--flat--crosswalk-plain', - 'marking--discrete--crosswalk-zebra', - 'object--banner', - 'object--bench', - 'object--bike-rack', - 'object--billboard', - 'object--catch-basin', - 'object--cctv-camera', - 'object--fire-hydrant', - 'object--mailbox', - 'object--manhole', - 'object--phone-booth', - 'object--sign--advertisement', - 'object--sign--information', - 'object--sign--store', - 'object--street-light', - 'object--support--utility-pole', - 'object--traffic-light--*', - 'object--traffic-light--pedestrians', - 'object--trash-can' - ].join(',') - }; - var maxResults = 1000; - var tileZoom = 14; - var tiler$3 = utilTiler().zoomExtent([tileZoom, tileZoom]).skipNullIsland(true); - var dispatch$4 = dispatch('loadedImages', 'loadedSigns', 'loadedMapFeatures', 'bearingChanged'); - var _mlyFallback = false; - var _mlyCache; - var _mlyClicks; - var _mlySelectedImageKey; - var _mlyViewer; + function baseFindIndex(array, predicate, fromIndex, fromRight) { + var length = array.length, + index = fromIndex + (fromRight ? 1 : -1); + while (fromRight ? index-- : ++index < length) { + if (predicate(array[index], index, array)) { + return index; + } + } - function abortRequest$3(controller) { - controller.abort(); - } + return -1; + } + /** + * The base implementation of `_.indexOf` without `fromIndex` bounds checks. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ - function maxPageAtZoom(z) { - if (z < 15) { return 2; } - if (z === 15) { return 5; } - if (z === 16) { return 10; } - if (z === 17) { return 20; } - if (z === 18) { return 40; } - if (z > 18) { return 80; } - } + function baseIndexOf(array, value, fromIndex) { + return value === value ? strictIndexOf(array, value, fromIndex) : baseFindIndex(array, baseIsNaN, fromIndex); + } + /** + * This function is like `baseIndexOf` except that it accepts a comparator. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @param {Function} comparator The comparator invoked per element. + * @returns {number} Returns the index of the matched value, else `-1`. + */ - function loadTiles(which, url, projection) { - var currZoom = Math.floor(geoScaleToZoom(projection.scale())); - var tiles = tiler$3.getTiles(projection); + function baseIndexOfWith(array, value, fromIndex, comparator) { + var index = fromIndex - 1, + length = array.length; - // abort inflight requests that are no longer needed - var cache = _mlyCache[which]; - Object.keys(cache.inflight).forEach(function(k) { - var wanted = tiles.find(function(tile) { return k.indexOf(tile.id + ',') === 0; }); - if (!wanted) { - abortRequest$3(cache.inflight[k]); - delete cache.inflight[k]; + while (++index < length) { + if (comparator(array[index], value)) { + return index; } - }); - - tiles.forEach(function(tile) { - loadNextTilePage(which, currZoom, url, tile); - }); - } - + } - function loadNextTilePage(which, currZoom, url, tile) { - var cache = _mlyCache[which]; - var rect = tile.extent.rectangle(); - var maxPages = maxPageAtZoom(currZoom); - var nextPage = cache.nextPage[tile.id] || 0; - var nextURL = cache.nextURL[tile.id] || url + - utilQsString({ - per_page: maxResults, - page: nextPage, - client_id: clientId, - bbox: [rect[0], rect[1], rect[2], rect[3]].join(','), - }); + return -1; + } + /** + * The base implementation of `_.isNaN` without support for number objects. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + */ - if (nextPage > maxPages) { return; } - var id = tile.id + ',' + String(nextPage); - if (cache.loaded[id] || cache.inflight[id]) { return; } + function baseIsNaN(value) { + return value !== value; + } + /** + * The base implementation of `_.mean` and `_.meanBy` without support for + * iteratee shorthands. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {number} Returns the mean. + */ - var controller = new AbortController(); - cache.inflight[id] = controller; - var options = { - method: 'GET', - signal: controller.signal, - headers: { 'Content-Type': 'application/json' } - }; + function baseMean(array, iteratee) { + var length = array == null ? 0 : array.length; + return length ? baseSum(array, iteratee) / length : NAN; + } + /** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new accessor function. + */ - fetch(nextURL, options) - .then(function(response) { - if (!response.ok) { - throw new Error(response.status + ' ' + response.statusText); - } - var linkHeader = response.headers.get('Link'); - if (linkHeader) { - var pagination = parsePagination(linkHeader); - if (pagination.next) { - cache.nextURL[tile.id] = pagination.next; - } - } - return response.json(); - }) - .then(function(data) { - cache.loaded[id] = true; - delete cache.inflight[id]; - if (!data || !data.features || !data.features.length) { - throw new Error('No Data'); - } - var features = data.features.map(function(feature) { - var loc = feature.geometry.coordinates; - var d; - - // An image (shown as a green dot on the map) is a single street photo with extra - // information such as location, camera angle (CA), camera model, and so on. - // Each image feature is a GeoJSON Point - if (which === 'images') { - d = { - loc: loc, - key: feature.properties.key, - ca: feature.properties.ca, - captured_at: feature.properties.captured_at, - captured_by: feature.properties.username, - pano: feature.properties.pano - }; - - cache.forImageKey[d.key] = d; // cache imageKey -> image - - // Mapillary organizes images as sequences. A sequence of images are continuously captured - // by a user at a give time. Sequences are shown on the map as green lines. - // Each sequence feature is a GeoJSON LineString - } else if (which === 'sequences') { - var sequenceKey = feature.properties.key; - cache.lineString[sequenceKey] = feature; // cache sequenceKey -> lineString - feature.properties.coordinateProperties.image_keys.forEach(function(imageKey) { - cache.forImageKey[imageKey] = sequenceKey; // cache imageKey -> sequenceKey - }); - return false; // because no `d` data worth loading into an rbush - - // An image detection is a semantic pixel area on an image. The area could indicate - // sky, trees, sidewalk in the image. A detection can be a polygon, a bounding box, or a point. - // Each image_detection feature is a GeoJSON Point (located where the image was taken) - } else if (which === 'image_detections') { - d = { - key: feature.properties.key, - image_key: feature.properties.image_key, - value: feature.properties.value, - package: feature.properties.package, - shape: feature.properties.shape - }; - - // cache imageKey -> image_detections - if (!cache.forImageKey[d.image_key]) { - cache.forImageKey[d.image_key] = []; - } - cache.forImageKey[d.image_key].push(d); - return false; // because no `d` data worth loading into an rbush - - - // A map feature is a real world object that can be shown on a map. It could be any object - // recognized from images, manually added in images, or added on the map. - // Each map feature is a GeoJSON Point (located where the feature is) - } else if (which === 'map_features' || which === 'points') { - d = { - loc: loc, - key: feature.properties.key, - value: feature.properties.value, - package: feature.properties.package, - detections: feature.properties.detections - }; - } + function baseProperty(key) { + return function (object) { + return object == null ? undefined$1 : object[key]; + }; + } + /** + * The base implementation of `_.propertyOf` without support for deep paths. + * + * @private + * @param {Object} object The object to query. + * @returns {Function} Returns the new accessor function. + */ - return { - minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d - }; - }).filter(Boolean); + function basePropertyOf(object) { + return function (key) { + return object == null ? undefined$1 : object[key]; + }; + } + /** + * The base implementation of `_.reduce` and `_.reduceRight`, without support + * for iteratee shorthands, which iterates over `collection` using `eachFunc`. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} accumulator The initial value. + * @param {boolean} initAccum Specify using the first or last element of + * `collection` as the initial value. + * @param {Function} eachFunc The function to iterate over `collection`. + * @returns {*} Returns the accumulated value. + */ - if (cache.rtree && features) { - cache.rtree.load(features); - } - if (data.features.length === maxResults) { // more pages to load - cache.nextPage[tile.id] = nextPage + 1; - loadNextTilePage(which, currZoom, url, tile); - } else { - cache.nextPage[tile.id] = Infinity; // no more pages to load - } + function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { + eachFunc(collection, function (value, index, collection) { + accumulator = initAccum ? (initAccum = false, value) : iteratee(accumulator, value, index, collection); + }); + return accumulator; + } + /** + * The base implementation of `_.sortBy` which uses `comparer` to define the + * sort order of `array` and replaces criteria objects with their corresponding + * values. + * + * @private + * @param {Array} array The array to sort. + * @param {Function} comparer The function to define sort order. + * @returns {Array} Returns `array`. + */ - if (which === 'images' || which === 'sequences') { - dispatch$4.call('loadedImages'); - } else if (which === 'map_features') { - dispatch$4.call('loadedSigns'); - } else if (which === 'points') { - dispatch$4.call('loadedMapFeatures'); - } - }) - .catch(function() { - cache.loaded[id] = true; - delete cache.inflight[id]; - }); - } - // extract links to pages of API results - function parsePagination(links) { - return links.split(',').map(function(rel) { - var elements = rel.split(';'); - if (elements.length === 2) { - return [ - /<(.+)>/.exec(elements[0])[1], - /rel="(.+)"/.exec(elements[1])[1] - ]; - } else { - return ['','']; - } - }).reduce(function(pagination, val) { - pagination[val[1]] = val[0]; - return pagination; - }, {}); - } + function baseSortBy(array, comparer) { + var length = array.length; + array.sort(comparer); + while (length--) { + array[length] = array[length].value; + } - // partition viewport into higher zoom tiles - function partitionViewport(projection) { - var z = geoScaleToZoom(projection.scale()); - var z2 = (Math.ceil(z * 2) / 2) + 2.5; // round to next 0.5 and add 2.5 - var tiler = utilTiler().zoomExtent([z2, z2]); + return array; + } + /** + * The base implementation of `_.sum` and `_.sumBy` without support for + * iteratee shorthands. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {number} Returns the sum. + */ - return tiler.getTiles(projection) - .map(function(tile) { return tile.extent; }); - } + function baseSum(array, iteratee) { + var result, + index = -1, + length = array.length; - // no more than `limit` results per partition. - function searchLimited(limit, projection, rtree) { - limit = limit || 5; + while (++index < length) { + var current = iteratee(array[index]); - return partitionViewport(projection) - .reduce(function(result, extent) { - var found = rtree.search(extent.bbox()) - .slice(0, limit) - .map(function(d) { return d.data; }); + if (current !== undefined$1) { + result = result === undefined$1 ? current : result + current; + } + } - return (found.length ? result.concat(found) : result); - }, []); - } + return result; + } + /** + * The base implementation of `_.times` without support for iteratee shorthands + * or max array length checks. + * + * @private + * @param {number} n The number of times to invoke `iteratee`. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the array of results. + */ + function baseTimes(n, iteratee) { + var index = -1, + result = Array(n); - var serviceMapillary = { + while (++index < n) { + result[index] = iteratee(index); + } - init: function() { - if (!_mlyCache) { - this.reset(); - } + return result; + } + /** + * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array + * of key-value pairs for `object` corresponding to the property names of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the key-value pairs. + */ - this.event = utilRebind(this, dispatch$4, 'on'); - }, - reset: function() { - if (_mlyCache) { - Object.values(_mlyCache.images.inflight).forEach(abortRequest$3); - Object.values(_mlyCache.image_detections.inflight).forEach(abortRequest$3); - Object.values(_mlyCache.map_features.inflight).forEach(abortRequest$3); - Object.values(_mlyCache.points.inflight).forEach(abortRequest$3); - Object.values(_mlyCache.sequences.inflight).forEach(abortRequest$3); - } - - _mlyCache = { - images: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: new RBush(), forImageKey: {} }, - image_detections: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, forImageKey: {} }, - map_features: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: new RBush() }, - points: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: new RBush() }, - sequences: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: new RBush(), forImageKey: {}, lineString: {} } - }; + function baseToPairs(object, props) { + return arrayMap(props, function (key) { + return [key, object[key]]; + }); + } + /** + * The base implementation of `_.trim`. + * + * @private + * @param {string} string The string to trim. + * @returns {string} Returns the trimmed string. + */ - _mlySelectedImageKey = null; - _mlyClicks = []; - }, + function baseTrim(string) { + return string ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '') : string; + } + /** + * The base implementation of `_.unary` without support for storing metadata. + * + * @private + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + */ - images: function(projection) { - var limit = 5; - return searchLimited(limit, projection, _mlyCache.images.rtree); - }, + function baseUnary(func) { + return function (value) { + return func(value); + }; + } + /** + * The base implementation of `_.values` and `_.valuesIn` which creates an + * array of `object` property values corresponding to the property names + * of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the array of property values. + */ - signs: function(projection) { - var limit = 5; - return searchLimited(limit, projection, _mlyCache.map_features.rtree); - }, + function baseValues(object, props) { + return arrayMap(props, function (key) { + return object[key]; + }); + } + /** + * Checks if a `cache` value for `key` exists. + * + * @private + * @param {Object} cache The cache to query. + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ - mapFeatures: function(projection) { - var limit = 5; - return searchLimited(limit, projection, _mlyCache.points.rtree); - }, + function cacheHas(cache, key) { + return cache.has(key); + } + /** + * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol + * that is not found in the character symbols. + * + * @private + * @param {Array} strSymbols The string symbols to inspect. + * @param {Array} chrSymbols The character symbols to find. + * @returns {number} Returns the index of the first unmatched string symbol. + */ - cachedImage: function(imageKey) { - return _mlyCache.images.forImageKey[imageKey]; - }, + function charsStartIndex(strSymbols, chrSymbols) { + var index = -1, + length = strSymbols.length; - sequences: function(projection) { - var viewport = projection.clipExtent(); - var min = [viewport[0][0], viewport[1][1]]; - var max = [viewport[1][0], viewport[0][1]]; - var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox(); - var sequenceKeys = {}; + while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} - // all sequences for images in viewport - _mlyCache.images.rtree.search(bbox) - .forEach(function(d) { - var sequenceKey = _mlyCache.sequences.forImageKey[d.data.key]; - if (sequenceKey) { - sequenceKeys[sequenceKey] = true; - } - }); + return index; + } + /** + * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol + * that is not found in the character symbols. + * + * @private + * @param {Array} strSymbols The string symbols to inspect. + * @param {Array} chrSymbols The character symbols to find. + * @returns {number} Returns the index of the last unmatched string symbol. + */ - // Return lineStrings for the sequences - return Object.keys(sequenceKeys).map(function(sequenceKey) { - return _mlyCache.sequences.lineString[sequenceKey]; - }); - }, + function charsEndIndex(strSymbols, chrSymbols) { + var index = strSymbols.length; - signsSupported: function() { - return true; - }, + while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} + return index; + } + /** + * Gets the number of `placeholder` occurrences in `array`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} placeholder The placeholder to search for. + * @returns {number} Returns the placeholder count. + */ - loadImages: function(projection) { - loadTiles('images', apibase + 'images?sort_by=key&', projection); - loadTiles('sequences', apibase + 'sequences?sort_by=key&', projection); - }, + function countHolders(array, placeholder) { + var length = array.length, + result = 0; - loadSigns: function(projection) { - // if we are looking at signs, we'll actually need to fetch images too - loadTiles('images', apibase + 'images?sort_by=key&', projection); - loadTiles('map_features', apibase + 'map_features?layers=trafficsigns&min_nbr_image_detections=2&sort_by=key&', projection); - loadTiles('image_detections', apibase + 'image_detections?layers=trafficsigns&sort_by=key&', projection); - }, + while (length--) { + if (array[length] === placeholder) { + ++result; + } + } + return result; + } + /** + * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A + * letters to basic Latin letters. + * + * @private + * @param {string} letter The matched letter to deburr. + * @returns {string} Returns the deburred letter. + */ - loadMapFeatures: function(projection) { - // if we are looking at signs, we'll actually need to fetch images too - loadTiles('images', apibase + 'images?sort_by=key', projection); - loadTiles('points', apibase + 'map_features?layers=points&min_nbr_image_detections=2&sort_by=key&values=' + mapFeatureConfig.values + '&', projection); - loadTiles('image_detections', apibase + 'image_detections?layers=points&sort_by=key&values=' + mapFeatureConfig.values + '&', projection); - }, + var deburrLetter = basePropertyOf(deburredLetters); + /** + * Used by `_.escape` to convert characters to HTML entities. + * + * @private + * @param {string} chr The matched character to escape. + * @returns {string} Returns the escaped character. + */ - loadViewer: function(context) { - // add mly-wrapper - var wrap = context.container().select('.photoviewer') - .selectAll('.mly-wrapper') - .data([0]); + var escapeHtmlChar = basePropertyOf(htmlEscapes); + /** + * Used by `_.template` to escape characters for inclusion in compiled string literals. + * + * @private + * @param {string} chr The matched character to escape. + * @returns {string} Returns the escaped character. + */ - wrap.enter() - .append('div') - .attr('id', 'ideditor-mly') - .attr('class', 'photo-wrapper mly-wrapper') - .classed('hide', true); + function escapeStringChar(chr) { + return '\\' + stringEscapes[chr]; + } + /** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ - // load mapillary-viewercss - select('head').selectAll('#ideditor-mapillary-viewercss') - .data([0]) - .enter() - .append('link') - .attr('id', 'ideditor-mapillary-viewercss') - .attr('rel', 'stylesheet') - .attr('href', context.asset(viewercss)); - // load mapillary-viewerjs - select('head').selectAll('#ideditor-mapillary-viewerjs') - .data([0]) - .enter() - .append('script') - .attr('id', 'ideditor-mapillary-viewerjs') - .attr('src', context.asset(viewerjs)); - - // load mapillary signs sprite - var defs = context.container().select('defs'); - defs.call(svgDefs(context).addSprites, ['mapillary-sprite', 'mapillary-object-sprite'], false /* don't override colors */ ); - - // Register viewer resize handler - context.ui().photoviewer.on('resize.mapillary', function() { - if (_mlyViewer) { - _mlyViewer.resize(); - } - }); - }, + function getValue(object, key) { + return object == null ? undefined$1 : object[key]; + } + /** + * Checks if `string` contains Unicode symbols. + * + * @private + * @param {string} string The string to inspect. + * @returns {boolean} Returns `true` if a symbol is found, else `false`. + */ - showViewer: function(context) { - var wrap = context.container().select('.photoviewer') - .classed('hide', false); + function hasUnicode(string) { + return reHasUnicode.test(string); + } + /** + * Checks if `string` contains a word composed of Unicode symbols. + * + * @private + * @param {string} string The string to inspect. + * @returns {boolean} Returns `true` if a word is found, else `false`. + */ - var isHidden = wrap.selectAll('.photo-wrapper.mly-wrapper.hide').size(); - if (isHidden && _mlyViewer) { - wrap - .selectAll('.photo-wrapper:not(.mly-wrapper)') - .classed('hide', true); + function hasUnicodeWord(string) { + return reHasUnicodeWord.test(string); + } + /** + * Converts `iterator` to an array. + * + * @private + * @param {Object} iterator The iterator to convert. + * @returns {Array} Returns the converted array. + */ - wrap - .selectAll('.photo-wrapper.mly-wrapper') - .classed('hide', false); - _mlyViewer.resize(); - } + function iteratorToArray(iterator) { + var data, + result = []; - return this; - }, + while (!(data = iterator.next()).done) { + result.push(data.value); + } + return result; + } + /** + * Converts `map` to its key-value pairs. + * + * @private + * @param {Object} map The map to convert. + * @returns {Array} Returns the key-value pairs. + */ - hideViewer: function(context) { - _mlySelectedImageKey = null; - if (!_mlyFallback && _mlyViewer) { - _mlyViewer.getComponent('sequence').stop(); - } + function mapToArray(map) { + var index = -1, + result = Array(map.size); + map.forEach(function (value, key) { + result[++index] = [key, value]; + }); + return result; + } + /** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ - var viewer = context.container().select('.photoviewer'); - if (!viewer.empty()) { viewer.datum(null); } - viewer - .classed('hide', true) - .selectAll('.photo-wrapper') - .classed('hide', true); + function overArg(func, transform) { + return function (arg) { + return func(transform(arg)); + }; + } + /** + * Replaces all `placeholder` elements in `array` with an internal placeholder + * and returns an array of their indexes. + * + * @private + * @param {Array} array The array to modify. + * @param {*} placeholder The placeholder to replace. + * @returns {Array} Returns the new array of placeholder indexes. + */ - context.container().selectAll('.viewfield-group, .sequence, .icon-detected') - .classed('currentView', false); - return this.setStyles(context, null, true); - }, + function replaceHolders(array, placeholder) { + var index = -1, + length = array.length, + resIndex = 0, + result = []; + while (++index < length) { + var value = array[index]; - parsePagination: parsePagination, + if (value === placeholder || value === PLACEHOLDER) { + array[index] = PLACEHOLDER; + result[resIndex++] = index; + } + } + return result; + } + /** + * Converts `set` to an array of its values. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the values. + */ - updateViewer: function(context, imageKey) { - if (!imageKey) { return this; } - if (!_mlyViewer) { - this.initViewer(context, imageKey); - } else { - _mlyViewer.moveToKey(imageKey) - .catch(function(e) { console.error('mly3', e); }); // eslint-disable-line no-console - } + function setToArray(set) { + var index = -1, + result = Array(set.size); + set.forEach(function (value) { + result[++index] = value; + }); + return result; + } + /** + * Converts `set` to its value-value pairs. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the value-value pairs. + */ - return this; - }, + function setToPairs(set) { + var index = -1, + result = Array(set.size); + set.forEach(function (value) { + result[++index] = [value, value]; + }); + return result; + } + /** + * A specialized version of `_.indexOf` which performs strict equality + * comparisons of values, i.e. `===`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ - initViewer: function(context, imageKey) { - var that = this; - if (window.Mapillary && imageKey) { - var opts = { - baseImageSize: 320, - component: { - cover: false, - keyboard: false, - tag: true - } - }; - // Disable components requiring WebGL support - if (!Mapillary.isSupported() && Mapillary.isFallbackSupported()) { - _mlyFallback = true; - opts.component = { - cover: false, - direction: false, - imagePlane: false, - keyboard: false, - mouse: false, - sequence: false, - tag: false, - image: true, // fallback - navigation: true // fallback - }; - } + function strictIndexOf(array, value, fromIndex) { + var index = fromIndex - 1, + length = array.length; - _mlyViewer = new Mapillary.Viewer('ideditor-mly', clientId, null, opts); - _mlyViewer.on('nodechanged', nodeChanged); - _mlyViewer.on('bearingchanged', bearingChanged); - _mlyViewer.moveToKey(imageKey) - .catch(function(e) { console.error('mly3', e); }); // eslint-disable-line no-console + while (++index < length) { + if (array[index] === value) { + return index; } + } - // nodeChanged: called after the viewer has changed images and is ready. - // - // There is some logic here to batch up clicks into a _mlyClicks array - // because the user might click on a lot of markers quickly and nodechanged - // may be called out of order asychronously. - // - // Clicks are added to the array in `selectedImage` and removed here. - // - function nodeChanged(node) { - if (!_mlyFallback) { - _mlyViewer.getComponent('tag').removeAll(); // remove previous detections - } + return -1; + } + /** + * A specialized version of `_.lastIndexOf` which performs strict equality + * comparisons of values, i.e. `===`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ - var clicks = _mlyClicks; - var index = clicks.indexOf(node.key); - var selectedKey = _mlySelectedImageKey; - if (index > -1) { // `nodechanged` initiated from clicking on a marker.. - clicks.splice(index, 1); // remove the click - // If `node.key` matches the current _mlySelectedImageKey, call `selectImage()` - // one more time to update the detections and attribution.. - if (node.key === selectedKey) { - that.selectImage(context, _mlySelectedImageKey, true); - } - } else { // `nodechanged` initiated from the Mapillary viewer controls.. - var loc = node.computedLatLon ? [node.computedLatLon.lon, node.computedLatLon.lat] : [node.latLon.lon, node.latLon.lat]; - context.map().centerEase(loc); - that.selectImage(context, node.key, true); - } - } + function strictLastIndexOf(array, value, fromIndex) { + var index = fromIndex + 1; - function bearingChanged(e) { - dispatch$4.call('bearingChanged', undefined, e); + while (index--) { + if (array[index] === value) { + return index; } - }, - + } - // Pass in the image key string as `imageKey`. - // This allows images to be selected from places that dont have access - // to the full image datum (like the street signs layer or the js viewer) - selectImage: function(context, imageKey, fromViewer) { + return index; + } + /** + * Gets the number of symbols in `string`. + * + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the string size. + */ - _mlySelectedImageKey = imageKey; - // Note the datum could be missing, but we'll try to carry on anyway. - // There just might be a delay before user sees detections, captured_at, etc. - var d = _mlyCache.images.forImageKey[imageKey]; + function stringSize(string) { + return hasUnicode(string) ? unicodeSize(string) : asciiSize(string); + } + /** + * Converts `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ - var viewer = context.container().select('.photoviewer'); - if (!viewer.empty()) { viewer.datum(d); } - imageKey = (d && d.key) || imageKey; - if (!fromViewer && imageKey) { - _mlyClicks.push(imageKey); - } + function stringToArray(string) { + return hasUnicode(string) ? unicodeToArray(string) : asciiToArray(string); + } + /** + * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace + * character of `string`. + * + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the index of the last non-whitespace character. + */ - this.setStyles(context, null, true); - // if signs signs are shown, highlight the ones that appear in this image - context.container().selectAll('.layer-mapillary-signs .icon-detected') - .classed('currentView', function(d) { - return d.detections.some(function(detection) { - return detection.image_key === imageKey; - }); - }); + function trimmedEndIndex(string) { + var index = string.length; - if (d) { - this.updateDetections(d); - } + while (index-- && reWhitespace.test(string.charAt(index))) {} - return this; - }, + return index; + } + /** + * Used by `_.unescape` to convert HTML entities to characters. + * + * @private + * @param {string} chr The matched character to unescape. + * @returns {string} Returns the unescaped character. + */ - getSelectedImageKey: function() { - return _mlySelectedImageKey; - }, + var unescapeHtmlChar = basePropertyOf(htmlUnescapes); + /** + * Gets the size of a Unicode `string`. + * + * @private + * @param {string} string The string inspect. + * @returns {number} Returns the string size. + */ + function unicodeSize(string) { + var result = reUnicode.lastIndex = 0; - getSequenceKeyForImageKey: function(imageKey) { - return _mlyCache.sequences.forImageKey[imageKey]; - }, + while (reUnicode.test(string)) { + ++result; + } + return result; + } + /** + * Converts a Unicode `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ - // Updates the currently highlighted sequence and selected bubble. - // Reset is only necessary when interacting with the viewport because - // this implicitly changes the currently selected bubble/sequence - setStyles: function(context, hovered, reset) { - if (reset) { // reset all layers - context.container().selectAll('.viewfield-group') - .classed('highlighted', false) - .classed('hovered', false) - .classed('currentView', false); - context.container().selectAll('.sequence') - .classed('highlighted', false) - .classed('currentView', false); - } + function unicodeToArray(string) { + return string.match(reUnicode) || []; + } + /** + * Splits a Unicode `string` into an array of its words. + * + * @private + * @param {string} The string to inspect. + * @returns {Array} Returns the words of `string`. + */ - var hoveredImageKey = hovered && hovered.key; - var hoveredSequenceKey = hoveredImageKey && this.getSequenceKeyForImageKey(hoveredImageKey); - var hoveredLineString = hoveredSequenceKey && _mlyCache.sequences.lineString[hoveredSequenceKey]; - var hoveredImageKeys = (hoveredLineString && hoveredLineString.properties.coordinateProperties.image_keys) || []; - var selectedImageKey = _mlySelectedImageKey; - var selectedSequenceKey = selectedImageKey && this.getSequenceKeyForImageKey(selectedImageKey); - var selectedLineString = selectedSequenceKey && _mlyCache.sequences.lineString[selectedSequenceKey]; - var selectedImageKeys = (selectedLineString && selectedLineString.properties.coordinateProperties.image_keys) || []; + function unicodeWords(string) { + return string.match(reUnicodeWord) || []; + } + /*--------------------------------------------------------------------------*/ - // highlight sibling viewfields on either the selected or the hovered sequences - var highlightedImageKeys = utilArrayUnion(hoveredImageKeys, selectedImageKeys); + /** + * Create a new pristine `lodash` function using the `context` object. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Util + * @param {Object} [context=root] The context object. + * @returns {Function} Returns a new `lodash` function. + * @example + * + * _.mixin({ 'foo': _.constant('foo') }); + * + * var lodash = _.runInContext(); + * lodash.mixin({ 'bar': lodash.constant('bar') }); + * + * _.isFunction(_.foo); + * // => true + * _.isFunction(_.bar); + * // => false + * + * lodash.isFunction(lodash.foo); + * // => false + * lodash.isFunction(lodash.bar); + * // => true + * + * // Create a suped-up `defer` in Node.js. + * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer; + */ - context.container().selectAll('.layer-mapillary .viewfield-group') - .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; }) - .classed('hovered', function(d) { return d.key === hoveredImageKey; }) - .classed('currentView', function(d) { return d.key === selectedImageKey; }); - context.container().selectAll('.layer-mapillary .sequence') - .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; }) - .classed('currentView', function(d) { return d.properties.key === selectedSequenceKey; }); + var runInContext = function runInContext(context) { + context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps)); + /** Built-in constructor references. */ - // update viewfields if needed - context.container().selectAll('.viewfield-group .viewfield') - .attr('d', viewfieldPath); + var Array = context.Array, + Date = context.Date, + Error = context.Error, + Function = context.Function, + Math = context.Math, + Object = context.Object, + RegExp = context.RegExp, + String = context.String, + TypeError = context.TypeError; + /** Used for built-in method references. */ - function viewfieldPath() { - var d = this.parentNode.__data__; - if (d.pano && d.key !== selectedImageKey) { - return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0'; - } else { - return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z'; - } - } + var arrayProto = Array.prototype, + funcProto = Function.prototype, + objectProto = Object.prototype; + /** Used to detect overreaching core-js shims. */ - return this; - }, + var coreJsData = context['__core-js_shared__']; + /** Used to resolve the decompiled source of functions. */ + var funcToString = funcProto.toString; + /** Used to check objects for own properties. */ - updateDetections: function(d) { - if (!_mlyViewer || _mlyFallback) { return; } + var hasOwnProperty = objectProto.hasOwnProperty; + /** Used to generate unique IDs. */ - var imageKey = d && d.key; - if (!imageKey) { return; } + var idCounter = 0; + /** Used to detect methods masquerading as native. */ - var detections = _mlyCache.image_detections.forImageKey[imageKey] || []; - detections.forEach(function(data) { - var tag = makeTag(data); - if (tag) { - var tagComponent = _mlyViewer.getComponent('tag'); - tagComponent.add([tag]); - } - }); + var maskSrcKey = function () { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? 'Symbol(src)_1.' + uid : ''; + }(); + /** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ - function makeTag(data) { - var valueParts = data.value.split('--'); - if (valueParts.length !== 3) { return; } - - var text = valueParts[1].replace(/-/g, ' '); - var tag; - - // Currently only two shapes - if (data.shape.type === 'Polygon') { - var polygonGeometry = new Mapillary - .TagComponent - .PolygonGeometry(data.shape.coordinates[0]); - - tag = new Mapillary.TagComponent.OutlineTag( - data.key, - polygonGeometry, - { - text: text, - textColor: 0xffff00, - lineColor: 0xffff00, - lineWidth: 2, - fillColor: 0xffff00, - fillOpacity: 0.3, - } - ); - } else if (data.shape.type === 'Point') { - var pointGeometry = new Mapillary - .TagComponent - .PointGeometry(data.shape.coordinates[0]); - - tag = new Mapillary.TagComponent.SpotTag( - data.key, - pointGeometry, - { - text: text, - color: 0xffff00, - textColor: 0xffff00 - } - ); - } + var nativeObjectToString = objectProto.toString; + /** Used to infer the `Object` constructor. */ - return tag; - } - }, + var objectCtorString = funcToString.call(Object); + /** Used to restore the original `_` reference in `_.noConflict`. */ + var oldDash = root._; + /** Used to detect if a method is native. */ - cache: function() { - return _mlyCache; - } + var reIsNative = RegExp('^' + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&').replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'); + /** Built-in value references. */ - }; + var Buffer = moduleExports ? context.Buffer : undefined$1, + _Symbol = context.Symbol, + Uint8Array = context.Uint8Array, + allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined$1, + getPrototype = overArg(Object.getPrototypeOf, Object), + objectCreate = Object.create, + propertyIsEnumerable = objectProto.propertyIsEnumerable, + splice = arrayProto.splice, + spreadableSymbol = _Symbol ? _Symbol.isConcatSpreadable : undefined$1, + symIterator = _Symbol ? _Symbol.iterator : undefined$1, + symToStringTag = _Symbol ? _Symbol.toStringTag : undefined$1; - function validationIssue(attrs) { - this.type = attrs.type; // required - name of rule that created the issue (e.g. 'missing_tag') - this.subtype = attrs.subtype; // optional - category of the issue within the type (e.g. 'relation_type' under 'missing_tag') - this.severity = attrs.severity; // required - 'warning' or 'error' - this.message = attrs.message; // required - function returning localized string - this.reference = attrs.reference; // optional - function(selection) to render reference information - this.entityIds = attrs.entityIds; // optional - array of IDs of entities involved in the issue - this.loc = attrs.loc; // optional - [lon, lat] to zoom in on to see the issue - this.data = attrs.data; // optional - object containing extra data for the fixes - this.dynamicFixes = attrs.dynamicFixes;// optional - function(context) returning fixes - this.hash = attrs.hash; // optional - string to further differentiate the issue + var defineProperty = function () { + try { + var func = getNative(Object, 'defineProperty'); + func({}, '', {}); + return func; + } catch (e) {} + }(); + /** Mocked built-ins. */ + + + var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout, + ctxNow = Date && Date.now !== root.Date.now && Date.now, + ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout; + /* Built-in method references for those with the same name as other `lodash` methods. */ + + var nativeCeil = Math.ceil, + nativeFloor = Math.floor, + nativeGetSymbols = Object.getOwnPropertySymbols, + nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined$1, + nativeIsFinite = context.isFinite, + nativeJoin = arrayProto.join, + nativeKeys = overArg(Object.keys, Object), + nativeMax = Math.max, + nativeMin = Math.min, + nativeNow = Date.now, + nativeParseInt = context.parseInt, + nativeRandom = Math.random, + nativeReverse = arrayProto.reverse; + /* Built-in method references that are verified to be native. */ + + var DataView = getNative(context, 'DataView'), + Map = getNative(context, 'Map'), + Promise = getNative(context, 'Promise'), + Set = getNative(context, 'Set'), + WeakMap = getNative(context, 'WeakMap'), + nativeCreate = getNative(Object, 'create'); + /** Used to store function metadata. */ + + var metaMap = WeakMap && new WeakMap(); + /** Used to lookup unminified function names. */ + + var realNames = {}; + /** Used to detect maps, sets, and weakmaps. */ + + var dataViewCtorString = toSource(DataView), + mapCtorString = toSource(Map), + promiseCtorString = toSource(Promise), + setCtorString = toSource(Set), + weakMapCtorString = toSource(WeakMap); + /** Used to convert symbols to primitives and strings. */ + + var symbolProto = _Symbol ? _Symbol.prototype : undefined$1, + symbolValueOf = symbolProto ? symbolProto.valueOf : undefined$1, + symbolToString = symbolProto ? symbolProto.toString : undefined$1; + /*------------------------------------------------------------------------*/ - this.id = generateID.apply(this); // generated - see below - this.autoFix = null; // generated - if autofix exists, will be set below + /** + * Creates a `lodash` object which wraps `value` to enable implicit method + * chain sequences. Methods that operate on and return arrays, collections, + * and functions can be chained together. Methods that retrieve a single value + * or may return a primitive value will automatically end the chain sequence + * and return the unwrapped value. Otherwise, the value must be unwrapped + * with `_#value`. + * + * Explicit chain sequences, which must be unwrapped with `_#value`, may be + * enabled using `_.chain`. + * + * The execution of chained methods is lazy, that is, it's deferred until + * `_#value` is implicitly or explicitly called. + * + * Lazy evaluation allows several methods to support shortcut fusion. + * Shortcut fusion is an optimization to merge iteratee calls; this avoids + * the creation of intermediate arrays and can greatly reduce the number of + * iteratee executions. Sections of a chain sequence qualify for shortcut + * fusion if the section is applied to an array and iteratees accept only + * one argument. The heuristic for whether a section qualifies for shortcut + * fusion is subject to change. + * + * Chaining is supported in custom builds as long as the `_#value` method is + * directly or indirectly included in the build. + * + * In addition to lodash methods, wrappers have `Array` and `String` methods. + * + * The wrapper `Array` methods are: + * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift` + * + * The wrapper `String` methods are: + * `replace` and `split` + * + * The wrapper methods that support shortcut fusion are: + * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`, + * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`, + * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray` + * + * The chainable wrapper methods are: + * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`, + * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`, + * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`, + * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`, + * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`, + * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`, + * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`, + * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`, + * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`, + * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`, + * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`, + * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`, + * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`, + * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`, + * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`, + * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`, + * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`, + * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`, + * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`, + * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`, + * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`, + * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`, + * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`, + * `zipObject`, `zipObjectDeep`, and `zipWith` + * + * The wrapper methods that are **not** chainable by default are: + * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`, + * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`, + * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`, + * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`, + * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`, + * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`, + * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`, + * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, + * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, + * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, + * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, + * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, + * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`, + * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`, + * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`, + * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`, + * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`, + * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`, + * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`, + * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`, + * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`, + * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`, + * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`, + * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`, + * `upperFirst`, `value`, and `words` + * + * @name _ + * @constructor + * @category Seq + * @param {*} value The value to wrap in a `lodash` instance. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var wrapped = _([1, 2, 3]); + * + * // Returns an unwrapped value. + * wrapped.reduce(_.add); + * // => 6 + * + * // Returns a wrapped value. + * var squares = wrapped.map(square); + * + * _.isArray(squares); + * // => false + * + * _.isArray(squares.value()); + * // => true + */ - // A unique, deterministic string hash. - // Issues with identical id values are considered identical. - function generateID() { - var parts = [this.type]; + function lodash(value) { + if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) { + if (value instanceof LodashWrapper) { + return value; + } - if (this.hash) { // subclasses can pass in their own differentiator - parts.push(this.hash); + if (hasOwnProperty.call(value, '__wrapped__')) { + return wrapperClone(value); + } } - if (this.subtype) { - parts.push(this.subtype); - } + return new LodashWrapper(value); + } + /** + * The base implementation of `_.create` without support for assigning + * properties to the created object. + * + * @private + * @param {Object} proto The object to inherit from. + * @returns {Object} Returns the new object. + */ - // include the entities this issue is for - // (sort them so the id is deterministic) - if (this.entityIds) { - var entityKeys = this.entityIds.slice().sort(); - parts.push.apply(parts, entityKeys); - } - return parts.join(':'); - } + var baseCreate = function () { + function object() {} - this.extent = function(resolver) { - if (this.loc) { - return geoExtent(this.loc); - } - if (this.entityIds && this.entityIds.length) { - return this.entityIds.reduce(function(extent, entityId) { - return extent.extend(resolver.entity(entityId).extent(resolver)); - }, geoExtent()); - } - return null; - }; + return function (proto) { + if (!isObject(proto)) { + return {}; + } - this.fixes = function(context) { - var fixes = this.dynamicFixes ? this.dynamicFixes(context) : []; - var issue = this; + if (objectCreate) { + return objectCreate(proto); + } - if (issue.severity === 'warning') { - // allow ignoring any issue that's not an error - fixes.push(new validationIssueFix({ - title: _t('issues.fix.ignore_issue.title'), - icon: 'iD-icon-close', - onClick: function() { - context.validator().ignoreIssue(this.issue.id); - } - })); - } + object.prototype = proto; + var result = new object(); + object.prototype = undefined$1; + return result; + }; + }(); + /** + * The function whose prototype chain sequence wrappers inherit from. + * + * @private + */ - fixes.forEach(function(fix) { - fix.id = fix.title; - // add a reference to the issue for use in actions - fix.issue = issue; - if (fix.autoArgs) { - issue.autoFix = fix; - } - }); - return fixes; - }; - } + function baseLodash() {// No operation performed. + } + /** + * The base constructor for creating `lodash` wrapper objects. + * + * @private + * @param {*} value The value to wrap. + * @param {boolean} [chainAll] Enable explicit method chain sequences. + */ - function validationIssueFix(attrs) { - this.title = attrs.title; // Required - this.onClick = attrs.onClick; // Optional - the function to run to apply the fix - this.disabledReason = attrs.disabledReason; // Optional - a string explaining why the fix is unavailable, if any - this.icon = attrs.icon; // Optional - shows 'iD-icon-wrench' if not set - this.entityIds = attrs.entityIds || []; // Optional - used for hover-higlighting. - this.autoArgs = attrs.autoArgs; // Optional - pass [actions, annotation] arglist if this fix can automatically run + function LodashWrapper(value, chainAll) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__chain__ = !!chainAll; + this.__index__ = 0; + this.__values__ = undefined$1; + } + /** + * By default, the template delimiters used by lodash are like those in + * embedded Ruby (ERB) as well as ES2015 template strings. Change the + * following template settings to use alternative delimiters. + * + * @static + * @memberOf _ + * @type {Object} + */ - this.issue = null; // Generated link - added by validationIssue - } - var buildRuleChecks = function() { - return { - equals: function (equals) { - return function(tags) { - return Object.keys(equals).every(function(k) { - return equals[k] === tags[k]; - }); - }; - }, - notEquals: function (notEquals) { - return function(tags) { - return Object.keys(notEquals).some(function(k) { - return notEquals[k] !== tags[k]; - }); - }; - }, - absence: function(absence) { - return function(tags) { - return Object.keys(tags).indexOf(absence) === -1; - }; - }, - presence: function(presence) { - return function(tags) { - return Object.keys(tags).indexOf(presence) > -1; - }; - }, - greaterThan: function(greaterThan) { - var key = Object.keys(greaterThan)[0]; - var value = greaterThan[key]; + lodash.templateSettings = { + /** + * Used to detect `data` property values to be HTML-escaped. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'escape': reEscape, + + /** + * Used to detect code to be evaluated. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'evaluate': reEvaluate, + + /** + * Used to detect `data` property values to inject. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'interpolate': reInterpolate, + + /** + * Used to reference the data object in the template text. + * + * @memberOf _.templateSettings + * @type {string} + */ + 'variable': '', + + /** + * Used to import variables into the compiled template. + * + * @memberOf _.templateSettings + * @type {Object} + */ + 'imports': { + /** + * A reference to the `lodash` function. + * + * @memberOf _.templateSettings.imports + * @type {Function} + */ + '_': lodash + } + }; // Ensure wrappers are instances of `baseLodash`. + + lodash.prototype = baseLodash.prototype; + lodash.prototype.constructor = lodash; + LodashWrapper.prototype = baseCreate(baseLodash.prototype); + LodashWrapper.prototype.constructor = LodashWrapper; + /*------------------------------------------------------------------------*/ - return function(tags) { - return tags[key] > value; - }; - }, - greaterThanEqual: function(greaterThanEqual) { - var key = Object.keys(greaterThanEqual)[0]; - var value = greaterThanEqual[key]; + /** + * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation. + * + * @private + * @constructor + * @param {*} value The value to wrap. + */ - return function(tags) { - return tags[key] >= value; - }; - }, - lessThan: function(lessThan) { - var key = Object.keys(lessThan)[0]; - var value = lessThan[key]; + function LazyWrapper(value) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__dir__ = 1; + this.__filtered__ = false; + this.__iteratees__ = []; + this.__takeCount__ = MAX_ARRAY_LENGTH; + this.__views__ = []; + } + /** + * Creates a clone of the lazy wrapper object. + * + * @private + * @name clone + * @memberOf LazyWrapper + * @returns {Object} Returns the cloned `LazyWrapper` object. + */ - return function(tags) { - return tags[key] < value; - }; - }, - lessThanEqual: function(lessThanEqual) { - var key = Object.keys(lessThanEqual)[0]; - var value = lessThanEqual[key]; - return function(tags) { - return tags[key] <= value; - }; - }, - positiveRegex: function(positiveRegex) { - var tagKey = Object.keys(positiveRegex)[0]; - var expression = positiveRegex[tagKey].join('|'); - var regex = new RegExp(expression); + function lazyClone() { + var result = new LazyWrapper(this.__wrapped__); + result.__actions__ = copyArray(this.__actions__); + result.__dir__ = this.__dir__; + result.__filtered__ = this.__filtered__; + result.__iteratees__ = copyArray(this.__iteratees__); + result.__takeCount__ = this.__takeCount__; + result.__views__ = copyArray(this.__views__); + return result; + } + /** + * Reverses the direction of lazy iteration. + * + * @private + * @name reverse + * @memberOf LazyWrapper + * @returns {Object} Returns the new reversed `LazyWrapper` object. + */ - return function(tags) { - return regex.test(tags[tagKey]); - }; - }, - negativeRegex: function(negativeRegex) { - var tagKey = Object.keys(negativeRegex)[0]; - var expression = negativeRegex[tagKey].join('|'); - var regex = new RegExp(expression); - return function(tags) { - return !regex.test(tags[tagKey]); - }; + function lazyReverse() { + if (this.__filtered__) { + var result = new LazyWrapper(this); + result.__dir__ = -1; + result.__filtered__ = true; + } else { + result = this.clone(); + result.__dir__ *= -1; } - }; - }; - var buildLineKeys = function() { - return { - highway: { - rest_area: true, - services: true - }, - railway: { - roundhouse: true, - station: true, - traverser: true, - turntable: true, - wash: true + return result; + } + /** + * Extracts the unwrapped value from its lazy wrapper. + * + * @private + * @name value + * @memberOf LazyWrapper + * @returns {*} Returns the unwrapped value. + */ + + + function lazyValue() { + var array = this.__wrapped__.value(), + dir = this.__dir__, + isArr = isArray(array), + isRight = dir < 0, + arrLength = isArr ? array.length : 0, + view = getView(0, arrLength, this.__views__), + start = view.start, + end = view.end, + length = end - start, + index = isRight ? end : start - 1, + iteratees = this.__iteratees__, + iterLength = iteratees.length, + resIndex = 0, + takeCount = nativeMin(length, this.__takeCount__); + + if (!isArr || !isRight && arrLength == length && takeCount == length) { + return baseWrapperValue(array, this.__actions__); } - }; - }; - var serviceMapRules = { - init: function() { - this._ruleChecks = buildRuleChecks(); - this._validationRules = []; - this._areaKeys = osmAreaKeys; - this._lineKeys = buildLineKeys(); - }, + var result = []; - // list of rules only relevant to tag checks... - filterRuleChecks: function(selector) { - var _ruleChecks = this._ruleChecks; - return Object.keys(selector).reduce(function(rules, key) { - if (['geometry', 'error', 'warning'].indexOf(key) === -1) { - rules.push(_ruleChecks[key](selector[key])); + outer: while (length-- && resIndex < takeCount) { + index += dir; + var iterIndex = -1, + value = array[index]; + + while (++iterIndex < iterLength) { + var data = iteratees[iterIndex], + iteratee = data.iteratee, + type = data.type, + computed = iteratee(value); + + if (type == LAZY_MAP_FLAG) { + value = computed; + } else if (!computed) { + if (type == LAZY_FILTER_FLAG) { + continue outer; + } else { + break outer; + } } - return rules; - }, []); - }, - - // builds tagMap from mapcss-parse selector object... - buildTagMap: function(selector) { - var getRegexValues = function(regexes) { - return regexes.map(function(regex) { - return regex.replace(/\$|\^/g, ''); - }); - }; + } - var tagMap = Object.keys(selector).reduce(function (expectedTags, key) { - var values; - var isRegex = /regex/gi.test(key); - var isEqual = /equals/gi.test(key); + result[resIndex++] = value; + } - if (isRegex || isEqual) { - Object.keys(selector[key]).forEach(function(selectorKey) { - values = isEqual ? [selector[key][selectorKey]] : getRegexValues(selector[key][selectorKey]); + return result; + } // Ensure `LazyWrapper` is an instance of `baseLodash`. - if (expectedTags.hasOwnProperty(selectorKey)) { - values = values.concat(expectedTags[selectorKey]); - } - expectedTags[selectorKey] = values; - }); + LazyWrapper.prototype = baseCreate(baseLodash.prototype); + LazyWrapper.prototype.constructor = LazyWrapper; + /*------------------------------------------------------------------------*/ - } else if (/(greater|less)Than(Equal)?|presence/g.test(key)) { - var tagKey = /presence/.test(key) ? selector[key] : Object.keys(selector[key])[0]; + /** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ - values = [selector[key][tagKey]]; + function Hash(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + this.clear(); - if (expectedTags.hasOwnProperty(tagKey)) { - values = values.concat(expectedTags[tagKey]); - } + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + /** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ - expectedTags[tagKey] = values; - } - return expectedTags; - }, {}); + function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; + this.size = 0; + } + /** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ - return tagMap; - }, - // inspired by osmWay#isArea() - inferGeometry: function(tagMap) { - var _lineKeys = this._lineKeys; - var _areaKeys = this._areaKeys; + function hashDelete(key) { + var result = this.has(key) && delete this.__data__[key]; + this.size -= result ? 1 : 0; + return result; + } + /** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ - var keyValueDoesNotImplyArea = function(key) { - return utilArrayIntersection(tagMap[key], Object.keys(_areaKeys[key])).length > 0; - }; - var keyValueImpliesLine = function(key) { - return utilArrayIntersection(tagMap[key], Object.keys(_lineKeys[key])).length > 0; - }; - if (tagMap.hasOwnProperty('area')) { - if (tagMap.area.indexOf('yes') > -1) { - return 'area'; - } - if (tagMap.area.indexOf('no') > -1) { - return 'line'; - } - } + function hashGet(key) { + var data = this.__data__; - for (var key in tagMap) { - if (key in _areaKeys && !keyValueDoesNotImplyArea(key)) { - return 'area'; - } - if (key in _lineKeys && keyValueImpliesLine(key)) { - return 'area'; - } + if (nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined$1 : result; } - return 'line'; - }, + return hasOwnProperty.call(data, key) ? data[key] : undefined$1; + } + /** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ - // adds from mapcss-parse selector check... - addRule: function(selector) { - var rule = { - // checks relevant to mapcss-selector - checks: this.filterRuleChecks(selector), - // true if all conditions for a tag error are true.. - matches: function(entity) { - return this.checks.every(function(check) { - return check(entity.tags); - }); - }, - // borrowed from Way#isArea() - inferredGeometry: this.inferGeometry(this.buildTagMap(selector), this._areaKeys), - geometryMatches: function(entity, graph) { - if (entity.type === 'node' || entity.type === 'relation') { - return selector.geometry === entity.type; - } else if (entity.type === 'way') { - return this.inferredGeometry === entity.geometry(graph); - } - }, - // when geometries match and tag matches are present, return a warning... - findIssues: function (entity, graph, issues) { - if (this.geometryMatches(entity, graph) && this.matches(entity)) { - var severity = Object.keys(selector).indexOf('error') > -1 - ? 'error' - : 'warning'; - var message = selector[severity]; - issues.push(new validationIssue({ - type: 'maprules', - severity: severity, - message: function() { - return message; - }, - entityIds: [entity.id] - })); - } - } - }; - this._validationRules.push(rule); - }, - clearRules: function() { this._validationRules = []; }, + function hashHas(key) { + var data = this.__data__; + return nativeCreate ? data[key] !== undefined$1 : hasOwnProperty.call(data, key); + } + /** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ - // returns validationRules... - validationRules: function() { return this._validationRules; }, - // returns ruleChecks - ruleChecks: function() { return this._ruleChecks; } - }; + function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = nativeCreate && value === undefined$1 ? HASH_UNDEFINED : value; + return this; + } // Add methods to `Hash`. - var apibase$1 = 'https://nominatim.openstreetmap.org/'; - var _inflight = {}; - var _nominatimCache; + Hash.prototype.clear = hashClear; + Hash.prototype['delete'] = hashDelete; + Hash.prototype.get = hashGet; + Hash.prototype.has = hashHas; + Hash.prototype.set = hashSet; + /*------------------------------------------------------------------------*/ - var serviceNominatim = { + /** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ - init: function() { - _inflight = {}; - _nominatimCache = new RBush(); - }, + function ListCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + this.clear(); - reset: function() { - Object.values(_inflight).forEach(function(controller) { controller.abort(); }); - _inflight = {}; - _nominatimCache = new RBush(); - }, + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + /** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ - countryCode: function (location, callback) { - this.reverse(location, function(err, result) { - if (err) { - return callback(err); - } else if (result.address) { - return callback(null, result.address.country_code); - } else { - return callback('Unable to geocode', null); - } - }); - }, + function listCacheClear() { + this.__data__ = []; + this.size = 0; + } + /** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ - reverse: function (loc, callback) { - var cached = _nominatimCache.search( - { minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1] } - ); + function listCacheDelete(key) { + var data = this.__data__, + index = assocIndexOf(data, key); - if (cached.length > 0) { - if (callback) { callback(null, cached[0].data); } - return; + if (index < 0) { + return false; } - var params = { zoom: 13, format: 'json', addressdetails: 1, lat: loc[1], lon: loc[0] }; - var url = apibase$1 + 'reverse?' + utilQsString(params); + var lastIndex = data.length - 1; - if (_inflight[url]) { return; } - var controller = new AbortController(); - _inflight[url] = controller; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } - d3_json(url, { signal: controller.signal }) - .then(function(result) { - delete _inflight[url]; - if (result && result.error) { - throw new Error(result.error); - } - var extent = geoExtent(loc).padByMeters(200); - _nominatimCache.insert(Object.assign(extent.bbox(), {data: result})); - if (callback) { callback(null, result); } - }) - .catch(function(err) { - delete _inflight[url]; - if (err.name === 'AbortError') { return; } - if (callback) { callback(err.message); } - }); - }, + --this.size; + return true; + } + /** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ - search: function (val, callback) { - var searchVal = encodeURIComponent(val); - var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json'; + function listCacheGet(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + return index < 0 ? undefined$1 : data[index][1]; + } + /** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ - if (_inflight[url]) { return; } - var controller = new AbortController(); - _inflight[url] = controller; - d3_json(url, { signal: controller.signal }) - .then(function(result) { - delete _inflight[url]; - if (result && result.error) { - throw new Error(result.error); - } - if (callback) { callback(null, result); } - }) - .catch(function(err) { - delete _inflight[url]; - if (err.name === 'AbortError') { return; } - if (callback) { callback(err.message); } - }); - } + function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; + } + /** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ - }; - var apibase$2 = 'https://openstreetcam.org'; - var maxResults$1 = 1000; - var tileZoom$1 = 14; - var tiler$4 = utilTiler().zoomExtent([tileZoom$1, tileZoom$1]).skipNullIsland(true); - var dispatch$5 = dispatch('loadedImages'); - var imgZoom = d3_zoom() - .extent([[0, 0], [320, 240]]) - .translateExtent([[0, 0], [320, 240]]) - .scaleExtent([1, 15]); - var _oscCache; - var _oscSelectedImage; + function listCacheSet(key, value) { + var data = this.__data__, + index = assocIndexOf(data, key); + if (index < 0) { + ++this.size; + data.push([key, value]); + } else { + data[index][1] = value; + } - function abortRequest$4(controller) { - controller.abort(); - } + return this; + } // Add methods to `ListCache`. - function maxPageAtZoom$1(z) { - if (z < 15) { return 2; } - if (z === 15) { return 5; } - if (z === 16) { return 10; } - if (z === 17) { return 20; } - if (z === 18) { return 40; } - if (z > 18) { return 80; } - } + ListCache.prototype.clear = listCacheClear; + ListCache.prototype['delete'] = listCacheDelete; + ListCache.prototype.get = listCacheGet; + ListCache.prototype.has = listCacheHas; + ListCache.prototype.set = listCacheSet; + /*------------------------------------------------------------------------*/ + /** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ - function loadTiles$1(which, url, projection) { - var currZoom = Math.floor(geoScaleToZoom(projection.scale())); - var tiles = tiler$4.getTiles(projection); + function MapCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + this.clear(); - // abort inflight requests that are no longer needed - var cache = _oscCache[which]; - Object.keys(cache.inflight).forEach(function(k) { - var wanted = tiles.find(function(tile) { return k.indexOf(tile.id + ',') === 0; }); - if (!wanted) { - abortRequest$4(cache.inflight[k]); - delete cache.inflight[k]; + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); } - }); - - tiles.forEach(function(tile) { - loadNextTilePage$1(which, currZoom, url, tile); - }); - } + } + /** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ - function loadNextTilePage$1(which, currZoom, url, tile) { - var cache = _oscCache[which]; - var bbox = tile.extent.bbox(); - var maxPages = maxPageAtZoom$1(currZoom); - var nextPage = cache.nextPage[tile.id] || 1; - var params = utilQsString({ - ipp: maxResults$1, - page: nextPage, - // client_id: clientId, - bbTopLeft: [bbox.maxY, bbox.minX].join(','), - bbBottomRight: [bbox.minY, bbox.maxX].join(',') - }, true); + function mapCacheClear() { + this.size = 0; + this.__data__ = { + 'hash': new Hash(), + 'map': new (Map || ListCache)(), + 'string': new Hash() + }; + } + /** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ - if (nextPage > maxPages) { return; } - var id = tile.id + ',' + String(nextPage); - if (cache.loaded[id] || cache.inflight[id]) { return; } + function mapCacheDelete(key) { + var result = getMapData(this, key)['delete'](key); + this.size -= result ? 1 : 0; + return result; + } + /** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ - var controller = new AbortController(); - cache.inflight[id] = controller; - var options = { - method: 'POST', - signal: controller.signal, - body: params, - headers: { 'Content-Type': 'application/x-www-form-urlencoded' } - }; + function mapCacheGet(key) { + return getMapData(this, key).get(key); + } + /** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ - d3_json(url, options) - .then(function(data) { - cache.loaded[id] = true; - delete cache.inflight[id]; - if (!data || !data.currentPageItems || !data.currentPageItems.length) { - throw new Error('No Data'); - } - var features = data.currentPageItems.map(function(item) { - var loc = [+item.lng, +item.lat]; - var d; - - if (which === 'images') { - d = { - loc: loc, - key: item.id, - ca: +item.heading, - captured_at: (item.shot_date || item.date_added), - captured_by: item.username, - imagePath: item.lth_name, - sequence_id: item.sequence_id, - sequence_index: +item.sequence_index - }; - - // cache sequence info - var seq = _oscCache.sequences[d.sequence_id]; - if (!seq) { - seq = { rotation: 0, images: [] }; - _oscCache.sequences[d.sequence_id] = seq; - } - seq.images[d.sequence_index] = d; - } + function mapCacheHas(key) { + return getMapData(this, key).has(key); + } + /** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ - return { - minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d - }; - }); - cache.rtree.load(features); + function mapCacheSet(key, value) { + var data = getMapData(this, key), + size = data.size; + data.set(key, value); + this.size += data.size == size ? 0 : 1; + return this; + } // Add methods to `MapCache`. - if (data.currentPageItems.length === maxResults$1) { // more pages to load - cache.nextPage[tile.id] = nextPage + 1; - loadNextTilePage$1(which, currZoom, url, tile); - } else { - cache.nextPage[tile.id] = Infinity; // no more pages to load - } - if (which === 'images') { - dispatch$5.call('loadedImages'); - } - }) - .catch(function() { - cache.loaded[id] = true; - delete cache.inflight[id]; - }); - } + MapCache.prototype.clear = mapCacheClear; + MapCache.prototype['delete'] = mapCacheDelete; + MapCache.prototype.get = mapCacheGet; + MapCache.prototype.has = mapCacheHas; + MapCache.prototype.set = mapCacheSet; + /*------------------------------------------------------------------------*/ + /** + * + * Creates an array cache object to store unique values. + * + * @private + * @constructor + * @param {Array} [values] The values to cache. + */ - // partition viewport into higher zoom tiles - function partitionViewport$1(projection) { - var z = geoScaleToZoom(projection.scale()); - var z2 = (Math.ceil(z * 2) / 2) + 2.5; // round to next 0.5 and add 2.5 - var tiler = utilTiler().zoomExtent([z2, z2]); + function SetCache(values) { + var index = -1, + length = values == null ? 0 : values.length; + this.__data__ = new MapCache(); - return tiler.getTiles(projection) - .map(function(tile) { return tile.extent; }); - } + while (++index < length) { + this.add(values[index]); + } + } + /** + * Adds `value` to the array cache. + * + * @private + * @name add + * @memberOf SetCache + * @alias push + * @param {*} value The value to cache. + * @returns {Object} Returns the cache instance. + */ - // no more than `limit` results per partition. - function searchLimited$1(limit, projection, rtree) { - limit = limit || 5; + function setCacheAdd(value) { + this.__data__.set(value, HASH_UNDEFINED); - return partitionViewport$1(projection) - .reduce(function(result, extent) { - var found = rtree.search(extent.bbox()) - .slice(0, limit) - .map(function(d) { return d.data; }); + return this; + } + /** + * Checks if `value` is in the array cache. + * + * @private + * @name has + * @memberOf SetCache + * @param {*} value The value to search for. + * @returns {number} Returns `true` if `value` is found, else `false`. + */ - return (found.length ? result.concat(found) : result); - }, []); - } + function setCacheHas(value) { + return this.__data__.has(value); + } // Add methods to `SetCache`. - var serviceOpenstreetcam = { - init: function() { - if (!_oscCache) { - this.reset(); - } + SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; + SetCache.prototype.has = setCacheHas; + /*------------------------------------------------------------------------*/ - this.event = utilRebind(this, dispatch$5, 'on'); - }, + /** + * Creates a stack cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ - reset: function() { - if (_oscCache) { - Object.values(_oscCache.images.inflight).forEach(abortRequest$4); - } + function Stack(entries) { + var data = this.__data__ = new ListCache(entries); + this.size = data.size; + } + /** + * Removes all key-value entries from the stack. + * + * @private + * @name clear + * @memberOf Stack + */ - _oscCache = { - images: { inflight: {}, loaded: {}, nextPage: {}, rtree: new RBush() }, - sequences: {} - }; - _oscSelectedImage = null; - }, + function stackClear() { + this.__data__ = new ListCache(); + this.size = 0; + } + /** + * Removes `key` and its value from the stack. + * + * @private + * @name delete + * @memberOf Stack + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ - images: function(projection) { - var limit = 5; - return searchLimited$1(limit, projection, _oscCache.images.rtree); - }, + function stackDelete(key) { + var data = this.__data__, + result = data['delete'](key); + this.size = data.size; + return result; + } + /** + * Gets the stack value for `key`. + * + * @private + * @name get + * @memberOf Stack + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ - sequences: function(projection) { - var viewport = projection.clipExtent(); - var min = [viewport[0][0], viewport[1][1]]; - var max = [viewport[1][0], viewport[0][1]]; - var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox(); - var sequenceKeys = {}; - - // all sequences for images in viewport - _oscCache.images.rtree.search(bbox) - .forEach(function(d) { sequenceKeys[d.data.sequence_id] = true; }); - - // make linestrings from those sequences - var lineStrings = []; - Object.keys(sequenceKeys) - .forEach(function(sequenceKey) { - var seq = _oscCache.sequences[sequenceKey]; - var images = seq && seq.images; - if (images) { - lineStrings.push({ - type: 'LineString', - coordinates: images.map(function (d) { return d.loc; }).filter(Boolean), - properties: { key: sequenceKey } - }); - } - }); - return lineStrings; - }, + function stackGet(key) { + return this.__data__.get(key); + } + /** + * Checks if a stack value for `key` exists. + * + * @private + * @name has + * @memberOf Stack + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ - loadImages: function(projection) { - var url = apibase$2 + '/1.0/list/nearby-photos/'; - loadTiles$1('images', url, projection); - }, + function stackHas(key) { + return this.__data__.has(key); + } + /** + * Sets the stack `key` to `value`. + * + * @private + * @name set + * @memberOf Stack + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the stack cache instance. + */ - loadViewer: function(context) { - var that = this; + function stackSet(key, value) { + var data = this.__data__; - // add osc-wrapper - var wrap = context.container().select('.photoviewer').selectAll('.osc-wrapper') - .data([0]); + if (data instanceof ListCache) { + var pairs = data.__data__; - var wrapEnter = wrap.enter() - .append('div') - .attr('class', 'photo-wrapper osc-wrapper') - .classed('hide', true) - .call(imgZoom.on('zoom', zoomPan)) - .on('dblclick.zoom', null); + if (!Map || pairs.length < LARGE_ARRAY_SIZE - 1) { + pairs.push([key, value]); + this.size = ++data.size; + return this; + } - wrapEnter - .append('div') - .attr('class', 'photo-attribution fillD'); + data = this.__data__ = new MapCache(pairs); + } - var controlsEnter = wrapEnter - .append('div') - .attr('class', 'photo-controls-wrap') - .append('div') - .attr('class', 'photo-controls'); + data.set(key, value); + this.size = data.size; + return this; + } // Add methods to `Stack`. - controlsEnter - .append('button') - .on('click.back', step(-1)) - .text('◄'); - controlsEnter - .append('button') - .on('click.rotate-ccw', rotate(-90)) - .text('⤿'); + Stack.prototype.clear = stackClear; + Stack.prototype['delete'] = stackDelete; + Stack.prototype.get = stackGet; + Stack.prototype.has = stackHas; + Stack.prototype.set = stackSet; + /*------------------------------------------------------------------------*/ - controlsEnter - .append('button') - .on('click.rotate-cw', rotate(90)) - .text('⤾'); + /** + * Creates an array of the enumerable property names of the array-like `value`. + * + * @private + * @param {*} value The value to query. + * @param {boolean} inherited Specify returning inherited property names. + * @returns {Array} Returns the array of property names. + */ - controlsEnter - .append('button') - .on('click.forward', step(1)) - .text('►'); + function arrayLikeKeys(value, inherited) { + var isArr = isArray(value), + isArg = !isArr && isArguments(value), + isBuff = !isArr && !isArg && isBuffer(value), + isType = !isArr && !isArg && !isBuff && isTypedArray(value), + skipIndexes = isArr || isArg || isBuff || isType, + result = skipIndexes ? baseTimes(value.length, String) : [], + length = result.length; + + for (var key in value) { + if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && ( // Safari 9 has enumerable `arguments.length` in strict mode. + key == 'length' || // Node.js 0.10 has enumerable non-index properties on buffers. + isBuff && (key == 'offset' || key == 'parent') || // PhantomJS 2 has enumerable non-index properties on typed arrays. + isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset') || // Skip index properties. + isIndex(key, length)))) { + result.push(key); + } + } - wrapEnter - .append('div') - .attr('class', 'osc-image-wrap'); + return result; + } + /** + * A specialized version of `_.sample` for arrays. + * + * @private + * @param {Array} array The array to sample. + * @returns {*} Returns the random element. + */ - // Register viewer resize handler - context.ui().photoviewer.on('resize.openstreetcam', function(dimensions) { - imgZoom = d3_zoom() - .extent([[0, 0], dimensions]) - .translateExtent([[0, 0], dimensions]) - .scaleExtent([1, 15]) - .on('zoom', zoomPan); - }); + function arraySample(array) { + var length = array.length; + return length ? array[baseRandom(0, length - 1)] : undefined$1; + } + /** + * A specialized version of `_.sampleSize` for arrays. + * + * @private + * @param {Array} array The array to sample. + * @param {number} n The number of elements to sample. + * @returns {Array} Returns the random elements. + */ - function zoomPan() { - var t = event.transform; - context.container().select('.photoviewer .osc-image-wrap') - .call(utilSetTransform, t.x, t.y, t.k); - } + function arraySampleSize(array, n) { + return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length)); + } + /** + * A specialized version of `_.shuffle` for arrays. + * + * @private + * @param {Array} array The array to shuffle. + * @returns {Array} Returns the new shuffled array. + */ - function rotate(deg) { - return function() { - if (!_oscSelectedImage) { return; } - var sequenceKey = _oscSelectedImage.sequence_id; - var sequence = _oscCache.sequences[sequenceKey]; - if (!sequence) { return; } + function arrayShuffle(array) { + return shuffleSelf(copyArray(array)); + } + /** + * This function is like `assignValue` except that it doesn't assign + * `undefined` values. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ - var r = sequence.rotation || 0; - r += deg; - if (r > 180) { r -= 360; } - if (r < -180) { r += 360; } - sequence.rotation = r; + function assignMergeValue(object, key, value) { + if (value !== undefined$1 && !eq(object[key], value) || value === undefined$1 && !(key in object)) { + baseAssignValue(object, key, value); + } + } + /** + * Assigns `value` to `key` of `object` if the existing value is not equivalent + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ - var wrap = context.container().select('.photoviewer .osc-wrapper'); - wrap - .transition() - .duration(100) - .call(imgZoom.transform, identity$2); + function assignValue(object, key, value) { + var objValue = object[key]; - wrap.selectAll('.osc-image') - .transition() - .duration(100) - .style('transform', 'rotate(' + r + 'deg)'); - }; + if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || value === undefined$1 && !(key in object)) { + baseAssignValue(object, key, value); } + } + /** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ - function step(stepBy) { - return function() { - if (!_oscSelectedImage) { return; } - var sequenceKey = _oscSelectedImage.sequence_id; - var sequence = _oscCache.sequences[sequenceKey]; - if (!sequence) { return; } - - var nextIndex = _oscSelectedImage.sequence_index + stepBy; - var nextImage = sequence.images[nextIndex]; - if (!nextImage) { return; } - context.map().centerEase(nextImage.loc); + function assocIndexOf(array, key) { + var length = array.length; - that - .selectImage(context, nextImage) - .updateViewer(context, nextImage); - }; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } } - }, + return -1; + } + /** + * Aggregates elements of `collection` on `accumulator` with keys transformed + * by `iteratee` and values set by `setter`. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform keys. + * @param {Object} accumulator The initial aggregated object. + * @returns {Function} Returns `accumulator`. + */ - showViewer: function(context) { - var viewer = context.container().select('.photoviewer') - .classed('hide', false); - - var isHidden = viewer.selectAll('.photo-wrapper.osc-wrapper.hide').size(); - if (isHidden) { - viewer - .selectAll('.photo-wrapper:not(.osc-wrapper)') - .classed('hide', true); + function baseAggregator(collection, setter, iteratee, accumulator) { + baseEach(collection, function (value, key, collection) { + setter(accumulator, value, iteratee(value), collection); + }); + return accumulator; + } + /** + * The base implementation of `_.assign` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ - viewer - .selectAll('.photo-wrapper.osc-wrapper') - .classed('hide', false); - } - return this; - }, + function baseAssign(object, source) { + return object && copyObject(source, keys(source), object); + } + /** + * The base implementation of `_.assignIn` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ - hideViewer: function(context) { - _oscSelectedImage = null; + function baseAssignIn(object, source) { + return object && copyObject(source, keysIn(source), object); + } + /** + * The base implementation of `assignValue` and `assignMergeValue` without + * value checks. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ - var viewer = context.container().select('.photoviewer'); - if (!viewer.empty()) { viewer.datum(null); } - viewer - .classed('hide', true) - .selectAll('.photo-wrapper') - .classed('hide', true); + function baseAssignValue(object, key, value) { + if (key == '__proto__' && defineProperty) { + defineProperty(object, key, { + 'configurable': true, + 'enumerable': true, + 'value': value, + 'writable': true + }); + } else { + object[key] = value; + } + } + /** + * The base implementation of `_.at` without support for individual paths. + * + * @private + * @param {Object} object The object to iterate over. + * @param {string[]} paths The property paths to pick. + * @returns {Array} Returns the picked elements. + */ - context.container().selectAll('.viewfield-group, .sequence, .icon-sign') - .classed('currentView', false); - return this.setStyles(context, null, true); - }, + function baseAt(object, paths) { + var index = -1, + length = paths.length, + result = Array(length), + skip = object == null; + while (++index < length) { + result[index] = skip ? undefined$1 : get(object, paths[index]); + } - updateViewer: function(context, d) { - var wrap = context.container().select('.photoviewer .osc-wrapper'); - var imageWrap = wrap.selectAll('.osc-image-wrap'); - var attribution = wrap.selectAll('.photo-attribution').html(''); - - wrap - .transition() - .duration(100) - .call(imgZoom.transform, identity$2); - - imageWrap - .selectAll('.osc-image') - .remove(); - - if (d) { - var sequence = _oscCache.sequences[d.sequence_id]; - var r = (sequence && sequence.rotation) || 0; - - imageWrap - .append('img') - .attr('class', 'osc-image') - .attr('src', apibase$2 + '/' + d.imagePath) - .style('transform', 'rotate(' + r + 'deg)'); - - if (d.captured_by) { - attribution - .append('a') - .attr('class', 'captured_by') - .attr('target', '_blank') - .attr('href', 'https://openstreetcam.org/user/' + encodeURIComponent(d.captured_by)) - .text('@' + d.captured_by); - - attribution - .append('span') - .text('|'); - } + return result; + } + /** + * The base implementation of `_.clamp` which doesn't coerce arguments. + * + * @private + * @param {number} number The number to clamp. + * @param {number} [lower] The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the clamped number. + */ - if (d.captured_at) { - attribution - .append('span') - .attr('class', 'captured_at') - .text(localeDateString(d.captured_at)); - attribution - .append('span') - .text('|'); - } + function baseClamp(number, lower, upper) { + if (number === number) { + if (upper !== undefined$1) { + number = number <= upper ? number : upper; + } - attribution - .append('a') - .attr('class', 'image-link') - .attr('target', '_blank') - .attr('href', 'https://openstreetcam.org/details/' + d.sequence_id + '/' + d.sequence_index) - .text('openstreetcam.org'); + if (lower !== undefined$1) { + number = number >= lower ? number : lower; + } } - return this; + return number; + } + /** + * The base implementation of `_.clone` and `_.cloneDeep` which tracks + * traversed objects. + * + * @private + * @param {*} value The value to clone. + * @param {boolean} bitmask The bitmask flags. + * 1 - Deep clone + * 2 - Flatten inherited properties + * 4 - Clone symbols + * @param {Function} [customizer] The function to customize cloning. + * @param {string} [key] The key of `value`. + * @param {Object} [object] The parent object of `value`. + * @param {Object} [stack] Tracks traversed objects and their clone counterparts. + * @returns {*} Returns the cloned value. + */ + + function baseClone(value, bitmask, customizer, key, object, stack) { + var result, + isDeep = bitmask & CLONE_DEEP_FLAG, + isFlat = bitmask & CLONE_FLAT_FLAG, + isFull = bitmask & CLONE_SYMBOLS_FLAG; - function localeDateString(s) { - if (!s) { return null; } - var options = { day: 'numeric', month: 'short', year: 'numeric' }; - var d = new Date(s); - if (isNaN(d.getTime())) { return null; } - return d.toLocaleDateString(_mainLocalizer.localeCode(), options); + if (customizer) { + result = object ? customizer(value, key, object, stack) : customizer(value); } - }, + if (result !== undefined$1) { + return result; + } - selectImage: function(context, d) { - _oscSelectedImage = d; - var viewer = context.container().select('.photoviewer'); - if (!viewer.empty()) { viewer.datum(d); } + if (!isObject(value)) { + return value; + } - this.setStyles(context, null, true); + var isArr = isArray(value); - context.container().selectAll('.icon-sign') - .classed('currentView', false); + if (isArr) { + result = initCloneArray(value); - return this; - }, + if (!isDeep) { + return copyArray(value, result); + } + } else { + var tag = getTag(value), + isFunc = tag == funcTag || tag == genTag; + if (isBuffer(value)) { + return cloneBuffer(value, isDeep); + } - getSelectedImage: function() { - return _oscSelectedImage; - }, + if (tag == objectTag || tag == argsTag || isFunc && !object) { + result = isFlat || isFunc ? {} : initCloneObject(value); + if (!isDeep) { + return isFlat ? copySymbolsIn(value, baseAssignIn(result, value)) : copySymbols(value, baseAssign(result, value)); + } + } else { + if (!cloneableTags[tag]) { + return object ? value : {}; + } - getSequenceKeyForImage: function(d) { - return d && d.sequence_id; - }, + result = initCloneByTag(value, tag, isDeep); + } + } // Check for circular references and return its corresponding clone. - // Updates the currently highlighted sequence and selected bubble. - // Reset is only necessary when interacting with the viewport because - // this implicitly changes the currently selected bubble/sequence - setStyles: function(context, hovered, reset) { - if (reset) { // reset all layers - context.container().selectAll('.viewfield-group') - .classed('highlighted', false) - .classed('hovered', false) - .classed('currentView', false); + stack || (stack = new Stack()); + var stacked = stack.get(value); - context.container().selectAll('.sequence') - .classed('highlighted', false) - .classed('currentView', false); + if (stacked) { + return stacked; } - var hoveredImageKey = hovered && hovered.key; - var hoveredSequenceKey = this.getSequenceKeyForImage(hovered); - var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey]; - var hoveredImageKeys = (hoveredSequence && hoveredSequence.images.map(function (d) { return d.key; })) || []; + stack.set(value, result); - var viewer = context.container().select('.photoviewer'); - var selected = viewer.empty() ? undefined : viewer.datum(); - var selectedImageKey = selected && selected.key; - var selectedSequenceKey = this.getSequenceKeyForImage(selected); - var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey]; - var selectedImageKeys = (selectedSequence && selectedSequence.images.map(function (d) { return d.key; })) || []; - - // highlight sibling viewfields on either the selected or the hovered sequences - var highlightedImageKeys = utilArrayUnion(hoveredImageKeys, selectedImageKeys); - - context.container().selectAll('.layer-openstreetcam .viewfield-group') - .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; }) - .classed('hovered', function(d) { return d.key === hoveredImageKey; }) - .classed('currentView', function(d) { return d.key === selectedImageKey; }); - - context.container().selectAll('.layer-openstreetcam .sequence') - .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; }) - .classed('currentView', function(d) { return d.properties.key === selectedSequenceKey; }); - - // update viewfields if needed - context.container().selectAll('.viewfield-group .viewfield') - .attr('d', viewfieldPath); - - function viewfieldPath() { - var d = this.parentNode.__data__; - if (d.pano && d.key !== selectedImageKey) { - return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0'; - } else { - return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z'; - } + if (isSet(value)) { + value.forEach(function (subValue) { + result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack)); + }); + } else if (isMap(value)) { + value.forEach(function (subValue, key) { + result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack)); + }); } - return this; - }, + var keysFunc = isFull ? isFlat ? getAllKeysIn : getAllKeys : isFlat ? keysIn : keys; + var props = isArr ? undefined$1 : keysFunc(value); + arrayEach(props || value, function (subValue, key) { + if (props) { + key = subValue; + subValue = value[key]; + } // Recursively populate clone (susceptible to call stack limits). - cache: function() { - return _oscCache; - } + assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); + }); + return result; + } + /** + * The base implementation of `_.conforms` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property predicates to conform to. + * @returns {Function} Returns the new spec function. + */ - }; - /** - * Checks if `value` is the - * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) - * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an object, else `false`. - * @example - * - * _.isObject({}); - * // => true - * - * _.isObject([1, 2, 3]); - * // => true - * - * _.isObject(_.noop); - * // => true - * - * _.isObject(null); - * // => false - */ - function isObject$1(value) { - var type = typeof value; - return value != null && (type == 'object' || type == 'function'); - } + function baseConforms(source) { + var props = keys(source); + return function (object) { + return baseConformsTo(object, source, props); + }; + } + /** + * The base implementation of `_.conformsTo` which accepts `props` to check. + * + * @private + * @param {Object} object The object to inspect. + * @param {Object} source The object of property predicates to conform to. + * @returns {boolean} Returns `true` if `object` conforms, else `false`. + */ - /** Detect free variable `global` from Node.js. */ - var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; - /** Detect free variable `self`. */ - var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + function baseConformsTo(object, source, props) { + var length = props.length; - /** Used as a reference to the global object. */ - var root$2 = freeGlobal || freeSelf || Function('return this')(); + if (object == null) { + return !length; + } - /** - * Gets the timestamp of the number of milliseconds that have elapsed since - * the Unix epoch (1 January 1970 00:00:00 UTC). - * - * @static - * @memberOf _ - * @since 2.4.0 - * @category Date - * @returns {number} Returns the timestamp. - * @example - * - * _.defer(function(stamp) { - * console.log(_.now() - stamp); - * }, _.now()); - * // => Logs the number of milliseconds it took for the deferred invocation. - */ - var now$1 = function() { - return root$2.Date.now(); - }; + object = Object(object); - /** Built-in value references. */ - var Symbol$1 = root$2.Symbol; + while (length--) { + var key = props[length], + predicate = source[key], + value = object[key]; - /** Used for built-in method references. */ - var objectProto = Object.prototype; + if (value === undefined$1 && !(key in object) || !predicate(value)) { + return false; + } + } - /** Used to check objects for own properties. */ - var hasOwnProperty$2 = objectProto.hasOwnProperty; + return true; + } + /** + * The base implementation of `_.delay` and `_.defer` which accepts `args` + * to provide to `func`. + * + * @private + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {Array} args The arguments to provide to `func`. + * @returns {number|Object} Returns the timer id or timeout object. + */ - /** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) - * of values. - */ - var nativeObjectToString = objectProto.toString; - /** Built-in value references. */ - var symToStringTag = Symbol$1 ? Symbol$1.toStringTag : undefined; + function baseDelay(func, wait, args) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } - /** - * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. - * - * @private - * @param {*} value The value to query. - * @returns {string} Returns the raw `toStringTag`. - */ - function getRawTag(value) { - var isOwn = hasOwnProperty$2.call(value, symToStringTag), - tag = value[symToStringTag]; + return setTimeout(function () { + func.apply(undefined$1, args); + }, wait); + } + /** + * The base implementation of methods like `_.difference` without support + * for excluding multiple arrays or iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Array} values The values to exclude. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + */ - try { - value[symToStringTag] = undefined; - var unmasked = true; - } catch (e) {} - var result = nativeObjectToString.call(value); - if (unmasked) { - if (isOwn) { - value[symToStringTag] = tag; - } else { - delete value[symToStringTag]; - } - } - return result; - } + function baseDifference(array, values, iteratee, comparator) { + var index = -1, + includes = arrayIncludes, + isCommon = true, + length = array.length, + result = [], + valuesLength = values.length; - /** Used for built-in method references. */ - var objectProto$1 = Object.prototype; + if (!length) { + return result; + } - /** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) - * of values. - */ - var nativeObjectToString$1 = objectProto$1.toString; + if (iteratee) { + values = arrayMap(values, baseUnary(iteratee)); + } - /** - * Converts `value` to a string using `Object.prototype.toString`. - * - * @private - * @param {*} value The value to convert. - * @returns {string} Returns the converted string. - */ - function objectToString$2(value) { - return nativeObjectToString$1.call(value); - } + if (comparator) { + includes = arrayIncludesWith; + isCommon = false; + } else if (values.length >= LARGE_ARRAY_SIZE) { + includes = cacheHas; + isCommon = false; + values = new SetCache(values); + } - /** `Object#toString` result references. */ - var nullTag = '[object Null]', - undefinedTag = '[object Undefined]'; + outer: while (++index < length) { + var value = array[index], + computed = iteratee == null ? value : iteratee(value); + value = comparator || value !== 0 ? value : 0; - /** Built-in value references. */ - var symToStringTag$1 = Symbol$1 ? Symbol$1.toStringTag : undefined; + if (isCommon && computed === computed) { + var valuesIndex = valuesLength; - /** - * The base implementation of `getTag` without fallbacks for buggy environments. - * - * @private - * @param {*} value The value to query. - * @returns {string} Returns the `toStringTag`. - */ - function baseGetTag(value) { - if (value == null) { - return value === undefined ? undefinedTag : nullTag; - } - return (symToStringTag$1 && symToStringTag$1 in Object(value)) - ? getRawTag(value) - : objectToString$2(value); - } + while (valuesIndex--) { + if (values[valuesIndex] === computed) { + continue outer; + } + } - /** - * Checks if `value` is object-like. A value is object-like if it's not `null` - * and has a `typeof` result of "object". - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is object-like, else `false`. - * @example - * - * _.isObjectLike({}); - * // => true - * - * _.isObjectLike([1, 2, 3]); - * // => true - * - * _.isObjectLike(_.noop); - * // => false - * - * _.isObjectLike(null); - * // => false - */ - function isObjectLike(value) { - return value != null && typeof value == 'object'; - } + result.push(value); + } else if (!includes(values, computed, comparator)) { + result.push(value); + } + } - /** `Object#toString` result references. */ - var symbolTag = '[object Symbol]'; + return result; + } + /** + * The base implementation of `_.forEach` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + */ - /** - * Checks if `value` is classified as a `Symbol` primitive or object. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. - * @example - * - * _.isSymbol(Symbol.iterator); - * // => true - * - * _.isSymbol('abc'); - * // => false - */ - function isSymbol$4(value) { - return typeof value == 'symbol' || - (isObjectLike(value) && baseGetTag(value) == symbolTag); - } - /** Used as references for various `Number` constants. */ - var NAN = 0 / 0; + var baseEach = createBaseEach(baseForOwn); + /** + * The base implementation of `_.forEachRight` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + */ - /** Used to match leading and trailing whitespace. */ - var reTrim = /^\s+|\s+$/g; + var baseEachRight = createBaseEach(baseForOwnRight, true); + /** + * The base implementation of `_.every` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false` + */ - /** Used to detect bad signed hexadecimal string values. */ - var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; + function baseEvery(collection, predicate) { + var result = true; + baseEach(collection, function (value, index, collection) { + result = !!predicate(value, index, collection); + return result; + }); + return result; + } + /** + * The base implementation of methods like `_.max` and `_.min` which accepts a + * `comparator` to determine the extremum value. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The iteratee invoked per iteration. + * @param {Function} comparator The comparator used to compare values. + * @returns {*} Returns the extremum value. + */ - /** Used to detect binary string values. */ - var reIsBinary = /^0b[01]+$/i; - /** Used to detect octal string values. */ - var reIsOctal = /^0o[0-7]+$/i; + function baseExtremum(array, iteratee, comparator) { + var index = -1, + length = array.length; - /** Built-in method references without a dependency on `root`. */ - var freeParseInt = parseInt; + while (++index < length) { + var value = array[index], + current = iteratee(value); - /** - * Converts `value` to a number. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to process. - * @returns {number} Returns the number. - * @example - * - * _.toNumber(3.2); - * // => 3.2 - * - * _.toNumber(Number.MIN_VALUE); - * // => 5e-324 - * - * _.toNumber(Infinity); - * // => Infinity - * - * _.toNumber('3.2'); - * // => 3.2 - */ - function toNumber(value) { - if (typeof value == 'number') { - return value; - } - if (isSymbol$4(value)) { - return NAN; - } - if (isObject$1(value)) { - var other = typeof value.valueOf == 'function' ? value.valueOf() : value; - value = isObject$1(other) ? (other + '') : other; - } - if (typeof value != 'string') { - return value === 0 ? value : +value; - } - value = value.replace(reTrim, ''); - var isBinary = reIsBinary.test(value); - return (isBinary || reIsOctal.test(value)) - ? freeParseInt(value.slice(2), isBinary ? 2 : 8) - : (reIsBadHex.test(value) ? NAN : +value); - } + if (current != null && (computed === undefined$1 ? current === current && !isSymbol(current) : comparator(current, computed))) { + var computed = current, + result = value; + } + } - /** Error message constants. */ - var FUNC_ERROR_TEXT = 'Expected a function'; + return result; + } + /** + * The base implementation of `_.fill` without an iteratee call guard. + * + * @private + * @param {Array} array The array to fill. + * @param {*} value The value to fill `array` with. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns `array`. + */ - /* Built-in method references for those with the same name as other `lodash` methods. */ - var nativeMax = Math.max, - nativeMin = Math.min; - /** - * Creates a debounced function that delays invoking `func` until after `wait` - * milliseconds have elapsed since the last time the debounced function was - * invoked. The debounced function comes with a `cancel` method to cancel - * delayed `func` invocations and a `flush` method to immediately invoke them. - * Provide `options` to indicate whether `func` should be invoked on the - * leading and/or trailing edge of the `wait` timeout. The `func` is invoked - * with the last arguments provided to the debounced function. Subsequent - * calls to the debounced function return the result of the last `func` - * invocation. - * - * **Note:** If `leading` and `trailing` options are `true`, `func` is - * invoked on the trailing edge of the timeout only if the debounced function - * is invoked more than once during the `wait` timeout. - * - * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred - * until to the next tick, similar to `setTimeout` with a timeout of `0`. - * - * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) - * for details over the differences between `_.debounce` and `_.throttle`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to debounce. - * @param {number} [wait=0] The number of milliseconds to delay. - * @param {Object} [options={}] The options object. - * @param {boolean} [options.leading=false] - * Specify invoking on the leading edge of the timeout. - * @param {number} [options.maxWait] - * The maximum time `func` is allowed to be delayed before it's invoked. - * @param {boolean} [options.trailing=true] - * Specify invoking on the trailing edge of the timeout. - * @returns {Function} Returns the new debounced function. - * @example - * - * // Avoid costly calculations while the window size is in flux. - * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); - * - * // Invoke `sendMail` when clicked, debouncing subsequent calls. - * jQuery(element).on('click', _.debounce(sendMail, 300, { - * 'leading': true, - * 'trailing': false - * })); - * - * // Ensure `batchLog` is invoked once after 1 second of debounced calls. - * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); - * var source = new EventSource('/stream'); - * jQuery(source).on('message', debounced); - * - * // Cancel the trailing debounced invocation. - * jQuery(window).on('popstate', debounced.cancel); - */ - function debounce(func, wait, options) { - var lastArgs, - lastThis, - maxWait, - result, - timerId, - lastCallTime, - lastInvokeTime = 0, - leading = false, - maxing = false, - trailing = true; + function baseFill(array, value, start, end) { + var length = array.length; + start = toInteger(start); - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - wait = toNumber(wait) || 0; - if (isObject$1(options)) { - leading = !!options.leading; - maxing = 'maxWait' in options; - maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; - trailing = 'trailing' in options ? !!options.trailing : trailing; - } + if (start < 0) { + start = -start > length ? 0 : length + start; + } - function invokeFunc(time) { - var args = lastArgs, - thisArg = lastThis; + end = end === undefined$1 || end > length ? length : toInteger(end); - lastArgs = lastThis = undefined; - lastInvokeTime = time; - result = func.apply(thisArg, args); - return result; - } + if (end < 0) { + end += length; + } - function leadingEdge(time) { - // Reset any `maxWait` timer. - lastInvokeTime = time; - // Start the timer for the trailing edge. - timerId = setTimeout(timerExpired, wait); - // Invoke the leading edge. - return leading ? invokeFunc(time) : result; - } + end = start > end ? 0 : toLength(end); - function remainingWait(time) { - var timeSinceLastCall = time - lastCallTime, - timeSinceLastInvoke = time - lastInvokeTime, - timeWaiting = wait - timeSinceLastCall; + while (start < end) { + array[start++] = value; + } - return maxing - ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) - : timeWaiting; - } + return array; + } + /** + * The base implementation of `_.filter` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ - function shouldInvoke(time) { - var timeSinceLastCall = time - lastCallTime, - timeSinceLastInvoke = time - lastInvokeTime; - // Either this is the first call, activity has stopped and we're at the - // trailing edge, the system time has gone backwards and we're treating - // it as the trailing edge, or we've hit the `maxWait` limit. - return (lastCallTime === undefined || (timeSinceLastCall >= wait) || - (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); - } + function baseFilter(collection, predicate) { + var result = []; + baseEach(collection, function (value, index, collection) { + if (predicate(value, index, collection)) { + result.push(value); + } + }); + return result; + } + /** + * The base implementation of `_.flatten` with support for restricting flattening. + * + * @private + * @param {Array} array The array to flatten. + * @param {number} depth The maximum recursion depth. + * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. + * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. + * @param {Array} [result=[]] The initial result value. + * @returns {Array} Returns the new flattened array. + */ - function timerExpired() { - var time = now$1(); - if (shouldInvoke(time)) { - return trailingEdge(time); - } - // Restart the timer. - timerId = setTimeout(timerExpired, remainingWait(time)); - } - function trailingEdge(time) { - timerId = undefined; + function baseFlatten(array, depth, predicate, isStrict, result) { + var index = -1, + length = array.length; + predicate || (predicate = isFlattenable); + result || (result = []); - // Only invoke if we have `lastArgs` which means `func` has been - // debounced at least once. - if (trailing && lastArgs) { - return invokeFunc(time); - } - lastArgs = lastThis = undefined; - return result; - } + while (++index < length) { + var value = array[index]; - function cancel() { - if (timerId !== undefined) { - clearTimeout(timerId); - } - lastInvokeTime = 0; - lastArgs = lastCallTime = lastThis = timerId = undefined; - } + if (depth > 0 && predicate(value)) { + if (depth > 1) { + // Recursively flatten arrays (susceptible to call stack limits). + baseFlatten(value, depth - 1, predicate, isStrict, result); + } else { + arrayPush(result, value); + } + } else if (!isStrict) { + result[result.length] = value; + } + } - function flush() { - return timerId === undefined ? result : trailingEdge(now$1()); - } + return result; + } + /** + * The base implementation of `baseForOwn` which iterates over `object` + * properties returned by `keysFunc` and invokes `iteratee` for each property. + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ - function debounced() { - var time = now$1(), - isInvoking = shouldInvoke(time); - lastArgs = arguments; - lastThis = this; - lastCallTime = time; + var baseFor = createBaseFor(); + /** + * This function is like `baseFor` except that it iterates over properties + * in the opposite order. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ - if (isInvoking) { - if (timerId === undefined) { - return leadingEdge(lastCallTime); - } - if (maxing) { - // Handle invocations in a tight loop. - clearTimeout(timerId); - timerId = setTimeout(timerExpired, wait); - return invokeFunc(lastCallTime); + var baseForRight = createBaseFor(true); + /** + * The base implementation of `_.forOwn` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ + + function baseForOwn(object, iteratee) { + return object && baseFor(object, iteratee, keys); } - } - if (timerId === undefined) { - timerId = setTimeout(timerExpired, wait); - } - return result; - } - debounced.cancel = cancel; - debounced.flush = flush; - return debounced; - } + /** + * The base implementation of `_.forOwnRight` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ - /** Error message constants. */ - var FUNC_ERROR_TEXT$1 = 'Expected a function'; - /** - * Creates a throttled function that only invokes `func` at most once per - * every `wait` milliseconds. The throttled function comes with a `cancel` - * method to cancel delayed `func` invocations and a `flush` method to - * immediately invoke them. Provide `options` to indicate whether `func` - * should be invoked on the leading and/or trailing edge of the `wait` - * timeout. The `func` is invoked with the last arguments provided to the - * throttled function. Subsequent calls to the throttled function return the - * result of the last `func` invocation. - * - * **Note:** If `leading` and `trailing` options are `true`, `func` is - * invoked on the trailing edge of the timeout only if the throttled function - * is invoked more than once during the `wait` timeout. - * - * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred - * until to the next tick, similar to `setTimeout` with a timeout of `0`. - * - * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) - * for details over the differences between `_.throttle` and `_.debounce`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to throttle. - * @param {number} [wait=0] The number of milliseconds to throttle invocations to. - * @param {Object} [options={}] The options object. - * @param {boolean} [options.leading=true] - * Specify invoking on the leading edge of the timeout. - * @param {boolean} [options.trailing=true] - * Specify invoking on the trailing edge of the timeout. - * @returns {Function} Returns the new throttled function. - * @example - * - * // Avoid excessively updating the position while scrolling. - * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); - * - * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes. - * var throttled = _.throttle(renewToken, 300000, { 'trailing': false }); - * jQuery(element).on('click', throttled); - * - * // Cancel the trailing throttled invocation. - * jQuery(window).on('popstate', throttled.cancel); - */ - function throttle(func, wait, options) { - var leading = true, - trailing = true; + function baseForOwnRight(object, iteratee) { + return object && baseForRight(object, iteratee, keys); + } + /** + * The base implementation of `_.functions` which creates an array of + * `object` function property names filtered from `props`. + * + * @private + * @param {Object} object The object to inspect. + * @param {Array} props The property names to filter. + * @returns {Array} Returns the function names. + */ + - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT$1); - } - if (isObject$1(options)) { - leading = 'leading' in options ? !!options.leading : leading; - trailing = 'trailing' in options ? !!options.trailing : trailing; - } - return debounce(func, wait, { - 'leading': leading, - 'maxWait': wait, - 'trailing': trailing - }); - } + function baseFunctions(object, props) { + return arrayFilter(props, function (key) { + return isFunction(object[key]); + }); + } + /** + * The base implementation of `_.get` without support for default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @returns {*} Returns the resolved value. + */ - var hashes = createCommonjsModule(function (module, exports) { - /** - * jshashes - https://github.com/h2non/jshashes - * Released under the "New BSD" license - * - * Algorithms specification: - * - * MD5 - http://www.ietf.org/rfc/rfc1321.txt - * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html - * SHA1 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf - * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf - * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf - * HMAC - http://www.ietf.org/rfc/rfc2104.txt - */ - (function() { - var Hashes; - function utf8Encode(str) { - var x, y, output = '', - i = -1, - l; - - if (str && str.length) { - l = str.length; - while ((i += 1) < l) { - /* Decode utf-16 surrogate pairs */ - x = str.charCodeAt(i); - y = i + 1 < l ? str.charCodeAt(i + 1) : 0; - if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) { - x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF); - i += 1; - } - /* Encode output as utf-8 */ - if (x <= 0x7F) { - output += String.fromCharCode(x); - } else if (x <= 0x7FF) { - output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F), - 0x80 | (x & 0x3F)); - } else if (x <= 0xFFFF) { - output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F), - 0x80 | ((x >>> 6) & 0x3F), - 0x80 | (x & 0x3F)); - } else if (x <= 0x1FFFFF) { - output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07), - 0x80 | ((x >>> 12) & 0x3F), - 0x80 | ((x >>> 6) & 0x3F), - 0x80 | (x & 0x3F)); + function baseGet(object, path) { + path = castPath(path, object); + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[toKey(path[index++])]; } + + return index && index == length ? object : undefined$1; } - } - return output; - } + /** + * The base implementation of `getAllKeys` and `getAllKeysIn` which uses + * `keysFunc` and `symbolsFunc` to get the enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Function} keysFunc The function to get the keys of `object`. + * @param {Function} symbolsFunc The function to get the symbols of `object`. + * @returns {Array} Returns the array of property names and symbols. + */ - function utf8Decode(str) { - var i, ac, c1, c2, c3, arr = [], - l; - i = ac = c1 = c2 = c3 = 0; - - if (str && str.length) { - l = str.length; - str += ''; - - while (i < l) { - c1 = str.charCodeAt(i); - ac += 1; - if (c1 < 128) { - arr[ac] = String.fromCharCode(c1); - i += 1; - } else if (c1 > 191 && c1 < 224) { - c2 = str.charCodeAt(i + 1); - arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63)); - i += 2; - } else { - c2 = str.charCodeAt(i + 1); - c3 = str.charCodeAt(i + 2); - arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); - i += 3; + + function baseGetAllKeys(object, keysFunc, symbolsFunc) { + var result = keysFunc(object); + return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); + } + /** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ + + + function baseGetTag(value) { + if (value == null) { + return value === undefined$1 ? undefinedTag : nullTag; } + + return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value); } - } - return arr.join(''); - } + /** + * The base implementation of `_.gt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, + * else `false`. + */ - /** - * Add integers, wrapping at 2^32. This uses 16-bit operations internally - * to work around bugs in some JS interpreters. - */ - function safe_add(x, y) { - var lsw = (x & 0xFFFF) + (y & 0xFFFF), - msw = (x >> 16) + (y >> 16) + (lsw >> 16); - return (msw << 16) | (lsw & 0xFFFF); - } + function baseGt(value, other) { + return value > other; + } + /** + * The base implementation of `_.has` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ - /** - * Bitwise rotate a 32-bit number to the left. - */ - function bit_rol(num, cnt) { - return (num << cnt) | (num >>> (32 - cnt)); - } + function baseHas(object, key) { + return object != null && hasOwnProperty.call(object, key); + } + /** + * The base implementation of `_.hasIn` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ - /** - * Convert a raw string to a hex string - */ - function rstr2hex(input, hexcase) { - var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef', - output = '', - x, i = 0, - l = input.length; - for (; i < l; i += 1) { - x = input.charCodeAt(i); - output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F); - } - return output; - } + function baseHasIn(object, key) { + return object != null && key in Object(object); + } + /** + * The base implementation of `_.inRange` which doesn't coerce arguments. + * + * @private + * @param {number} number The number to check. + * @param {number} start The start of the range. + * @param {number} end The end of the range. + * @returns {boolean} Returns `true` if `number` is in the range, else `false`. + */ - /** - * Convert an array of big-endian words to a string - */ - function binb2rstr(input) { - var i, l = input.length * 32, - output = ''; - for (i = 0; i < l; i += 8) { - output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF); - } - return output; - } + function baseInRange(number, start, end) { + return number >= nativeMin(start, end) && number < nativeMax(start, end); + } + /** + * The base implementation of methods like `_.intersection`, without support + * for iteratee shorthands, that accepts an array of arrays to inspect. + * + * @private + * @param {Array} arrays The arrays to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of shared values. + */ - /** - * Convert an array of little-endian words to a string - */ - function binl2rstr(input) { - var i, l = input.length * 32, - output = ''; - for (i = 0; i < l; i += 8) { - output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF); - } - return output; - } + function baseIntersection(arrays, iteratee, comparator) { + var includes = comparator ? arrayIncludesWith : arrayIncludes, + length = arrays[0].length, + othLength = arrays.length, + othIndex = othLength, + caches = Array(othLength), + maxLength = Infinity, + result = []; - /** - * Convert a raw string to an array of little-endian words - * Characters >255 have their high-byte silently ignored. - */ + while (othIndex--) { + var array = arrays[othIndex]; - function rstr2binl(input) { - var i, l = input.length * 8, - output = Array(input.length >> 2), - lo = output.length; - for (i = 0; i < lo; i += 1) { - output[i] = 0; - } - for (i = 0; i < l; i += 8) { - output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32); - } - return output; - } + if (othIndex && iteratee) { + array = arrayMap(array, baseUnary(iteratee)); + } - /** - * Convert a raw string to an array of big-endian words - * Characters >255 have their high-byte silently ignored. - */ + maxLength = nativeMin(array.length, maxLength); + caches[othIndex] = !comparator && (iteratee || length >= 120 && array.length >= 120) ? new SetCache(othIndex && array) : undefined$1; + } - function rstr2binb(input) { - var i, l = input.length * 8, - output = Array(input.length >> 2), - lo = output.length; - for (i = 0; i < lo; i += 1) { - output[i] = 0; - } - for (i = 0; i < l; i += 8) { - output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32); - } - return output; - } + array = arrays[0]; + var index = -1, + seen = caches[0]; - /** - * Convert a raw string to an arbitrary string encoding - */ + outer: while (++index < length && result.length < maxLength) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + value = comparator || value !== 0 ? value : 0; - function rstr2any(input, encoding) { - var divisor = encoding.length, - remainders = Array(), - i, q, x, ld, quotient, dividend, output, full_length; + if (!(seen ? cacheHas(seen, computed) : includes(result, computed, comparator))) { + othIndex = othLength; - /* Convert to an array of 16-bit big-endian values, forming the dividend */ - dividend = Array(Math.ceil(input.length / 2)); - ld = dividend.length; - for (i = 0; i < ld; i += 1) { - dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1); - } + while (--othIndex) { + var cache = caches[othIndex]; - /** - * Repeatedly perform a long division. The binary array forms the dividend, - * the length of the encoding is the divisor. Once computed, the quotient - * forms the dividend for the next step. We stop when the dividend is zerHashes. - * All remainders are stored for later use. - */ - while (dividend.length > 0) { - quotient = Array(); - x = 0; - for (i = 0; i < dividend.length; i += 1) { - x = (x << 16) + dividend[i]; - q = Math.floor(x / divisor); - x -= q * divisor; - if (quotient.length > 0 || q > 0) { - quotient[quotient.length] = q; + if (!(cache ? cacheHas(cache, computed) : includes(arrays[othIndex], computed, comparator))) { + continue outer; + } + } + + if (seen) { + seen.push(computed); + } + + result.push(value); + } } + + return result; } - remainders[remainders.length] = x; - dividend = quotient; - } + /** + * The base implementation of `_.invert` and `_.invertBy` which inverts + * `object` with values transformed by `iteratee` and set by `setter`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform values. + * @param {Object} accumulator The initial inverted object. + * @returns {Function} Returns `accumulator`. + */ - /* Convert the remainders to the output string */ - output = ''; - for (i = remainders.length - 1; i >= 0; i--) { - output += encoding.charAt(remainders[i]); - } - /* Append leading zero equivalents */ - full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2))); - for (i = output.length; i < full_length; i += 1) { - output = encoding[0] + output; - } - return output; - } + function baseInverter(object, setter, iteratee, accumulator) { + baseForOwn(object, function (value, key, object) { + setter(accumulator, iteratee(value), key, object); + }); + return accumulator; + } + /** + * The base implementation of `_.invoke` without support for individual + * method arguments. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the method to invoke. + * @param {Array} args The arguments to invoke the method with. + * @returns {*} Returns the result of the invoked method. + */ - /** - * Convert a raw string to a base-64 string - */ - function rstr2b64(input, b64pad) { - var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', - output = '', - len = input.length, - i, j, triplet; - b64pad = b64pad || '='; - for (i = 0; i < len; i += 3) { - triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0); - for (j = 0; j < 4; j += 1) { - if (i * 8 + j * 6 > input.length * 8) { - output += b64pad; - } else { - output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F); + function baseInvoke(object, path, args) { + path = castPath(path, object); + object = parent(object, path); + var func = object == null ? object : object[toKey(last(path))]; + return func == null ? undefined$1 : apply(func, object, args); + } + /** + * The base implementation of `_.isArguments`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + */ + + + function baseIsArguments(value) { + return isObjectLike(value) && baseGetTag(value) == argsTag; + } + /** + * The base implementation of `_.isArrayBuffer` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. + */ + + + function baseIsArrayBuffer(value) { + return isObjectLike(value) && baseGetTag(value) == arrayBufferTag; + } + /** + * The base implementation of `_.isDate` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a date object, else `false`. + */ + + + function baseIsDate(value) { + return isObjectLike(value) && baseGetTag(value) == dateTag; + } + /** + * The base implementation of `_.isEqual` which supports partial comparisons + * and tracks traversed objects. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {boolean} bitmask The bitmask flags. + * 1 - Unordered comparison + * 2 - Partial comparison + * @param {Function} [customizer] The function to customize comparisons. + * @param {Object} [stack] Tracks traversed `value` and `other` objects. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + */ + + + function baseIsEqual(value, other, bitmask, customizer, stack) { + if (value === other) { + return true; + } + + if (value == null || other == null || !isObjectLike(value) && !isObjectLike(other)) { + return value !== value && other !== other; } + + return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); } - } - return output; - } + /** + * A specialized version of `baseIsEqual` for arrays and objects which performs + * deep comparisons and tracks traversed objects enabling objects with circular + * references to be compared. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} [stack] Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ - Hashes = { - /** - * @property {String} version - * @readonly - */ - VERSION: '1.0.6', - /** - * @member Hashes - * @class Base64 - * @constructor - */ - Base64: function() { - // private properties - var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', - pad = '=', // default pad according with the RFC standard - utf8 = true; // by default enable UTF-8 support encoding - // public method for encoding - this.encode = function(input) { - var i, j, triplet, - output = '', - len = input.length; + function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { + var objIsArr = isArray(object), + othIsArr = isArray(other), + objTag = objIsArr ? arrayTag : getTag(object), + othTag = othIsArr ? arrayTag : getTag(other); + objTag = objTag == argsTag ? objectTag : objTag; + othTag = othTag == argsTag ? objectTag : othTag; + var objIsObj = objTag == objectTag, + othIsObj = othTag == objectTag, + isSameTag = objTag == othTag; - pad = pad || '='; - input = (utf8) ? utf8Encode(input) : input; + if (isSameTag && isBuffer(object)) { + if (!isBuffer(other)) { + return false; + } - for (i = 0; i < len; i += 3) { - triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0); - for (j = 0; j < 4; j += 1) { - if (i * 8 + j * 6 > len * 8) { - output += pad; - } else { - output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F); - } + objIsArr = true; + objIsObj = false; + } + + if (isSameTag && !objIsObj) { + stack || (stack = new Stack()); + return objIsArr || isTypedArray(object) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); + } + + if (!(bitmask & COMPARE_PARTIAL_FLAG)) { + var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), + othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); + + if (objIsWrapped || othIsWrapped) { + var objUnwrapped = objIsWrapped ? object.value() : object, + othUnwrapped = othIsWrapped ? other.value() : other; + stack || (stack = new Stack()); + return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); } } - return output; - }; - // public method for decoding - this.decode = function(input) { - // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - var i, o1, o2, o3, h1, h2, h3, h4, bits, ac, - dec = '', - arr = []; - if (!input) { - return input; + if (!isSameTag) { + return false; } - i = ac = 0; - input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '=' - //input += ''; + stack || (stack = new Stack()); + return equalObjects(object, other, bitmask, customizer, equalFunc, stack); + } + /** + * The base implementation of `_.isMap` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a map, else `false`. + */ + + + function baseIsMap(value) { + return isObjectLike(value) && getTag(value) == mapTag; + } + /** + * The base implementation of `_.isMatch` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Array} matchData The property names, values, and compare flags to match. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + */ - do { // unpack four hexets into three octets using index points in b64 - h1 = tab.indexOf(input.charAt(i += 1)); - h2 = tab.indexOf(input.charAt(i += 1)); - h3 = tab.indexOf(input.charAt(i += 1)); - h4 = tab.indexOf(input.charAt(i += 1)); - bits = h1 << 18 | h2 << 12 | h3 << 6 | h4; + function baseIsMatch(object, source, matchData, customizer) { + var index = matchData.length, + length = index, + noCustomizer = !customizer; - o1 = bits >> 16 & 0xff; - o2 = bits >> 8 & 0xff; - o3 = bits & 0xff; - ac += 1; + if (object == null) { + return !length; + } + + object = Object(object); + + while (index--) { + var data = matchData[index]; + + if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) { + return false; + } + } + + while (++index < length) { + data = matchData[index]; + var key = data[0], + objValue = object[key], + srcValue = data[1]; - if (h3 === 64) { - arr[ac] = String.fromCharCode(o1); - } else if (h4 === 64) { - arr[ac] = String.fromCharCode(o1, o2); + if (noCustomizer && data[2]) { + if (objValue === undefined$1 && !(key in object)) { + return false; + } } else { - arr[ac] = String.fromCharCode(o1, o2, o3); + var stack = new Stack(); + + if (customizer) { + var result = customizer(objValue, srcValue, key, object, source, stack); + } + + if (!(result === undefined$1 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) : result)) { + return false; + } } - } while (i < input.length); + } - dec = arr.join(''); - dec = (utf8) ? utf8Decode(dec) : dec; + return true; + } + /** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ - return dec; - }; - // set custom pad string - this.setPad = function(str) { - pad = str || pad; - return this; - }; - // set custom tab string characters - this.setTab = function(str) { - tab = str || tab; - return this; - }; - this.setUTF8 = function(bool) { - if (typeof bool === 'boolean') { - utf8 = bool; + function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; } - return this; - }; - }, - /** - * CRC-32 calculation - * @member Hashes - * @method CRC32 - * @static - * @param {String} str Input String - * @return {String} - */ - CRC32: function(str) { - var crc = 0, - x = 0, - y = 0, - table, i, iTop; - str = utf8Encode(str); - - table = [ - '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ', - '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ', - '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ', - '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ', - 'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ', - '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ', - 'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ', - '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ', - 'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ', - '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ', - 'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ', - '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ', - 'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ', - '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ', - '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ', - '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ', - '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ', - 'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ', - '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ', - 'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ', - '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ', - 'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ', - '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ', - 'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ', - '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ', - 'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D' - ].join(''); - - crc = crc ^ (-1); - for (i = 0, iTop = str.length; i < iTop; i += 1) { - y = (crc ^ str.charCodeAt(i)) & 0xFF; - x = '0x' + table.substr(y * 9, 8); - crc = (crc >>> 8) ^ x; - } - // always return a positive number (that's what >>> 0 does) - return (crc ^ (-1)) >>> 0; - }, - /** - * @member Hashes - * @class MD5 - * @constructor - * @param {Object} [config] - * - * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message - * Digest Algorithm, as defined in RFC 1321. - * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * See for more infHashes. - */ - MD5: function(options) { + var pattern = isFunction(value) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); + } /** - * Private config properties. You may need to tweak these to be compatible with - * the server-side, but the defaults work in most cases. - * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase} + * The base implementation of `_.isRegExp` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. */ - var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase - b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance - utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding - // privileged (public) methods - this.hex = function(s) { - return rstr2hex(rstr(s), hexcase); - }; - this.b64 = function(s) { - return rstr2b64(rstr(s), b64pad); - }; - this.any = function(s, e) { - return rstr2any(rstr(s), e); - }; - this.raw = function(s) { - return rstr(s); - }; - this.hex_hmac = function(k, d) { - return rstr2hex(rstr_hmac(k, d), hexcase); - }; - this.b64_hmac = function(k, d) { - return rstr2b64(rstr_hmac(k, d), b64pad); - }; - this.any_hmac = function(k, d, e) { - return rstr2any(rstr_hmac(k, d), e); - }; + + function baseIsRegExp(value) { + return isObjectLike(value) && baseGetTag(value) == regexpTag; + } /** - * Perform a simple self-test to see if the VM is working - * @return {String} Hexadecimal hash sample + * The base implementation of `_.isSet` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a set, else `false`. */ - this.vm_test = function() { - return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72'; - }; + + + function baseIsSet(value) { + return isObjectLike(value) && getTag(value) == setTag; + } /** - * Enable/disable uppercase hexadecimal returned string - * @param {Boolean} - * @return {Object} this + * The base implementation of `_.isTypedArray` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. */ - this.setUpperCase = function(a) { - if (typeof a === 'boolean') { - hexcase = a; - } - return this; - }; + + + function baseIsTypedArray(value) { + return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; + } /** - * Defines a base64 pad string - * @param {String} Pad - * @return {Object} this + * The base implementation of `_.iteratee`. + * + * @private + * @param {*} [value=_.identity] The value to convert to an iteratee. + * @returns {Function} Returns the iteratee. */ - this.setPad = function(a) { - b64pad = a || b64pad; - return this; - }; + + + function baseIteratee(value) { + // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. + // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. + if (typeof value == 'function') { + return value; + } + + if (value == null) { + return identity; + } + + if (_typeof(value) == 'object') { + return isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value); + } + + return property(value); + } /** - * Defines a base64 pad string - * @param {Boolean} - * @return {Object} [this] + * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. */ - this.setUTF8 = function(a) { - if (typeof a === 'boolean') { - utf8 = a; + + + function baseKeys(object) { + if (!isPrototype(object)) { + return nativeKeys(object); } - return this; - }; - // private methods - - /** - * Calculate the MD5 of a raw string - */ - - function rstr(s) { - s = (utf8) ? utf8Encode(s) : s; - return binl2rstr(binl(rstr2binl(s), s.length * 8)); - } - - /** - * Calculate the HMAC-MD5, of a key and some data (raw strings) - */ - - function rstr_hmac(key, data) { - var bkey, ipad, opad, hash, i; - - key = (utf8) ? utf8Encode(key) : key; - data = (utf8) ? utf8Encode(data) : data; - bkey = rstr2binl(key); - if (bkey.length > 16) { - bkey = binl(bkey, key.length * 8); - } - - ipad = Array(16), opad = Array(16); - for (i = 0; i < 16; i += 1) { - ipad[i] = bkey[i] ^ 0x36363636; - opad[i] = bkey[i] ^ 0x5C5C5C5C; - } - hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8); - return binl2rstr(binl(opad.concat(hash), 512 + 128)); - } - - /** - * Calculate the MD5 of an array of little-endian words, and a bit length. - */ - - function binl(x, len) { - var i, olda, oldb, oldc, oldd, - a = 1732584193, - b = -271733879, - c = -1732584194, - d = 271733878; + var result = []; + + for (var key in Object(object)) { + if (hasOwnProperty.call(object, key) && key != 'constructor') { + result.push(key); + } + } - /* append padding */ - x[len >> 5] |= 0x80 << ((len) % 32); - x[(((len + 64) >>> 9) << 4) + 14] = len; + return result; + } + /** + * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ - for (i = 0; i < x.length; i += 16) { - olda = a; - oldb = b; - oldc = c; - oldd = d; - a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936); - d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586); - c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819); - b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330); - a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897); - d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426); - c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341); - b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983); - a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416); - d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417); - c = md5_ff(c, d, a, b, x[i + 10], 17, -42063); - b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162); - a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682); - d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101); - c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290); - b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329); + function baseKeysIn(object) { + if (!isObject(object)) { + return nativeKeysIn(object); + } - a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510); - d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632); - c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713); - b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302); - a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691); - d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083); - c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335); - b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848); - a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438); - d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690); - c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961); - b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501); - a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467); - d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784); - c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473); - b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734); + var isProto = isPrototype(object), + result = []; - a = md5_hh(a, b, c, d, x[i + 5], 4, -378558); - d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463); - c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562); - b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556); - a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060); - d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353); - c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632); - b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640); - a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174); - d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222); - c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979); - b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189); - a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487); - d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835); - c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520); - b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651); + for (var key in object) { + if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } - a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844); - d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415); - c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905); - b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055); - a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571); - d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606); - c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523); - b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799); - a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359); - d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744); - c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380); - b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649); - a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070); - d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379); - c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259); - b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551); - - a = safe_add(a, olda); - b = safe_add(b, oldb); - c = safe_add(c, oldc); - d = safe_add(d, oldd); - } - return Array(a, b, c, d); - } - - /** - * These functions implement the four basic operations the algorithm uses. - */ - - function md5_cmn(q, a, b, x, s, t) { - return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b); - } - - function md5_ff(a, b, c, d, x, s, t) { - return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); - } - - function md5_gg(a, b, c, d, x, s, t) { - return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); - } - - function md5_hh(a, b, c, d, x, s, t) { - return md5_cmn(b ^ c ^ d, a, b, x, s, t); - } - - function md5_ii(a, b, c, d, x, s, t) { - return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); + return result; } - }, - /** - * @member Hashes - * @class Hashes.SHA1 - * @param {Object} [config] - * @constructor - * - * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1 - * Version 2.2 Copyright Paul Johnston 2000 - 2009. - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * See http://pajhome.org.uk/crypt/md5 for details. - */ - SHA1: function(options) { /** - * Private config properties. You may need to tweak these to be compatible with - * the server-side, but the defaults work in most cases. - * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase} + * The base implementation of `_.lt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than `other`, + * else `false`. */ - var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase - b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance - utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding - // public methods - this.hex = function(s) { - return rstr2hex(rstr(s), hexcase); - }; - this.b64 = function(s) { - return rstr2b64(rstr(s), b64pad); - }; - this.any = function(s, e) { - return rstr2any(rstr(s), e); - }; - this.raw = function(s) { - return rstr(s); - }; - this.hex_hmac = function(k, d) { - return rstr2hex(rstr_hmac(k, d)); - }; - this.b64_hmac = function(k, d) { - return rstr2b64(rstr_hmac(k, d), b64pad); - }; - this.any_hmac = function(k, d, e) { - return rstr2any(rstr_hmac(k, d), e); - }; + + function baseLt(value, other) { + return value < other; + } /** - * Perform a simple self-test to see if the VM is working - * @return {String} Hexadecimal hash sample - * @public + * The base implementation of `_.map` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. */ - this.vm_test = function() { - return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72'; - }; + + + function baseMap(collection, iteratee) { + var index = -1, + result = isArrayLike(collection) ? Array(collection.length) : []; + baseEach(collection, function (value, key, collection) { + result[++index] = iteratee(value, key, collection); + }); + return result; + } /** - * @description Enable/disable uppercase hexadecimal returned string - * @param {boolean} - * @return {Object} this - * @public + * The base implementation of `_.matches` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property values to match. + * @returns {Function} Returns the new spec function. */ - this.setUpperCase = function(a) { - if (typeof a === 'boolean') { - hexcase = a; + + + function baseMatches(source) { + var matchData = getMatchData(source); + + if (matchData.length == 1 && matchData[0][2]) { + return matchesStrictComparable(matchData[0][0], matchData[0][1]); } - return this; - }; + + return function (object) { + return object === source || baseIsMatch(object, source, matchData); + }; + } /** - * @description Defines a base64 pad string - * @param {string} Pad - * @return {Object} this - * @public + * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. + * + * @private + * @param {string} path The path of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. */ - this.setPad = function(a) { - b64pad = a || b64pad; - return this; - }; + + + function baseMatchesProperty(path, srcValue) { + if (isKey(path) && isStrictComparable(srcValue)) { + return matchesStrictComparable(toKey(path), srcValue); + } + + return function (object) { + var objValue = get(object, path); + return objValue === undefined$1 && objValue === srcValue ? hasIn(object, path) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); + }; + } /** - * @description Defines a base64 pad string - * @param {boolean} - * @return {Object} this - * @public + * The base implementation of `_.merge` without support for multiple sources. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {number} srcIndex The index of `source`. + * @param {Function} [customizer] The function to customize merged values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. */ - this.setUTF8 = function(a) { - if (typeof a === 'boolean') { - utf8 = a; + + + function baseMerge(object, source, srcIndex, customizer, stack) { + if (object === source) { + return; } - return this; - }; - // private methods + baseFor(source, function (srcValue, key) { + stack || (stack = new Stack()); + + if (isObject(srcValue)) { + baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); + } else { + var newValue = customizer ? customizer(safeGet(object, key), srcValue, key + '', object, source, stack) : undefined$1; + + if (newValue === undefined$1) { + newValue = srcValue; + } + assignMergeValue(object, key, newValue); + } + }, keysIn); + } /** - * Calculate the SHA-512 of a raw string + * A specialized version of `baseMerge` for arrays and objects which performs + * deep merges and tracks traversed objects enabling objects with circular + * references to be merged. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {string} key The key of the value to merge. + * @param {number} srcIndex The index of `source`. + * @param {Function} mergeFunc The function to merge values. + * @param {Function} [customizer] The function to customize assigned values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. */ - function rstr(s) { - s = (utf8) ? utf8Encode(s) : s; - return binb2rstr(binb(rstr2binb(s), s.length * 8)); - } + function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { + var objValue = safeGet(object, key), + srcValue = safeGet(source, key), + stacked = stack.get(srcValue); + + if (stacked) { + assignMergeValue(object, key, stacked); + return; + } + + var newValue = customizer ? customizer(objValue, srcValue, key + '', object, source, stack) : undefined$1; + var isCommon = newValue === undefined$1; + + if (isCommon) { + var isArr = isArray(srcValue), + isBuff = !isArr && isBuffer(srcValue), + isTyped = !isArr && !isBuff && isTypedArray(srcValue); + newValue = srcValue; + + if (isArr || isBuff || isTyped) { + if (isArray(objValue)) { + newValue = objValue; + } else if (isArrayLikeObject(objValue)) { + newValue = copyArray(objValue); + } else if (isBuff) { + isCommon = false; + newValue = cloneBuffer(srcValue, true); + } else if (isTyped) { + isCommon = false; + newValue = cloneTypedArray(srcValue, true); + } else { + newValue = []; + } + } else if (isPlainObject(srcValue) || isArguments(srcValue)) { + newValue = objValue; + + if (isArguments(objValue)) { + newValue = toPlainObject(objValue); + } else if (!isObject(objValue) || isFunction(objValue)) { + newValue = initCloneObject(srcValue); + } + } else { + isCommon = false; + } + } + + if (isCommon) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, newValue); + mergeFunc(newValue, srcValue, srcIndex, customizer, stack); + stack['delete'](srcValue); + } + + assignMergeValue(object, key, newValue); + } /** - * Calculate the HMAC-SHA1 of a key and some data (raw strings) + * The base implementation of `_.nth` which doesn't coerce arguments. + * + * @private + * @param {Array} array The array to query. + * @param {number} n The index of the element to return. + * @returns {*} Returns the nth element of `array`. */ - function rstr_hmac(key, data) { - var bkey, ipad, opad, i, hash; - key = (utf8) ? utf8Encode(key) : key; - data = (utf8) ? utf8Encode(data) : data; - bkey = rstr2binb(key); - if (bkey.length > 16) { - bkey = binb(bkey, key.length * 8); + function baseNth(array, n) { + var length = array.length; + + if (!length) { + return; } - ipad = Array(16), opad = Array(16); - for (i = 0; i < 16; i += 1) { - ipad[i] = bkey[i] ^ 0x36363636; - opad[i] = bkey[i] ^ 0x5C5C5C5C; + + n += n < 0 ? length : 0; + return isIndex(n, length) ? array[n] : undefined$1; + } + /** + * The base implementation of `_.orderBy` without param guards. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. + * @param {string[]} orders The sort orders of `iteratees`. + * @returns {Array} Returns the new sorted array. + */ + + + function baseOrderBy(collection, iteratees, orders) { + if (iteratees.length) { + iteratees = arrayMap(iteratees, function (iteratee) { + if (isArray(iteratee)) { + return function (value) { + return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee); + }; + } + + return iteratee; + }); + } else { + iteratees = [identity]; } - hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8); - return binb2rstr(binb(opad.concat(hash), 512 + 160)); + + var index = -1; + iteratees = arrayMap(iteratees, baseUnary(getIteratee())); + var result = baseMap(collection, function (value, key, collection) { + var criteria = arrayMap(iteratees, function (iteratee) { + return iteratee(value); + }); + return { + 'criteria': criteria, + 'index': ++index, + 'value': value + }; + }); + return baseSortBy(result, function (object, other) { + return compareMultiple(object, other, orders); + }); } + /** + * The base implementation of `_.pick` without support for individual + * property identifiers. + * + * @private + * @param {Object} object The source object. + * @param {string[]} paths The property paths to pick. + * @returns {Object} Returns the new object. + */ + + function basePick(object, paths) { + return basePickBy(object, paths, function (value, path) { + return hasIn(object, path); + }); + } /** - * Calculate the SHA-1 of an array of big-endian words, and a bit length + * The base implementation of `_.pickBy` without support for iteratee shorthands. + * + * @private + * @param {Object} object The source object. + * @param {string[]} paths The property paths to pick. + * @param {Function} predicate The function invoked per property. + * @returns {Object} Returns the new object. */ - function binb(x, len) { - var i, j, t, olda, oldb, oldc, oldd, olde, - w = Array(80), - a = 1732584193, - b = -271733879, - c = -1732584194, - d = 271733878, - e = -1009589776; - /* append padding */ - x[len >> 5] |= 0x80 << (24 - len % 32); - x[((len + 64 >> 9) << 4) + 15] = len; + function basePickBy(object, paths, predicate) { + var index = -1, + length = paths.length, + result = {}; - for (i = 0; i < x.length; i += 16) { - olda = a; - oldb = b; - oldc = c; - oldd = d; - olde = e; + while (++index < length) { + var path = paths[index], + value = baseGet(object, path); - for (j = 0; j < 80; j += 1) { - if (j < 16) { - w[j] = x[i + j]; - } else { - w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1); - } - t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)), - safe_add(safe_add(e, w[j]), sha1_kt(j))); - e = d; - d = c; - c = bit_rol(b, 30); - b = a; - a = t; + if (predicate(value, path)) { + baseSet(result, castPath(path, object), value); } - - a = safe_add(a, olda); - b = safe_add(b, oldb); - c = safe_add(c, oldc); - d = safe_add(d, oldd); - e = safe_add(e, olde); } - return Array(a, b, c, d, e); + + return result; } + /** + * A specialized version of `baseProperty` which supports deep paths. + * + * @private + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new accessor function. + */ + + function basePropertyDeep(path) { + return function (object) { + return baseGet(object, path); + }; + } /** - * Perform the appropriate triplet combination function for the current - * iteration + * The base implementation of `_.pullAllBy` without support for iteratee + * shorthands. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns `array`. */ - function sha1_ft(t, b, c, d) { - if (t < 20) { - return (b & c) | ((~b) & d); + + function basePullAll(array, values, iteratee, comparator) { + var indexOf = comparator ? baseIndexOfWith : baseIndexOf, + index = -1, + length = values.length, + seen = array; + + if (array === values) { + values = copyArray(values); } - if (t < 40) { - return b ^ c ^ d; + + if (iteratee) { + seen = arrayMap(array, baseUnary(iteratee)); } - if (t < 60) { - return (b & c) | (b & d) | (c & d); + + while (++index < length) { + var fromIndex = 0, + value = values[index], + computed = iteratee ? iteratee(value) : value; + + while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) { + if (seen !== array) { + splice.call(seen, fromIndex, 1); + } + + splice.call(array, fromIndex, 1); + } } - return b ^ c ^ d; - } + return array; + } /** - * Determine the appropriate additive constant for the current iteration + * The base implementation of `_.pullAt` without support for individual + * indexes or capturing the removed elements. + * + * @private + * @param {Array} array The array to modify. + * @param {number[]} indexes The indexes of elements to remove. + * @returns {Array} Returns `array`. */ - function sha1_kt(t) { - return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : - (t < 60) ? -1894007588 : -899497514; + + function basePullAt(array, indexes) { + var length = array ? indexes.length : 0, + lastIndex = length - 1; + + while (length--) { + var index = indexes[length]; + + if (length == lastIndex || index !== previous) { + var previous = index; + + if (isIndex(index)) { + splice.call(array, index, 1); + } else { + baseUnset(array, index); + } + } + } + + return array; } - }, - /** - * @class Hashes.SHA256 - * @param {config} - * - * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2 - * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009. - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * See http://pajhome.org.uk/crypt/md5 for details. - * Also http://anmar.eu.org/projects/jssha2/ - */ - SHA256: function(options) { /** - * Private properties configuration variables. You may need to tweak these to be compatible with - * the server-side, but the defaults work in most cases. - * @see this.setUpperCase() method - * @see this.setPad() method + * The base implementation of `_.random` without support for returning + * floating-point numbers. + * + * @private + * @param {number} lower The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the random number. */ - var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase */ - b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', - /* base-64 pad character. Default '=' for strict RFC compliance */ - utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true, - /* enable/disable utf8 encoding */ - sha256_K; - /* privileged (public) methods */ - this.hex = function(s) { - return rstr2hex(rstr(s, utf8)); - }; - this.b64 = function(s) { - return rstr2b64(rstr(s, utf8), b64pad); - }; - this.any = function(s, e) { - return rstr2any(rstr(s, utf8), e); - }; - this.raw = function(s) { - return rstr(s, utf8); - }; - this.hex_hmac = function(k, d) { - return rstr2hex(rstr_hmac(k, d)); - }; - this.b64_hmac = function(k, d) { - return rstr2b64(rstr_hmac(k, d), b64pad); - }; - this.any_hmac = function(k, d, e) { - return rstr2any(rstr_hmac(k, d), e); - }; - /** - * Perform a simple self-test to see if the VM is working - * @return {String} Hexadecimal hash sample - * @public - */ - this.vm_test = function() { - return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72'; - }; + + function baseRandom(lower, upper) { + return lower + nativeFloor(nativeRandom() * (upper - lower + 1)); + } /** - * Enable/disable uppercase hexadecimal returned string - * @param {boolean} - * @return {Object} this - * @public + * The base implementation of `_.range` and `_.rangeRight` which doesn't + * coerce arguments. + * + * @private + * @param {number} start The start of the range. + * @param {number} end The end of the range. + * @param {number} step The value to increment or decrement by. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Array} Returns the range of numbers. */ - this.setUpperCase = function(a) { - if (typeof a === 'boolean') { - hexcase = a; + + + function baseRange(start, end, step, fromRight) { + var index = -1, + length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), + result = Array(length); + + while (length--) { + result[fromRight ? length : ++index] = start; + start += step; } - return this; - }; + + return result; + } /** - * @description Defines a base64 pad string - * @param {string} Pad - * @return {Object} this - * @public + * The base implementation of `_.repeat` which doesn't coerce arguments. + * + * @private + * @param {string} string The string to repeat. + * @param {number} n The number of times to repeat the string. + * @returns {string} Returns the repeated string. */ - this.setPad = function(a) { - b64pad = a || b64pad; - return this; - }; + + + function baseRepeat(string, n) { + var result = ''; + + if (!string || n < 1 || n > MAX_SAFE_INTEGER) { + return result; + } // Leverage the exponentiation by squaring algorithm for a faster repeat. + // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details. + + + do { + if (n % 2) { + result += string; + } + + n = nativeFloor(n / 2); + + if (n) { + string += string; + } + } while (n); + + return result; + } /** - * Defines a base64 pad string - * @param {boolean} - * @return {Object} this - * @public + * The base implementation of `_.rest` which doesn't validate or coerce arguments. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. */ - this.setUTF8 = function(a) { - if (typeof a === 'boolean') { - utf8 = a; - } - return this; - }; - // private methods + function baseRest(func, start) { + return setToString(overRest(func, start, identity), func + ''); + } /** - * Calculate the SHA-512 of a raw string + * The base implementation of `_.sample`. + * + * @private + * @param {Array|Object} collection The collection to sample. + * @returns {*} Returns the random element. */ - function rstr(s, utf8) { - s = (utf8) ? utf8Encode(s) : s; - return binb2rstr(binb(rstr2binb(s), s.length * 8)); + + function baseSample(collection) { + return arraySample(values(collection)); } + /** + * The base implementation of `_.sampleSize` without param guards. + * + * @private + * @param {Array|Object} collection The collection to sample. + * @param {number} n The number of elements to sample. + * @returns {Array} Returns the random elements. + */ + + function baseSampleSize(collection, n) { + var array = values(collection); + return shuffleSelf(array, baseClamp(n, 0, array.length)); + } /** - * Calculate the HMAC-sha256 of a key and some data (raw strings) + * The base implementation of `_.set`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @param {Function} [customizer] The function to customize path creation. + * @returns {Object} Returns `object`. */ - function rstr_hmac(key, data) { - key = (utf8) ? utf8Encode(key) : key; - data = (utf8) ? utf8Encode(data) : data; - var hash, i = 0, - bkey = rstr2binb(key), - ipad = Array(16), - opad = Array(16); - if (bkey.length > 16) { - bkey = binb(bkey, key.length * 8); + function baseSet(object, path, value, customizer) { + if (!isObject(object)) { + return object; } - for (; i < 16; i += 1) { - ipad[i] = bkey[i] ^ 0x36363636; - opad[i] = bkey[i] ^ 0x5C5C5C5C; + path = castPath(path, object); + var index = -1, + length = path.length, + lastIndex = length - 1, + nested = object; + + while (nested != null && ++index < length) { + var key = toKey(path[index]), + newValue = value; + + if (key === '__proto__' || key === 'constructor' || key === 'prototype') { + return object; + } + + if (index != lastIndex) { + var objValue = nested[key]; + newValue = customizer ? customizer(objValue, key, nested) : undefined$1; + + if (newValue === undefined$1) { + newValue = isObject(objValue) ? objValue : isIndex(path[index + 1]) ? [] : {}; + } + } + + assignValue(nested, key, newValue); + nested = nested[key]; } - hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8); - return binb2rstr(binb(opad.concat(hash), 512 + 256)); + return object; } + /** + * The base implementation of `setData` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to associate metadata with. + * @param {*} data The metadata. + * @returns {Function} Returns `func`. + */ + + + var baseSetData = !metaMap ? identity : function (func, data) { + metaMap.set(func, data); + return func; + }; + /** + * The base implementation of `setToString` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ - /* - * Main sha256 function, with its support functions + var baseSetToString = !defineProperty ? identity : function (func, string) { + return defineProperty(func, 'toString', { + 'configurable': true, + 'enumerable': false, + 'value': constant(string), + 'writable': true + }); + }; + /** + * The base implementation of `_.shuffle`. + * + * @private + * @param {Array|Object} collection The collection to shuffle. + * @returns {Array} Returns the new shuffled array. */ - function sha256_S(X, n) { - return (X >>> n) | (X << (32 - n)); + function baseShuffle(collection) { + return shuffleSelf(values(collection)); } + /** + * The base implementation of `_.slice` without an iteratee call guard. + * + * @private + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ - function sha256_R(X, n) { - return (X >>> n); - } - function sha256_Ch(x, y, z) { - return ((x & y) ^ ((~x) & z)); - } + function baseSlice(array, start, end) { + var index = -1, + length = array.length; - function sha256_Maj(x, y, z) { - return ((x & y) ^ (x & z) ^ (y & z)); - } + if (start < 0) { + start = -start > length ? 0 : length + start; + } - function sha256_Sigma0256(x) { - return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22)); - } + end = end > length ? length : end; - function sha256_Sigma1256(x) { - return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25)); - } + if (end < 0) { + end += length; + } + + length = start > end ? 0 : end - start >>> 0; + start >>>= 0; + var result = Array(length); + + while (++index < length) { + result[index] = array[index + start]; + } - function sha256_Gamma0256(x) { - return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3)); + return result; } + /** + * The base implementation of `_.some` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ - function sha256_Gamma1256(x) { - return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10)); + + function baseSome(collection, predicate) { + var result; + baseEach(collection, function (value, index, collection) { + result = predicate(value, index, collection); + return !result; + }); + return !!result; } + /** + * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which + * performs a binary search of `array` to determine the index at which `value` + * should be inserted into `array` in order to maintain its sort order. + * + * @private + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {boolean} [retHighest] Specify returning the highest qualified index. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + */ - sha256_K = [ - 1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987, - 1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522, - 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585, - 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, - 1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344, - 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, - 1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998 - ]; - function binb(m, l) { - var HASH = [1779033703, -1150833019, 1013904242, -1521486534, - 1359893119, -1694144372, 528734635, 1541459225 - ]; - var W = new Array(64); - var a, b, c, d, e, f, g, h; - var i, j, T1, T2; - - /* append padding */ - m[l >> 5] |= 0x80 << (24 - l % 32); - m[((l + 64 >> 9) << 4) + 15] = l; - - for (i = 0; i < m.length; i += 16) { - a = HASH[0]; - b = HASH[1]; - c = HASH[2]; - d = HASH[3]; - e = HASH[4]; - f = HASH[5]; - g = HASH[6]; - h = HASH[7]; - - for (j = 0; j < 64; j += 1) { - if (j < 16) { - W[j] = m[j + i]; + function baseSortedIndex(array, value, retHighest) { + var low = 0, + high = array == null ? low : array.length; + + if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) { + while (low < high) { + var mid = low + high >>> 1, + computed = array[mid]; + + if (computed !== null && !isSymbol(computed) && (retHighest ? computed <= value : computed < value)) { + low = mid + 1; } else { - W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]), - sha256_Gamma0256(W[j - 15])), W[j - 16]); + high = mid; } - - T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)), - sha256_K[j]), W[j]); - T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c)); - h = g; - g = f; - f = e; - e = safe_add(d, T1); - d = c; - c = b; - b = a; - a = safe_add(T1, T2); } - HASH[0] = safe_add(a, HASH[0]); - HASH[1] = safe_add(b, HASH[1]); - HASH[2] = safe_add(c, HASH[2]); - HASH[3] = safe_add(d, HASH[3]); - HASH[4] = safe_add(e, HASH[4]); - HASH[5] = safe_add(f, HASH[5]); - HASH[6] = safe_add(g, HASH[6]); - HASH[7] = safe_add(h, HASH[7]); + return high; } - return HASH; - } - - }, - /** - * @class Hashes.SHA512 - * @param {config} - * - * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2 - * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009. - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * See http://pajhome.org.uk/crypt/md5 for details. - */ - SHA512: function(options) { + return baseSortedIndexBy(array, value, identity, retHighest); + } /** - * Private properties configuration variables. You may need to tweak these to be compatible with - * the server-side, but the defaults work in most cases. - * @see this.setUpperCase() method - * @see this.setPad() method + * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy` + * which invokes `iteratee` for `value` and each element of `array` to compute + * their sort ranking. The iteratee is invoked with one argument; (value). + * + * @private + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} iteratee The iteratee invoked per element. + * @param {boolean} [retHighest] Specify returning the highest qualified index. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. */ - var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, - /* hexadecimal output case format. false - lowercase; true - uppercase */ - b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', - /* base-64 pad character. Default '=' for strict RFC compliance */ - utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true, - /* enable/disable utf8 encoding */ - sha512_k; - /* privileged (public) methods */ - this.hex = function(s) { - return rstr2hex(rstr(s)); - }; - this.b64 = function(s) { - return rstr2b64(rstr(s), b64pad); - }; - this.any = function(s, e) { - return rstr2any(rstr(s), e); - }; - this.raw = function(s) { - return rstr(s); - }; - this.hex_hmac = function(k, d) { - return rstr2hex(rstr_hmac(k, d)); - }; - this.b64_hmac = function(k, d) { - return rstr2b64(rstr_hmac(k, d), b64pad); - }; - this.any_hmac = function(k, d, e) { - return rstr2any(rstr_hmac(k, d), e); - }; - /** - * Perform a simple self-test to see if the VM is working - * @return {String} Hexadecimal hash sample - * @public - */ - this.vm_test = function() { - return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72'; - }; + + function baseSortedIndexBy(array, value, iteratee, retHighest) { + var low = 0, + high = array == null ? 0 : array.length; + + if (high === 0) { + return 0; + } + + value = iteratee(value); + var valIsNaN = value !== value, + valIsNull = value === null, + valIsSymbol = isSymbol(value), + valIsUndefined = value === undefined$1; + + while (low < high) { + var mid = nativeFloor((low + high) / 2), + computed = iteratee(array[mid]), + othIsDefined = computed !== undefined$1, + othIsNull = computed === null, + othIsReflexive = computed === computed, + othIsSymbol = isSymbol(computed); + + if (valIsNaN) { + var setLow = retHighest || othIsReflexive; + } else if (valIsUndefined) { + setLow = othIsReflexive && (retHighest || othIsDefined); + } else if (valIsNull) { + setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull); + } else if (valIsSymbol) { + setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol); + } else if (othIsNull || othIsSymbol) { + setLow = false; + } else { + setLow = retHighest ? computed <= value : computed < value; + } + + if (setLow) { + low = mid + 1; + } else { + high = mid; + } + } + + return nativeMin(high, MAX_ARRAY_INDEX); + } /** - * @description Enable/disable uppercase hexadecimal returned string - * @param {boolean} - * @return {Object} this - * @public + * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without + * support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. */ - this.setUpperCase = function(a) { - if (typeof a === 'boolean') { - hexcase = a; + + + function baseSortedUniq(array, iteratee) { + var index = -1, + length = array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + if (!index || !eq(computed, seen)) { + var seen = computed; + result[resIndex++] = value === 0 ? 0 : value; + } } - return this; - }; + + return result; + } /** - * @description Defines a base64 pad string - * @param {string} Pad - * @return {Object} this - * @public + * The base implementation of `_.toNumber` which doesn't ensure correct + * conversions of binary, hexadecimal, or octal string values. + * + * @private + * @param {*} value The value to process. + * @returns {number} Returns the number. */ - this.setPad = function(a) { - b64pad = a || b64pad; - return this; - }; + + + function baseToNumber(value) { + if (typeof value == 'number') { + return value; + } + + if (isSymbol(value)) { + return NAN; + } + + return +value; + } /** - * @description Defines a base64 pad string - * @param {boolean} - * @return {Object} this - * @public + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. */ - this.setUTF8 = function(a) { - if (typeof a === 'boolean') { - utf8 = a; + + + function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + + if (isArray(value)) { + // Recursively convert values (susceptible to call stack limits). + return arrayMap(value, baseToString) + ''; } - return this; - }; - /* private methods */ + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } + var result = value + ''; + return result == '0' && 1 / value == -INFINITY ? '-0' : result; + } /** - * Calculate the SHA-512 of a raw string + * The base implementation of `_.uniqBy` without support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new duplicate free array. */ - function rstr(s) { - s = (utf8) ? utf8Encode(s) : s; - return binb2rstr(binb(rstr2binb(s), s.length * 8)); - } - /* - * Calculate the HMAC-SHA-512 of a key and some data (raw strings) - */ - function rstr_hmac(key, data) { - key = (utf8) ? utf8Encode(key) : key; - data = (utf8) ? utf8Encode(data) : data; + function baseUniq(array, iteratee, comparator) { + var index = -1, + includes = arrayIncludes, + length = array.length, + isCommon = true, + result = [], + seen = result; + + if (comparator) { + isCommon = false; + includes = arrayIncludesWith; + } else if (length >= LARGE_ARRAY_SIZE) { + var set = iteratee ? null : createSet(array); - var hash, i = 0, - bkey = rstr2binb(key), - ipad = Array(32), - opad = Array(32); + if (set) { + return setToArray(set); + } - if (bkey.length > 32) { - bkey = binb(bkey, key.length * 8); + isCommon = false; + includes = cacheHas; + seen = new SetCache(); + } else { + seen = iteratee ? [] : result; } - for (; i < 32; i += 1) { - ipad[i] = bkey[i] ^ 0x36363636; - opad[i] = bkey[i] ^ 0x5C5C5C5C; + outer: while (++index < length) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + value = comparator || value !== 0 ? value : 0; + + if (isCommon && computed === computed) { + var seenIndex = seen.length; + + while (seenIndex--) { + if (seen[seenIndex] === computed) { + continue outer; + } + } + + if (iteratee) { + seen.push(computed); + } + + result.push(value); + } else if (!includes(seen, computed, comparator)) { + if (seen !== result) { + seen.push(computed); + } + + result.push(value); + } } - hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8); - return binb2rstr(binb(opad.concat(hash), 1024 + 512)); + return result; } - /** - * Calculate the SHA-512 of an array of big-endian dwords, and a bit length + * The base implementation of `_.unset`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The property path to unset. + * @returns {boolean} Returns `true` if the property is deleted, else `false`. */ - function binb(x, len) { - var j, i, l, - W = new Array(80), - hash = new Array(16), - //Initial hash values - H = [ - new int64(0x6a09e667, -205731576), - new int64(-1150833019, -2067093701), - new int64(0x3c6ef372, -23791573), - new int64(-1521486534, 0x5f1d36f1), - new int64(0x510e527f, -1377402159), - new int64(-1694144372, 0x2b3e6c1f), - new int64(0x1f83d9ab, -79577749), - new int64(0x5be0cd19, 0x137e2179) - ], - T1 = new int64(0, 0), - T2 = new int64(0, 0), - a = new int64(0, 0), - b = new int64(0, 0), - c = new int64(0, 0), - d = new int64(0, 0), - e = new int64(0, 0), - f = new int64(0, 0), - g = new int64(0, 0), - h = new int64(0, 0), - //Temporary variables not specified by the document - s0 = new int64(0, 0), - s1 = new int64(0, 0), - Ch = new int64(0, 0), - Maj = new int64(0, 0), - r1 = new int64(0, 0), - r2 = new int64(0, 0), - r3 = new int64(0, 0); - - if (sha512_k === undefined) { - //SHA512 constants - sha512_k = [ - new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd), - new int64(-1245643825, -330482897), new int64(-373957723, -2121671748), - new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031), - new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736), - new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe), - new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302), - new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1), - new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428), - new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3), - new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65), - new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483), - new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459), - new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210), - new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340), - new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395), - new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70), - new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926), - new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473), - new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8), - new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b), - new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023), - new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30), - new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910), - new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8), - new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53), - new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016), - new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893), - new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397), - new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60), - new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec), - new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047), - new int64(-1090935817, -1295615723), new int64(-965641998, -479046869), - new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207), - new int64(-354779690, -840897762), new int64(-176337025, -294727304), - new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026), - new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b), - new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493), - new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620), - new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430), - new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817) - ]; - } - - for (i = 0; i < 80; i += 1) { - W[i] = new int64(0, 0); - } - - // append padding to the source string. The format is described in the FIPS. - x[len >> 5] |= 0x80 << (24 - (len & 0x1f)); - x[((len + 128 >> 10) << 5) + 31] = len; - l = x.length; - for (i = 0; i < l; i += 32) { //32 dwords is the block size - int64copy(a, H[0]); - int64copy(b, H[1]); - int64copy(c, H[2]); - int64copy(d, H[3]); - int64copy(e, H[4]); - int64copy(f, H[5]); - int64copy(g, H[6]); - int64copy(h, H[7]); - - for (j = 0; j < 16; j += 1) { - W[j].h = x[i + 2 * j]; - W[j].l = x[i + 2 * j + 1]; - } - - for (j = 16; j < 80; j += 1) { - //sigma1 - int64rrot(r1, W[j - 2], 19); - int64revrrot(r2, W[j - 2], 29); - int64shr(r3, W[j - 2], 6); - s1.l = r1.l ^ r2.l ^ r3.l; - s1.h = r1.h ^ r2.h ^ r3.h; - //sigma0 - int64rrot(r1, W[j - 15], 1); - int64rrot(r2, W[j - 15], 8); - int64shr(r3, W[j - 15], 7); - s0.l = r1.l ^ r2.l ^ r3.l; - s0.h = r1.h ^ r2.h ^ r3.h; - - int64add4(W[j], s1, W[j - 7], s0, W[j - 16]); - } - - for (j = 0; j < 80; j += 1) { - //Ch - Ch.l = (e.l & f.l) ^ (~e.l & g.l); - Ch.h = (e.h & f.h) ^ (~e.h & g.h); - - //Sigma1 - int64rrot(r1, e, 14); - int64rrot(r2, e, 18); - int64revrrot(r3, e, 9); - s1.l = r1.l ^ r2.l ^ r3.l; - s1.h = r1.h ^ r2.h ^ r3.h; - - //Sigma0 - int64rrot(r1, a, 28); - int64revrrot(r2, a, 2); - int64revrrot(r3, a, 7); - s0.l = r1.l ^ r2.l ^ r3.l; - s0.h = r1.h ^ r2.h ^ r3.h; - - //Maj - Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l); - Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h); - - int64add5(T1, h, s1, Ch, sha512_k[j], W[j]); - int64add(T2, s0, Maj); - - int64copy(h, g); - int64copy(g, f); - int64copy(f, e); - int64add(e, d, T1); - int64copy(d, c); - int64copy(c, b); - int64copy(b, a); - int64add(a, T1, T2); - } - int64add(H[0], H[0], a); - int64add(H[1], H[1], b); - int64add(H[2], H[2], c); - int64add(H[3], H[3], d); - int64add(H[4], H[4], e); - int64add(H[5], H[5], f); - int64add(H[6], H[6], g); - int64add(H[7], H[7], h); - } - - //represent the hash as an array of 32-bit dwords - for (i = 0; i < 8; i += 1) { - hash[2 * i] = H[i].h; - hash[2 * i + 1] = H[i].l; - } - return hash; + + function baseUnset(object, path) { + path = castPath(path, object); + object = parent(object, path); + return object == null || delete object[toKey(last(path))]; } + /** + * The base implementation of `_.update`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to update. + * @param {Function} updater The function to produce the updated value. + * @param {Function} [customizer] The function to customize path creation. + * @returns {Object} Returns `object`. + */ - //A constructor for 64-bit numbers - function int64(h, l) { - this.h = h; - this.l = l; - //this.toString = int64toString; + function baseUpdate(object, path, updater, customizer) { + return baseSet(object, path, updater(baseGet(object, path)), customizer); } + /** + * The base implementation of methods like `_.dropWhile` and `_.takeWhile` + * without support for iteratee shorthands. + * + * @private + * @param {Array} array The array to query. + * @param {Function} predicate The function invoked per iteration. + * @param {boolean} [isDrop] Specify dropping elements instead of taking them. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Array} Returns the slice of `array`. + */ - //Copies src into dst, assuming both are 64-bit numbers - function int64copy(dst, src) { - dst.h = src.h; - dst.l = src.l; - } + function baseWhile(array, predicate, isDrop, fromRight) { + var length = array.length, + index = fromRight ? length : -1; - //Right-rotates a 64-bit number by shift - //Won't handle cases of shift>=32 - //The function revrrot() is for that + while ((fromRight ? index-- : ++index < length) && predicate(array[index], index, array)) {} - function int64rrot(dst, x, shift) { - dst.l = (x.l >>> shift) | (x.h << (32 - shift)); - dst.h = (x.h >>> shift) | (x.l << (32 - shift)); + return isDrop ? baseSlice(array, fromRight ? 0 : index, fromRight ? index + 1 : length) : baseSlice(array, fromRight ? index + 1 : 0, fromRight ? length : index); } + /** + * The base implementation of `wrapperValue` which returns the result of + * performing a sequence of actions on the unwrapped `value`, where each + * successive action is supplied the return value of the previous. + * + * @private + * @param {*} value The unwrapped value. + * @param {Array} actions Actions to perform to resolve the unwrapped value. + * @returns {*} Returns the resolved value. + */ - //Reverses the dwords of the source and then rotates right by shift. - //This is equivalent to rotation by 32+shift - function int64revrrot(dst, x, shift) { - dst.l = (x.h >>> shift) | (x.l << (32 - shift)); - dst.h = (x.l >>> shift) | (x.h << (32 - shift)); - } + function baseWrapperValue(value, actions) { + var result = value; - //Bitwise-shifts right a 64-bit number by shift - //Won't handle shift>=32, but it's never needed in SHA512 + if (result instanceof LazyWrapper) { + result = result.value(); + } - function int64shr(dst, x, shift) { - dst.l = (x.l >>> shift) | (x.h << (32 - shift)); - dst.h = (x.h >>> shift); + return arrayReduce(actions, function (result, action) { + return action.func.apply(action.thisArg, arrayPush([result], action.args)); + }, result); } + /** + * The base implementation of methods like `_.xor`, without support for + * iteratee shorthands, that accepts an array of arrays to inspect. + * + * @private + * @param {Array} arrays The arrays to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of values. + */ - //Adds two 64-bit numbers - //Like the original implementation, does not rely on 32-bit operations - function int64add(dst, x, y) { - var w0 = (x.l & 0xffff) + (y.l & 0xffff); - var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16); - var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16); - var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16); - dst.l = (w0 & 0xffff) | (w1 << 16); - dst.h = (w2 & 0xffff) | (w3 << 16); - } + function baseXor(arrays, iteratee, comparator) { + var length = arrays.length; - //Same, except with 4 addends. Works faster than adding them one by one. + if (length < 2) { + return length ? baseUniq(arrays[0]) : []; + } - function int64add4(dst, a, b, c, d) { - var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff); - var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16); - var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16); - var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16); - dst.l = (w0 & 0xffff) | (w1 << 16); - dst.h = (w2 & 0xffff) | (w3 << 16); - } + var index = -1, + result = Array(length); - //Same, except with 5 addends + while (++index < length) { + var array = arrays[index], + othIndex = -1; - function int64add5(dst, a, b, c, d, e) { - var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff), - w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16), - w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16), - w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16); - dst.l = (w0 & 0xffff) | (w1 << 16); - dst.h = (w2 & 0xffff) | (w3 << 16); + while (++othIndex < length) { + if (othIndex != index) { + result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator); + } + } + } + + return baseUniq(baseFlatten(result, 1), iteratee, comparator); } - }, - /** - * @class Hashes.RMD160 - * @constructor - * @param {Object} [config] - * - * A JavaScript implementation of the RIPEMD-160 Algorithm - * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009. - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * See http://pajhome.org.uk/crypt/md5 for details. - * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/ - */ - RMD160: function(options) { /** - * Private properties configuration variables. You may need to tweak these to be compatible with - * the server-side, but the defaults work in most cases. - * @see this.setUpperCase() method - * @see this.setPad() method + * This base implementation of `_.zipObject` which assigns values using `assignFunc`. + * + * @private + * @param {Array} props The property identifiers. + * @param {Array} values The property values. + * @param {Function} assignFunc The function to assign values. + * @returns {Object} Returns the new object. */ - var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, - /* hexadecimal output case format. false - lowercase; true - uppercase */ - b64pad = (options && typeof options.pad === 'string') ? options.pa : '=', - /* base-64 pad character. Default '=' for strict RFC compliance */ - utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true, - /* enable/disable utf8 encoding */ - rmd160_r1 = [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, - 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, - 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, - 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 - ], - rmd160_r2 = [ - 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, - 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, - 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, - 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, - 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 - ], - rmd160_s1 = [ - 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, - 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, - 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, - 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, - 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 - ], - rmd160_s2 = [ - 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, - 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, - 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, - 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, - 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 - ]; - /* privileged (public) methods */ - this.hex = function(s) { - return rstr2hex(rstr(s)); - }; - this.b64 = function(s) { - return rstr2b64(rstr(s), b64pad); - }; - this.any = function(s, e) { - return rstr2any(rstr(s), e); - }; - this.raw = function(s) { - return rstr(s); - }; - this.hex_hmac = function(k, d) { - return rstr2hex(rstr_hmac(k, d)); - }; - this.b64_hmac = function(k, d) { - return rstr2b64(rstr_hmac(k, d), b64pad); - }; - this.any_hmac = function(k, d, e) { - return rstr2any(rstr_hmac(k, d), e); - }; + + function baseZipObject(props, values, assignFunc) { + var index = -1, + length = props.length, + valsLength = values.length, + result = {}; + + while (++index < length) { + var value = index < valsLength ? values[index] : undefined$1; + assignFunc(result, props[index], value); + } + + return result; + } /** - * Perform a simple self-test to see if the VM is working - * @return {String} Hexadecimal hash sample - * @public + * Casts `value` to an empty array if it's not an array like object. + * + * @private + * @param {*} value The value to inspect. + * @returns {Array|Object} Returns the cast array-like object. */ - this.vm_test = function() { - return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72'; - }; + + + function castArrayLikeObject(value) { + return isArrayLikeObject(value) ? value : []; + } /** - * @description Enable/disable uppercase hexadecimal returned string - * @param {boolean} - * @return {Object} this - * @public + * Casts `value` to `identity` if it's not a function. + * + * @private + * @param {*} value The value to inspect. + * @returns {Function} Returns cast function. */ - this.setUpperCase = function(a) { - if (typeof a === 'boolean') { - hexcase = a; - } - return this; - }; + + + function castFunction(value) { + return typeof value == 'function' ? value : identity; + } /** - * @description Defines a base64 pad string - * @param {string} Pad - * @return {Object} this - * @public + * Casts `value` to a path array if it's not one. + * + * @private + * @param {*} value The value to inspect. + * @param {Object} [object] The object to query keys on. + * @returns {Array} Returns the cast property path array. */ - this.setPad = function(a) { - if (typeof a !== 'undefined') { - b64pad = a; + + + function castPath(value, object) { + if (isArray(value)) { + return value; } - return this; - }; + + return isKey(value, object) ? [value] : stringToPath(toString(value)); + } /** - * @description Defines a base64 pad string - * @param {boolean} - * @return {Object} this - * @public + * A `baseRest` alias which can be replaced with `identity` by module + * replacement plugins. + * + * @private + * @type {Function} + * @param {Function} func The function to apply a rest parameter to. + * @returns {Function} Returns the new function. */ - this.setUTF8 = function(a) { - if (typeof a === 'boolean') { - utf8 = a; - } - return this; - }; - /* private methods */ + var castRest = baseRest; /** - * Calculate the rmd160 of a raw string + * Casts `array` to a slice if it's needed. + * + * @private + * @param {Array} array The array to inspect. + * @param {number} start The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the cast slice. */ - function rstr(s) { - s = (utf8) ? utf8Encode(s) : s; - return binl2rstr(binl(rstr2binl(s), s.length * 8)); + function castSlice(array, start, end) { + var length = array.length; + end = end === undefined$1 ? length : end; + return !start && end >= length ? array : baseSlice(array, start, end); } + /** + * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout). + * + * @private + * @param {number|Object} id The timer id or timeout object of the timer to clear. + */ + + var clearTimeout = ctxClearTimeout || function (id) { + return root.clearTimeout(id); + }; /** - * Calculate the HMAC-rmd160 of a key and some data (raw strings) + * Creates a clone of `buffer`. + * + * @private + * @param {Buffer} buffer The buffer to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Buffer} Returns the cloned buffer. */ - function rstr_hmac(key, data) { - key = (utf8) ? utf8Encode(key) : key; - data = (utf8) ? utf8Encode(data) : data; - var i, hash, - bkey = rstr2binl(key), - ipad = Array(16), - opad = Array(16); - if (bkey.length > 16) { - bkey = binl(bkey, key.length * 8); + function cloneBuffer(buffer, isDeep) { + if (isDeep) { + return buffer.slice(); } - for (i = 0; i < 16; i += 1) { - ipad[i] = bkey[i] ^ 0x36363636; - opad[i] = bkey[i] ^ 0x5C5C5C5C; - } - hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8); - return binl2rstr(binl(opad.concat(hash), 512 + 160)); + var length = buffer.length, + result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); + buffer.copy(result); + return result; } - /** - * Convert an array of little-endian words to a string + * Creates a clone of `arrayBuffer`. + * + * @private + * @param {ArrayBuffer} arrayBuffer The array buffer to clone. + * @returns {ArrayBuffer} Returns the cloned array buffer. */ - function binl2rstr(input) { - var i, output = '', - l = input.length * 32; - for (i = 0; i < l; i += 8) { - output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF); - } - return output; - } - - /** - * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length. - */ - - function binl(x, len) { - var T, j, i, l, - h0 = 0x67452301, - h1 = 0xefcdab89, - h2 = 0x98badcfe, - h3 = 0x10325476, - h4 = 0xc3d2e1f0, - A1, B1, C1, D1, E1, - A2, B2, C2, D2, E2; - - /* append padding */ - x[len >> 5] |= 0x80 << (len % 32); - x[(((len + 64) >>> 9) << 4) + 14] = len; - l = x.length; - - for (i = 0; i < l; i += 16) { - A1 = A2 = h0; - B1 = B2 = h1; - C1 = C2 = h2; - D1 = D2 = h3; - E1 = E2 = h4; - for (j = 0; j <= 79; j += 1) { - T = safe_add(A1, rmd160_f(j, B1, C1, D1)); - T = safe_add(T, x[i + rmd160_r1[j]]); - T = safe_add(T, rmd160_K1(j)); - T = safe_add(bit_rol(T, rmd160_s1[j]), E1); - A1 = E1; - E1 = D1; - D1 = bit_rol(C1, 10); - C1 = B1; - B1 = T; - T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2)); - T = safe_add(T, x[i + rmd160_r2[j]]); - T = safe_add(T, rmd160_K2(j)); - T = safe_add(bit_rol(T, rmd160_s2[j]), E2); - A2 = E2; - E2 = D2; - D2 = bit_rol(C2, 10); - C2 = B2; - B2 = T; - } - - T = safe_add(h1, safe_add(C1, D2)); - h1 = safe_add(h2, safe_add(D1, E2)); - h2 = safe_add(h3, safe_add(E1, A2)); - h3 = safe_add(h4, safe_add(A1, B2)); - h4 = safe_add(h0, safe_add(B1, C2)); - h0 = T; - } - return [h0, h1, h2, h3, h4]; - } - - // specific algorithm methods - - function rmd160_f(j, x, y, z) { - return (0 <= j && j <= 15) ? (x ^ y ^ z) : - (16 <= j && j <= 31) ? (x & y) | (~x & z) : - (32 <= j && j <= 47) ? (x | ~y) ^ z : - (48 <= j && j <= 63) ? (x & z) | (y & ~z) : - (64 <= j && j <= 79) ? x ^ (y | ~z) : - 'rmd160_f: j out of range'; - } - - function rmd160_K1(j) { - return (0 <= j && j <= 15) ? 0x00000000 : - (16 <= j && j <= 31) ? 0x5a827999 : - (32 <= j && j <= 47) ? 0x6ed9eba1 : - (48 <= j && j <= 63) ? 0x8f1bbcdc : - (64 <= j && j <= 79) ? 0xa953fd4e : - 'rmd160_K1: j out of range'; - } - - function rmd160_K2(j) { - return (0 <= j && j <= 15) ? 0x50a28be6 : - (16 <= j && j <= 31) ? 0x5c4dd124 : - (32 <= j && j <= 47) ? 0x6d703ef3 : - (48 <= j && j <= 63) ? 0x7a6d76e9 : - (64 <= j && j <= 79) ? 0x00000000 : - 'rmd160_K2: j out of range'; - } - } - }; - - // exposes Hashes - (function(window, undefined$1) { - var freeExports = false; - { - freeExports = exports; - if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) { - window = commonjsGlobal; - } - } - if (typeof undefined$1 === 'function' && typeof undefined$1.amd === 'object' && undefined$1.amd) { - // define as an anonymous module, so, through path mapping, it can be aliased - undefined$1(function() { - return Hashes; - }); - } else if (freeExports) { - // in Node.js or RingoJS v0.8.0+ - if ( module && module.exports === freeExports) { - module.exports = Hashes; - } - // in Narwhal or RingoJS v0.7.0- - else { - freeExports.Hashes = Hashes; + function cloneArrayBuffer(arrayBuffer) { + var result = new arrayBuffer.constructor(arrayBuffer.byteLength); + new Uint8Array(result).set(new Uint8Array(arrayBuffer)); + return result; } - } else { - // in a browser or Rhino - window.Hashes = Hashes; - } - }(this)); - }()); // IIFE - }); + /** + * Creates a clone of `dataView`. + * + * @private + * @param {Object} dataView The data view to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned data view. + */ - var immutable = extend$2; - var hasOwnProperty$3 = Object.prototype.hasOwnProperty; + function cloneDataView(dataView, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer; + return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); + } + /** + * Creates a clone of `regexp`. + * + * @private + * @param {Object} regexp The regexp to clone. + * @returns {Object} Returns the cloned regexp. + */ - function extend$2() { - var arguments$1 = arguments; - var target = {}; + function cloneRegExp(regexp) { + var result = new regexp.constructor(regexp.source, reFlags.exec(regexp)); + result.lastIndex = regexp.lastIndex; + return result; + } + /** + * Creates a clone of the `symbol` object. + * + * @private + * @param {Object} symbol The symbol object to clone. + * @returns {Object} Returns the cloned symbol object. + */ - for (var i = 0; i < arguments.length; i++) { - var source = arguments$1[i]; - for (var key in source) { - if (hasOwnProperty$3.call(source, key)) { - target[key] = source[key]; - } - } - } + function cloneSymbol(symbol) { + return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {}; + } + /** + * Creates a clone of `typedArray`. + * + * @private + * @param {Object} typedArray The typed array to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned typed array. + */ - return target - } - var sha1 = new hashes.SHA1(); + function cloneTypedArray(typedArray, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; + return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); + } + /** + * Compares values to sort them in ascending order. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {number} Returns the sort order indicator for `value`. + */ - var ohauth = {}; - ohauth.qsString = function(obj) { - return Object.keys(obj).sort().map(function(key) { - return ohauth.percentEncode(key) + '=' + - ohauth.percentEncode(obj[key]); - }).join('&'); - }; + function compareAscending(value, other) { + if (value !== other) { + var valIsDefined = value !== undefined$1, + valIsNull = value === null, + valIsReflexive = value === value, + valIsSymbol = isSymbol(value); + var othIsDefined = other !== undefined$1, + othIsNull = other === null, + othIsReflexive = other === other, + othIsSymbol = isSymbol(other); - ohauth.stringQs = function(str) { - return str.split('&').filter(function (pair) { - return pair !== ''; - }).reduce(function(obj, pair){ - var parts = pair.split('='); - obj[decodeURIComponent(parts[0])] = (null === parts[1]) ? - '' : decodeURIComponent(parts[1]); - return obj; - }, {}); - }; + if (!othIsNull && !othIsSymbol && !valIsSymbol && value > other || valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol || valIsNull && othIsDefined && othIsReflexive || !valIsDefined && othIsReflexive || !valIsReflexive) { + return 1; + } - ohauth.rawxhr = function(method, url, data, headers, callback) { - var xhr = new XMLHttpRequest(), - twoHundred = /^20\d$/; - xhr.onreadystatechange = function() { - if (4 === xhr.readyState && 0 !== xhr.status) { - if (twoHundred.test(xhr.status)) { callback(null, xhr); } - else { return callback(xhr, null); } + if (!valIsNull && !valIsSymbol && !othIsSymbol && value < other || othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol || othIsNull && valIsDefined && valIsReflexive || !othIsDefined && valIsReflexive || !othIsReflexive) { + return -1; + } } - }; - xhr.onerror = function(e) { return callback(e, null); }; - xhr.open(method, url, true); - for (var h in headers) { xhr.setRequestHeader(h, headers[h]); } - xhr.send(data); - return xhr; - }; - - ohauth.xhr = function(method, url, auth, data, options, callback) { - var headers = (options && options.header) || { - 'Content-Type': 'application/x-www-form-urlencoded' - }; - headers.Authorization = 'OAuth ' + ohauth.authHeader(auth); - return ohauth.rawxhr(method, url, data, headers, callback); - }; - ohauth.nonce = function() { - for (var o = ''; o.length < 6;) { - o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)]; - } - return o; - }; - - ohauth.authHeader = function(obj) { - return Object.keys(obj).sort().map(function(key) { - return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"'; - }).join(', '); - }; - - ohauth.timestamp = function() { return ~~((+new Date()) / 1000); }; + return 0; + } + /** + * Used by `_.orderBy` to compare multiple properties of a value to another + * and stable sort them. + * + * If `orders` is unspecified, all values are sorted in ascending order. Otherwise, + * specify an order of "desc" for descending or "asc" for ascending sort order + * of corresponding values. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {boolean[]|string[]} orders The order to sort by for each property. + * @returns {number} Returns the sort order indicator for `object`. + */ - ohauth.percentEncode = function(s) { - return encodeURIComponent(s) - .replace(/\!/g, '%21').replace(/\'/g, '%27') - .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29'); - }; - ohauth.baseString = function(method, url, params) { - if (params.oauth_signature) { delete params.oauth_signature; } - return [ - method, - ohauth.percentEncode(url), - ohauth.percentEncode(ohauth.qsString(params))].join('&'); - }; + function compareMultiple(object, other, orders) { + var index = -1, + objCriteria = object.criteria, + othCriteria = other.criteria, + length = objCriteria.length, + ordersLength = orders.length; - ohauth.signature = function(oauth_secret, token_secret, baseString) { - return sha1.b64_hmac( - ohauth.percentEncode(oauth_secret) + '&' + - ohauth.percentEncode(token_secret), - baseString); - }; + while (++index < length) { + var result = compareAscending(objCriteria[index], othCriteria[index]); - /** - * Takes an options object for configuration (consumer_key, - * consumer_secret, version, signature_method, token, token_secret) - * and returns a function that generates the Authorization header - * for given data. - * - * The returned function takes these parameters: - * - method: GET/POST/... - * - uri: full URI with protocol, port, path and query string - * - extra_params: any extra parameters (that are passed in the POST data), - * can be an object or a from-urlencoded string. - * - * Returned function returns full OAuth header with "OAuth" string in it. - */ + if (result) { + if (index >= ordersLength) { + return result; + } - ohauth.headerGenerator = function(options) { - options = options || {}; - var consumer_key = options.consumer_key || '', - consumer_secret = options.consumer_secret || '', - signature_method = options.signature_method || 'HMAC-SHA1', - version = options.version || '1.0', - token = options.token || '', - token_secret = options.token_secret || ''; + var order = orders[index]; + return result * (order == 'desc' ? -1 : 1); + } + } // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications + // that causes it, under certain circumstances, to provide the same value for + // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247 + // for more details. + // + // This also ensures a stable sort in V8 and other engines. + // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details. - return function(method, uri, extra_params) { - method = method.toUpperCase(); - if (typeof extra_params === 'string' && extra_params.length > 0) { - extra_params = ohauth.stringQs(extra_params); - } - var uri_parts = uri.split('?', 2), - base_uri = uri_parts[0]; + return object.index - other.index; + } + /** + * Creates an array that is the composition of partially applied arguments, + * placeholders, and provided arguments into a single array of arguments. + * + * @private + * @param {Array} args The provided arguments. + * @param {Array} partials The arguments to prepend to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. + * @returns {Array} Returns the new array of composed arguments. + */ - var query_params = uri_parts.length === 2 ? - ohauth.stringQs(uri_parts[1]) : {}; - var oauth_params = { - oauth_consumer_key: consumer_key, - oauth_signature_method: signature_method, - oauth_version: version, - oauth_timestamp: ohauth.timestamp(), - oauth_nonce: ohauth.nonce() - }; + function composeArgs(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersLength = holders.length, + leftIndex = -1, + leftLength = partials.length, + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(leftLength + rangeLength), + isUncurried = !isCurried; - if (token) { oauth_params.oauth_token = token; } + while (++leftIndex < leftLength) { + result[leftIndex] = partials[leftIndex]; + } - var all_params = immutable({}, oauth_params, query_params, extra_params), - base_str = ohauth.baseString(method, base_uri, all_params); + while (++argsIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result[holders[argsIndex]] = args[argsIndex]; + } + } - oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str); + while (rangeLength--) { + result[leftIndex++] = args[argsIndex++]; + } - return 'OAuth ' + ohauth.authHeader(oauth_params); - }; - }; + return result; + } + /** + * This function is like `composeArgs` except that the arguments composition + * is tailored for `_.partialRight`. + * + * @private + * @param {Array} args The provided arguments. + * @param {Array} partials The arguments to append to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. + * @returns {Array} Returns the new array of composed arguments. + */ - var ohauth_1 = ohauth; - var resolveUrl$1 = createCommonjsModule(function (module, exports) { - // Copyright 2014 Simon Lydell - // X11 (“MIT”) Licensed. (See LICENSE.) + function composeArgsRight(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersIndex = -1, + holdersLength = holders.length, + rightIndex = -1, + rightLength = partials.length, + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(rangeLength + rightLength), + isUncurried = !isCurried; - void (function(root, factory) { - { - module.exports = factory(); - } - }(commonjsGlobal, function() { + while (++argsIndex < rangeLength) { + result[argsIndex] = args[argsIndex]; + } - function resolveUrl(/* ...urls */) { - var arguments$1 = arguments; + var offset = argsIndex; - var numUrls = arguments.length; + while (++rightIndex < rightLength) { + result[offset + rightIndex] = partials[rightIndex]; + } - if (numUrls === 0) { - throw new Error("resolveUrl requires at least one argument; got none.") - } + while (++holdersIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result[offset + holders[holdersIndex]] = args[argsIndex++]; + } + } - var base = document.createElement("base"); - base.href = arguments[0]; + return result; + } + /** + * Copies the values of `source` to `array`. + * + * @private + * @param {Array} source The array to copy values from. + * @param {Array} [array=[]] The array to copy values to. + * @returns {Array} Returns `array`. + */ - if (numUrls === 1) { - return base.href - } - var head = document.getElementsByTagName("head")[0]; - head.insertBefore(base, head.firstChild); + function copyArray(source, array) { + var index = -1, + length = source.length; + array || (array = Array(length)); - var a = document.createElement("a"); - var resolved; + while (++index < length) { + array[index] = source[index]; + } - for (var index = 1; index < numUrls; index++) { - a.href = arguments$1[index]; - resolved = a.href; - base.href = resolved; - } + return array; + } + /** + * Copies properties of `source` to `object`. + * + * @private + * @param {Object} source The object to copy properties from. + * @param {Array} props The property identifiers to copy. + * @param {Object} [object={}] The object to copy properties to. + * @param {Function} [customizer] The function to customize copied values. + * @returns {Object} Returns `object`. + */ - head.removeChild(base); - return resolved - } + function copyObject(source, props, object, customizer) { + var isNew = !object; + object || (object = {}); + var index = -1, + length = props.length; - return resolveUrl + while (++index < length) { + var key = props[index]; + var newValue = customizer ? customizer(object[key], source[key], key, object, source) : undefined$1; - })); - }); + if (newValue === undefined$1) { + newValue = source[key]; + } - var assign$1 = make_assign(); - var create$8 = make_create(); - var trim = make_trim(); - var Global = (typeof window !== 'undefined' ? window : commonjsGlobal); - - var util = { - assign: assign$1, - create: create$8, - trim: trim, - bind: bind$3, - slice: slice$5, - each: each, - map: map$5, - pluck: pluck, - isList: isList, - isFunction: isFunction$2, - isObject: isObject$2, - Global: Global - }; + if (isNew) { + baseAssignValue(object, key, newValue); + } else { + assignValue(object, key, newValue); + } + } - function make_assign() { - if (Object.assign) { - return Object.assign - } else { - return function shimAssign(obj, props1, props2, etc) { - var arguments$1 = arguments; - - for (var i = 1; i < arguments.length; i++) { - each(Object(arguments$1[i]), function(val, key) { - obj[key] = val; - }); - } - return obj - } - } - } + return object; + } + /** + * Copies own symbols of `source` to `object`. + * + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. + */ - function make_create() { - if (Object.create) { - return function create(obj, assignProps1, assignProps2, etc) { - var assignArgsList = slice$5(arguments, 1); - return assign$1.apply(this, [Object.create(obj)].concat(assignArgsList)) - } - } else { - function F() {} // eslint-disable-line no-inner-declarations - return function create(obj, assignProps1, assignProps2, etc) { - var assignArgsList = slice$5(arguments, 1); - F.prototype = obj; - return assign$1.apply(this, [new F()].concat(assignArgsList)) - } - } - } - function make_trim() { - if (String.prototype.trim) { - return function trim(str) { - return String.prototype.trim.call(str) - } - } else { - return function trim(str) { - return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '') - } - } - } + function copySymbols(source, object) { + return copyObject(source, getSymbols(source), object); + } + /** + * Copies own and inherited symbols of `source` to `object`. + * + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. + */ - function bind$3(obj, fn) { - return function() { - return fn.apply(obj, Array.prototype.slice.call(arguments, 0)) - } - } - function slice$5(arr, index) { - return Array.prototype.slice.call(arr, index || 0) - } + function copySymbolsIn(source, object) { + return copyObject(source, getSymbolsIn(source), object); + } + /** + * Creates a function like `_.groupBy`. + * + * @private + * @param {Function} setter The function to set accumulator values. + * @param {Function} [initializer] The accumulator object initializer. + * @returns {Function} Returns the new aggregator function. + */ - function each(obj, fn) { - pluck(obj, function(val, key) { - fn(val, key); - return false - }); - } - function map$5(obj, fn) { - var res = (isList(obj) ? [] : {}); - pluck(obj, function(v, k) { - res[k] = fn(v, k); - return false - }); - return res - } + function createAggregator(setter, initializer) { + return function (collection, iteratee) { + var func = isArray(collection) ? arrayAggregator : baseAggregator, + accumulator = initializer ? initializer() : {}; + return func(collection, setter, getIteratee(iteratee, 2), accumulator); + }; + } + /** + * Creates a function like `_.assign`. + * + * @private + * @param {Function} assigner The function to assign values. + * @returns {Function} Returns the new assigner function. + */ - function pluck(obj, fn) { - if (isList(obj)) { - for (var i=0; i 1 ? sources[length - 1] : undefined$1, + guard = length > 2 ? sources[2] : undefined$1; + customizer = assigner.length > 3 && typeof customizer == 'function' ? (length--, customizer) : undefined$1; - function isFunction$2(val) { - return val && {}.toString.call(val) === '[object Function]' - } + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined$1 : customizer; + length = 1; + } - function isObject$2(val) { - return val && {}.toString.call(val) === '[object Object]' - } + object = Object(object); - var slice$6 = util.slice; - var pluck$1 = util.pluck; - var each$1 = util.each; - var bind$4 = util.bind; - var create$9 = util.create; - var isList$1 = util.isList; - var isFunction$3 = util.isFunction; - var isObject$3 = util.isObject; + while (++index < length) { + var source = sources[index]; - var storeEngine = { - createStore: createStore - }; + if (source) { + assigner(object, source, index, customizer); + } + } - var storeAPI = { - version: '2.0.12', - enabled: false, - - // get returns the value of the given key. If that value - // is undefined, it returns optionalDefaultValue instead. - get: function(key, optionalDefaultValue) { - var data = this.storage.read(this._namespacePrefix + key); - return this._deserialize(data, optionalDefaultValue) - }, - - // set will store the given value at key and returns value. - // Calling set with value === undefined is equivalent to calling remove. - set: function(key, value) { - if (value === undefined) { - return this.remove(key) - } - this.storage.write(this._namespacePrefix + key, this._serialize(value)); - return value - }, - - // remove deletes the key and value stored at the given key. - remove: function(key) { - this.storage.remove(this._namespacePrefix + key); - }, - - // each will call the given callback once for each key-value pair - // in this store. - each: function(callback) { - var self = this; - this.storage.each(function(val, namespacedKey) { - callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, '')); - }); - }, - - // clearAll will remove all the stored key-value pairs in this store. - clearAll: function() { - this.storage.clearAll(); - }, - - // additional functionality that can't live in plugins - // --------------------------------------------------- - - // hasNamespace returns true if this store instance has the given namespace. - hasNamespace: function(namespace) { - return (this._namespacePrefix == '__storejs_'+namespace+'_') - }, - - // createStore creates a store.js instance with the first - // functioning storage in the list of storage candidates, - // and applies the the given mixins to the instance. - createStore: function() { - return createStore.apply(this, arguments) - }, - - addPlugin: function(plugin) { - this._addPlugin(plugin); - }, - - namespace: function(namespace) { - return createStore(this.storage, this.plugins, namespace) - } - }; + return object; + }); + } + /** + * Creates a `baseEach` or `baseEachRight` function. + * + * @private + * @param {Function} eachFunc The function to iterate over a collection. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ - function _warn() { - var _console = (typeof console == 'undefined' ? null : console); - if (!_console) { return } - var fn = (_console.warn ? _console.warn : _console.log); - fn.apply(_console, arguments); - } - - function createStore(storages, plugins, namespace) { - if (!namespace) { - namespace = ''; - } - if (storages && !isList$1(storages)) { - storages = [storages]; - } - if (plugins && !isList$1(plugins)) { - plugins = [plugins]; - } - - var namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : ''); - var namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null); - var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash - if (!legalNamespaces.test(namespace)) { - throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes') - } - - var _privateStoreProps = { - _namespacePrefix: namespacePrefix, - _namespaceRegexp: namespaceRegexp, - - _testStorage: function(storage) { - try { - var testStr = '__storejs__test__'; - storage.write(testStr, testStr); - var ok = (storage.read(testStr) === testStr); - storage.remove(testStr); - return ok - } catch(e) { - return false - } - }, - - _assignPluginFnProp: function(pluginFnProp, propName) { - var oldFn = this[propName]; - this[propName] = function pluginFn() { - var args = slice$6(arguments, 0); - var self = this; - - // super_fn calls the old function which was overwritten by - // this mixin. - function super_fn() { - if (!oldFn) { return } - each$1(arguments, function(arg, i) { - args[i] = arg; - }); - return oldFn.apply(self, args) - } - - // Give mixing function access to super_fn by prefixing all mixin function - // arguments with super_fn. - var newFnArgs = [super_fn].concat(args); - - return pluginFnProp.apply(self, newFnArgs) - }; - }, - - _serialize: function(obj) { - return JSON.stringify(obj) - }, - - _deserialize: function(strVal, defaultVal) { - if (!strVal) { return defaultVal } - // It is possible that a raw string value has been previously stored - // in a storage without using store.js, meaning it will be a raw - // string value instead of a JSON serialized string. By defaulting - // to the raw string value in case of a JSON parse error, we allow - // for past stored values to be forwards-compatible with store.js - var val = ''; - try { val = JSON.parse(strVal); } - catch(e) { val = strVal; } - - return (val !== undefined ? val : defaultVal) - }, - - _addStorage: function(storage) { - if (this.enabled) { return } - if (this._testStorage(storage)) { - this.storage = storage; - this.enabled = true; - } - }, - - _addPlugin: function(plugin) { - var self = this; - - // If the plugin is an array, then add all plugins in the array. - // This allows for a plugin to depend on other plugins. - if (isList$1(plugin)) { - each$1(plugin, function(plugin) { - self._addPlugin(plugin); - }); - return - } - - // Keep track of all plugins we've seen so far, so that we - // don't add any of them twice. - var seenPlugin = pluck$1(this.plugins, function(seenPlugin) { - return (plugin === seenPlugin) - }); - if (seenPlugin) { - return - } - this.plugins.push(plugin); - - // Check that the plugin is properly formed - if (!isFunction$3(plugin)) { - throw new Error('Plugins must be function values that return objects') - } - - var pluginProperties = plugin.call(this); - if (!isObject$3(pluginProperties)) { - throw new Error('Plugins must return an object of function properties') - } - - // Add the plugin function properties to this store instance. - each$1(pluginProperties, function(pluginFnProp, propName) { - if (!isFunction$3(pluginFnProp)) { - throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.') - } - self._assignPluginFnProp(pluginFnProp, propName); - }); - }, - - // Put deprecated properties in the private API, so as to not expose it to accidential - // discovery through inspection of the store object. - - // Deprecated: addStorage - addStorage: function(storage) { - _warn('store.addStorage(storage) is deprecated. Use createStore([storages])'); - this._addStorage(storage); - } - }; - - var store = create$9(_privateStoreProps, storeAPI, { - plugins: [] - }); - store.raw = {}; - each$1(store, function(prop, propName) { - if (isFunction$3(prop)) { - store.raw[propName] = bind$4(store, prop); - } - }); - each$1(storages, function(storage) { - store._addStorage(storage); - }); - each$1(plugins, function(plugin) { - store._addPlugin(plugin); - }); - return store - } - - var Global$1 = util.Global; - var localStorage_1 = { - name: 'localStorage', - read: read, - write: write, - each: each$2, - remove: remove$2, - clearAll: clearAll, - }; + function createBaseEach(eachFunc, fromRight) { + return function (collection, iteratee) { + if (collection == null) { + return collection; + } - function localStorage$1() { - return Global$1.localStorage - } + if (!isArrayLike(collection)) { + return eachFunc(collection, iteratee); + } - function read(key) { - return localStorage$1().getItem(key) - } + var length = collection.length, + index = fromRight ? length : -1, + iterable = Object(collection); - function write(key, data) { - return localStorage$1().setItem(key, data) - } + while (fromRight ? index-- : ++index < length) { + if (iteratee(iterable[index], index, iterable) === false) { + break; + } + } - function each$2(fn) { - for (var i = localStorage$1().length - 1; i >= 0; i--) { - var key = localStorage$1().key(i); - fn(read(key), key); - } - } + return collection; + }; + } + /** + * Creates a base function for methods like `_.forIn` and `_.forOwn`. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ - function remove$2(key) { - return localStorage$1().removeItem(key) - } - function clearAll() { - return localStorage$1().clear() - } + function createBaseFor(fromRight) { + return function (object, iteratee, keysFunc) { + var index = -1, + iterable = Object(object), + props = keysFunc(object), + length = props.length; - // oldFF-globalStorage provides storage for Firefox - // versions 6 and 7, where no localStorage, etc - // is available. + while (length--) { + var key = props[fromRight ? length : ++index]; + if (iteratee(iterable[key], key, iterable) === false) { + break; + } + } - var Global$2 = util.Global; + return object; + }; + } + /** + * Creates a function that wraps `func` to invoke it with the optional `this` + * binding of `thisArg`. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} [thisArg] The `this` binding of `func`. + * @returns {Function} Returns the new wrapped function. + */ - var oldFFGlobalStorage = { - name: 'oldFF-globalStorage', - read: read$1, - write: write$1, - each: each$3, - remove: remove$3, - clearAll: clearAll$1, - }; - var globalStorage = Global$2.globalStorage; + function createBind(func, bitmask, thisArg) { + var isBind = bitmask & WRAP_BIND_FLAG, + Ctor = createCtor(func); - function read$1(key) { - return globalStorage[key] - } + function wrapper() { + var fn = this && this !== root && this instanceof wrapper ? Ctor : func; + return fn.apply(isBind ? thisArg : this, arguments); + } - function write$1(key, data) { - globalStorage[key] = data; - } + return wrapper; + } + /** + * Creates a function like `_.lowerFirst`. + * + * @private + * @param {string} methodName The name of the `String` case method to use. + * @returns {Function} Returns the new case function. + */ - function each$3(fn) { - for (var i = globalStorage.length - 1; i >= 0; i--) { - var key = globalStorage.key(i); - fn(globalStorage[key], key); - } - } - function remove$3(key) { - return globalStorage.removeItem(key) - } + function createCaseFirst(methodName) { + return function (string) { + string = toString(string); + var strSymbols = hasUnicode(string) ? stringToArray(string) : undefined$1; + var chr = strSymbols ? strSymbols[0] : string.charAt(0); + var trailing = strSymbols ? castSlice(strSymbols, 1).join('') : string.slice(1); + return chr[methodName]() + trailing; + }; + } + /** + * Creates a function like `_.camelCase`. + * + * @private + * @param {Function} callback The function to combine each word. + * @returns {Function} Returns the new compounder function. + */ - function clearAll$1() { - each$3(function(key, _) { - delete globalStorage[key]; - }); - } - // oldIE-userDataStorage provides storage for Internet Explorer - // versions 6 and 7, where no localStorage, sessionStorage, etc - // is available. + function createCompounder(callback) { + return function (string) { + return arrayReduce(words(deburr(string).replace(reApos, '')), callback, ''); + }; + } + /** + * Creates a function that produces an instance of `Ctor` regardless of + * whether it was invoked as part of a `new` expression or by `call` or `apply`. + * + * @private + * @param {Function} Ctor The constructor to wrap. + * @returns {Function} Returns the new wrapped function. + */ - var Global$3 = util.Global; + function createCtor(Ctor) { + return function () { + // Use a `switch` statement to work with class constructors. See + // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist + // for more details. + var args = arguments; - var oldIEUserDataStorage = { - name: 'oldIE-userDataStorage', - write: write$2, - read: read$2, - each: each$4, - remove: remove$4, - clearAll: clearAll$2, - }; + switch (args.length) { + case 0: + return new Ctor(); - var storageName = 'storejs'; - var doc = Global$3.document; - var _withStorageEl = _makeIEStorageElFunction(); - var disable = (Global$3.navigator ? Global$3.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x + case 1: + return new Ctor(args[0]); - function write$2(unfixedKey, data) { - if (disable) { return } - var fixedKey = fixKey(unfixedKey); - _withStorageEl(function(storageEl) { - storageEl.setAttribute(fixedKey, data); - storageEl.save(storageName); - }); - } + case 2: + return new Ctor(args[0], args[1]); - function read$2(unfixedKey) { - if (disable) { return } - var fixedKey = fixKey(unfixedKey); - var res = null; - _withStorageEl(function(storageEl) { - res = storageEl.getAttribute(fixedKey); - }); - return res - } + case 3: + return new Ctor(args[0], args[1], args[2]); - function each$4(callback) { - _withStorageEl(function(storageEl) { - var attributes = storageEl.XMLDocument.documentElement.attributes; - for (var i=attributes.length-1; i>=0; i--) { - var attr = attributes[i]; - callback(storageEl.getAttribute(attr.name), attr.name); - } - }); - } + case 4: + return new Ctor(args[0], args[1], args[2], args[3]); - function remove$4(unfixedKey) { - var fixedKey = fixKey(unfixedKey); - _withStorageEl(function(storageEl) { - storageEl.removeAttribute(fixedKey); - storageEl.save(storageName); - }); - } + case 5: + return new Ctor(args[0], args[1], args[2], args[3], args[4]); - function clearAll$2() { - _withStorageEl(function(storageEl) { - var attributes = storageEl.XMLDocument.documentElement.attributes; - storageEl.load(storageName); - for (var i=attributes.length-1; i>=0; i--) { - storageEl.removeAttribute(attributes[i].name); - } - storageEl.save(storageName); - }); - } + case 6: + return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]); - // Helpers - ////////// + case 7: + return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + } - // In IE7, keys cannot start with a digit or contain certain chars. - // See https://github.com/marcuswestin/store.js/issues/40 - // See https://github.com/marcuswestin/store.js/issues/83 - var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g"); - function fixKey(key) { - return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___') - } + var thisBinding = baseCreate(Ctor.prototype), + result = Ctor.apply(thisBinding, args); // Mimic the constructor's `return` behavior. + // See https://es5.github.io/#x13.2.2 for more details. - function _makeIEStorageElFunction() { - if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) { - return null - } - var scriptTag = 'script', - storageOwner, - storageContainer, - storageEl; - - // Since #userData storage applies only to specific paths, we need to - // somehow link our data to a specific path. We choose /favicon.ico - // as a pretty safe option, since all browsers already make a request to - // this URL anyway and being a 404 will not hurt us here. We wrap an - // iframe pointing to the favicon in an ActiveXObject(htmlfile) object - // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx) - // since the iframe access rules appear to allow direct access and - // manipulation of the document element, even for a 404 page. This - // document can be used instead of the current document (which would - // have been limited to the current path) to perform #userData storage. - try { - /* global ActiveXObject */ - storageContainer = new ActiveXObject('htmlfile'); - storageContainer.open(); - storageContainer.write('<'+scriptTag+'>document.w=window'); - storageContainer.close(); - storageOwner = storageContainer.w.frames[0].document; - storageEl = storageOwner.createElement('div'); - } catch(e) { - // somehow ActiveXObject instantiation failed (perhaps some special - // security settings or otherwse), fall back to per-path storage - storageEl = doc.createElement('div'); - storageOwner = doc.body; - } - - return function(storeFunction) { - var args = [].slice.call(arguments, 0); - args.unshift(storageEl); - // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx - // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx - storageOwner.appendChild(storageEl); - storageEl.addBehavior('#default#userData'); - storageEl.load(storageName); - storeFunction.apply(this, args); - storageOwner.removeChild(storageEl); - return - } - } - - // cookieStorage is useful Safari private browser mode, where localStorage - // doesn't work but cookies do. This implementation is adopted from - // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage + return isObject(result) ? result : thisBinding; + }; + } + /** + * Creates a function that wraps `func` to enable currying. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {number} arity The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ - var Global$4 = util.Global; - var trim$1 = util.trim; + function createCurry(func, bitmask, arity) { + var Ctor = createCtor(func); - var cookieStorage = { - name: 'cookieStorage', - read: read$3, - write: write$3, - each: each$5, - remove: remove$5, - clearAll: clearAll$3, - }; + function wrapper() { + var length = arguments.length, + args = Array(length), + index = length, + placeholder = getHolder(wrapper); - var doc$1 = Global$4.document; + while (index--) { + args[index] = arguments[index]; + } - function read$3(key) { - if (!key || !_has(key)) { return null } - var regexpStr = "(?:^|.*;\\s*)" + - escape(key).replace(/[\-\.\+\*]/g, "\\$&") + - "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*"; - return unescape(doc$1.cookie.replace(new RegExp(regexpStr), "$1")) - } + var holders = length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder ? [] : replaceHolders(args, placeholder); + length -= holders.length; - function each$5(callback) { - var cookies = doc$1.cookie.split(/; ?/g); - for (var i = cookies.length - 1; i >= 0; i--) { - if (!trim$1(cookies[i])) { - continue - } - var kvp = cookies[i].split('='); - var key = unescape(kvp[0]); - var val = unescape(kvp[1]); - callback(val, key); - } - } + if (length < arity) { + return createRecurry(func, bitmask, createHybrid, wrapper.placeholder, undefined$1, args, holders, undefined$1, undefined$1, arity - length); + } - function write$3(key, data) { - if(!key) { return } - doc$1.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/"; - } + var fn = this && this !== root && this instanceof wrapper ? Ctor : func; + return apply(fn, this, args); + } - function remove$5(key) { - if (!key || !_has(key)) { - return - } - doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/"; - } + return wrapper; + } + /** + * Creates a `_.find` or `_.findLast` function. + * + * @private + * @param {Function} findIndexFunc The function to find the collection index. + * @returns {Function} Returns the new find function. + */ - function clearAll$3() { - each$5(function(_, key) { - remove$5(key); - }); - } - function _has(key) { - return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie) - } + function createFind(findIndexFunc) { + return function (collection, predicate, fromIndex) { + var iterable = Object(collection); - var Global$5 = util.Global; + if (!isArrayLike(collection)) { + var iteratee = getIteratee(predicate, 3); + collection = keys(collection); - var sessionStorage_1 = { - name: 'sessionStorage', - read: read$4, - write: write$4, - each: each$6, - remove: remove$6, - clearAll: clearAll$4 - }; + predicate = function predicate(key) { + return iteratee(iterable[key], key, iterable); + }; + } - function sessionStorage() { - return Global$5.sessionStorage - } + var index = findIndexFunc(collection, predicate, fromIndex); + return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined$1; + }; + } + /** + * Creates a `_.flow` or `_.flowRight` function. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new flow function. + */ - function read$4(key) { - return sessionStorage().getItem(key) - } - function write$4(key, data) { - return sessionStorage().setItem(key, data) - } + function createFlow(fromRight) { + return flatRest(function (funcs) { + var length = funcs.length, + index = length, + prereq = LodashWrapper.prototype.thru; - function each$6(fn) { - for (var i = sessionStorage().length - 1; i >= 0; i--) { - var key = sessionStorage().key(i); - fn(read$4(key), key); - } - } + if (fromRight) { + funcs.reverse(); + } - function remove$6(key) { - return sessionStorage().removeItem(key) - } + while (index--) { + var func = funcs[index]; - function clearAll$4() { - return sessionStorage().clear() - } + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } - // memoryStorage is a useful last fallback to ensure that the store - // is functions (meaning store.get(), store.set(), etc will all function). - // However, stored values will not persist when the browser navigates to - // a new page or reloads the current page. + if (prereq && !wrapper && getFuncName(func) == 'wrapper') { + var wrapper = new LodashWrapper([], true); + } + } - var memoryStorage_1 = { - name: 'memoryStorage', - read: read$5, - write: write$5, - each: each$7, - remove: remove$7, - clearAll: clearAll$5, - }; + index = wrapper ? index : length; - var memoryStorage = {}; + while (++index < length) { + func = funcs[index]; + var funcName = getFuncName(func), + data = funcName == 'wrapper' ? getData(func) : undefined$1; - function read$5(key) { - return memoryStorage[key] - } + if (data && isLaziable(data[0]) && data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && !data[4].length && data[9] == 1) { + wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); + } else { + wrapper = func.length == 1 && isLaziable(func) ? wrapper[funcName]() : wrapper.thru(func); + } + } - function write$5(key, data) { - memoryStorage[key] = data; - } + return function () { + var args = arguments, + value = args[0]; - function each$7(callback) { - for (var key in memoryStorage) { - if (memoryStorage.hasOwnProperty(key)) { - callback(memoryStorage[key], key); - } - } - } + if (wrapper && args.length == 1 && isArray(value)) { + return wrapper.plant(value).value(); + } - function remove$7(key) { - delete memoryStorage[key]; - } + var index = 0, + result = length ? funcs[index].apply(this, args) : value; - function clearAll$5(key) { - memoryStorage = {}; - } + while (++index < length) { + result = funcs[index].call(this, result); + } - var all = [ - // Listed in order of usage preference - localStorage_1, - oldFFGlobalStorage, - oldIEUserDataStorage, - cookieStorage, - sessionStorage_1, - memoryStorage_1 - ]; + return result; + }; + }); + } + /** + * Creates a function that wraps `func` to invoke it with optional `this` + * binding of `thisArg`, partial application, and currying. + * + * @private + * @param {Function|string} func The function or method name to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to prepend to those provided to + * the new function. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [partialsRight] The arguments to append to those provided + * to the new function. + * @param {Array} [holdersRight] The `partialsRight` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ - /* eslint-disable */ - // json2.js - // 2016-10-28 - // Public Domain. - // NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - // See http://www.JSON.org/js.html - // This code should be minified before deployment. - // See http://javascript.crockford.com/jsmin.html + function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) { + var isAry = bitmask & WRAP_ARY_FLAG, + isBind = bitmask & WRAP_BIND_FLAG, + isBindKey = bitmask & WRAP_BIND_KEY_FLAG, + isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), + isFlip = bitmask & WRAP_FLIP_FLAG, + Ctor = isBindKey ? undefined$1 : createCtor(func); - // USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO - // NOT CONTROL. + function wrapper() { + var length = arguments.length, + args = Array(length), + index = length; - // This file creates a global JSON object containing two methods: stringify - // and parse. This file provides the ES5 JSON capability to ES3 systems. - // If a project might run on IE8 or earlier, then this file should be included. - // This file does nothing on ES5 systems. + while (index--) { + args[index] = arguments[index]; + } - // JSON.stringify(value, replacer, space) - // value any JavaScript value, usually an object or array. - // replacer an optional parameter that determines how object - // values are stringified for objects. It can be a - // function or an array of strings. - // space an optional parameter that specifies the indentation - // of nested structures. If it is omitted, the text will - // be packed without extra whitespace. If it is a number, - // it will specify the number of spaces to indent at each - // level. If it is a string (such as "\t" or " "), - // it contains the characters used to indent at each level. - // This method produces a JSON text from a JavaScript value. - // When an object value is found, if the object contains a toJSON - // method, its toJSON method will be called and the result will be - // stringified. A toJSON method does not serialize: it returns the - // value represented by the name/value pair that should be serialized, - // or undefined if nothing should be serialized. The toJSON method - // will be passed the key associated with the value, and this will be - // bound to the value. + if (isCurried) { + var placeholder = getHolder(wrapper), + holdersCount = countHolders(args, placeholder); + } - // For example, this would serialize Dates as ISO strings. + if (partials) { + args = composeArgs(args, partials, holders, isCurried); + } - // Date.prototype.toJSON = function (key) { - // function f(n) { - // // Format integers to have at least two digits. - // return (n < 10) - // ? "0" + n - // : n; - // } - // return this.getUTCFullYear() + "-" + - // f(this.getUTCMonth() + 1) + "-" + - // f(this.getUTCDate()) + "T" + - // f(this.getUTCHours()) + ":" + - // f(this.getUTCMinutes()) + ":" + - // f(this.getUTCSeconds()) + "Z"; - // }; + if (partialsRight) { + args = composeArgsRight(args, partialsRight, holdersRight, isCurried); + } - // You can provide an optional replacer method. It will be passed the - // key and value of each member, with this bound to the containing - // object. The value that is returned from your method will be - // serialized. If your method returns undefined, then the member will - // be excluded from the serialization. + length -= holdersCount; - // If the replacer parameter is an array of strings, then it will be - // used to select the members to be serialized. It filters the results - // such that only members with keys listed in the replacer array are - // stringified. + if (isCurried && length < arity) { + var newHolders = replaceHolders(args, placeholder); + return createRecurry(func, bitmask, createHybrid, wrapper.placeholder, thisArg, args, newHolders, argPos, ary, arity - length); + } - // Values that do not have JSON representations, such as undefined or - // functions, will not be serialized. Such values in objects will be - // dropped; in arrays they will be replaced with null. You can use - // a replacer function to replace those with JSON values. + var thisBinding = isBind ? thisArg : this, + fn = isBindKey ? thisBinding[func] : func; + length = args.length; - // JSON.stringify(undefined) returns undefined. + if (argPos) { + args = reorder(args, argPos); + } else if (isFlip && length > 1) { + args.reverse(); + } - // The optional space parameter produces a stringification of the - // value that is filled with line breaks and indentation to make it - // easier to read. + if (isAry && ary < length) { + args.length = ary; + } - // If the space parameter is a non-empty string, then that string will - // be used for indentation. If the space parameter is a number, then - // the indentation will be that many spaces. + if (this && this !== root && this instanceof wrapper) { + fn = Ctor || createCtor(fn); + } - // Example: + return fn.apply(thisBinding, args); + } - // text = JSON.stringify(["e", {pluribus: "unum"}]); - // // text is '["e",{"pluribus":"unum"}]' + return wrapper; + } + /** + * Creates a function like `_.invertBy`. + * + * @private + * @param {Function} setter The function to set accumulator values. + * @param {Function} toIteratee The function to resolve iteratees. + * @returns {Function} Returns the new inverter function. + */ - // text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t"); - // // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' - // text = JSON.stringify([new Date()], function (key, value) { - // return this[key] instanceof Date - // ? "Date(" + this[key] + ")" - // : value; - // }); - // // text is '["Date(---current time---)"]' + function createInverter(setter, toIteratee) { + return function (object, iteratee) { + return baseInverter(object, setter, toIteratee(iteratee), {}); + }; + } + /** + * Creates a function that performs a mathematical operation on two values. + * + * @private + * @param {Function} operator The function to perform the operation. + * @param {number} [defaultValue] The value used for `undefined` arguments. + * @returns {Function} Returns the new mathematical operation function. + */ - // JSON.parse(text, reviver) - // This method parses a JSON text to produce an object or array. - // It can throw a SyntaxError exception. - // The optional reviver parameter is a function that can filter and - // transform the results. It receives each of the keys and values, - // and its return value is used instead of the original value. - // If it returns what it received, then the structure is not modified. - // If it returns undefined then the member is deleted. + function createMathOperation(operator, defaultValue) { + return function (value, other) { + var result; - // Example: + if (value === undefined$1 && other === undefined$1) { + return defaultValue; + } - // // Parse the text. Values that look like ISO date strings will - // // be converted to Date objects. + if (value !== undefined$1) { + result = value; + } - // myData = JSON.parse(text, function (key, value) { - // var a; - // if (typeof value === "string") { - // a = - // /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); - // if (a) { - // return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], - // +a[5], +a[6])); - // } - // } - // return value; - // }); + if (other !== undefined$1) { + if (result === undefined$1) { + return other; + } - // myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { - // var d; - // if (typeof value === "string" && - // value.slice(0, 5) === "Date(" && - // value.slice(-1) === ")") { - // d = new Date(value.slice(5, -1)); - // if (d) { - // return d; - // } - // } - // return value; - // }); + if (typeof value == 'string' || typeof other == 'string') { + value = baseToString(value); + other = baseToString(other); + } else { + value = baseToNumber(value); + other = baseToNumber(other); + } - // This is a reference implementation. You are free to copy, modify, or - // redistribute. + result = operator(value, other); + } - /*jslint - eval, for, this - */ + return result; + }; + } + /** + * Creates a function like `_.over`. + * + * @private + * @param {Function} arrayFunc The function to iterate over iteratees. + * @returns {Function} Returns the new over function. + */ - /*property - JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, - getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, - lastIndex, length, parse, prototype, push, replace, slice, stringify, - test, toJSON, toString, valueOf - */ + function createOver(arrayFunc) { + return flatRest(function (iteratees) { + iteratees = arrayMap(iteratees, baseUnary(getIteratee())); + return baseRest(function (args) { + var thisArg = this; + return arrayFunc(iteratees, function (iteratee) { + return apply(iteratee, thisArg, args); + }); + }); + }); + } + /** + * Creates the padding for `string` based on `length`. The `chars` string + * is truncated if the number of characters exceeds `length`. + * + * @private + * @param {number} length The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padding for `string`. + */ - // Create a JSON object only if one does not already exist. We create the - // methods in a closure to avoid creating global variables. - if (typeof JSON !== "object") { - JSON = {}; - } + function createPadding(length, chars) { + chars = chars === undefined$1 ? ' ' : baseToString(chars); + var charsLength = chars.length; - (function () { + if (charsLength < 2) { + return charsLength ? baseRepeat(chars, length) : chars; + } - var rx_one = /^[\],:{}\s]*$/; - var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g; - var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g; - var rx_four = /(?:^|:|,)(?:\s*\[)+/g; - var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; - var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; + var result = baseRepeat(chars, nativeCeil(length / stringSize(chars))); + return hasUnicode(chars) ? castSlice(stringToArray(result), 0, length).join('') : result.slice(0, length); + } + /** + * Creates a function that wraps `func` to invoke it with the `this` binding + * of `thisArg` and `partials` prepended to the arguments it receives. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} partials The arguments to prepend to those provided to + * the new function. + * @returns {Function} Returns the new wrapped function. + */ - function f(n) { - // Format integers to have at least two digits. - return n < 10 - ? "0" + n - : n; - } - function this_value() { - return this.valueOf(); - } + function createPartial(func, bitmask, thisArg, partials) { + var isBind = bitmask & WRAP_BIND_FLAG, + Ctor = createCtor(func); - if (typeof Date.prototype.toJSON !== "function") { + function wrapper() { + var argsIndex = -1, + argsLength = arguments.length, + leftIndex = -1, + leftLength = partials.length, + args = Array(leftLength + argsLength), + fn = this && this !== root && this instanceof wrapper ? Ctor : func; - Date.prototype.toJSON = function () { + while (++leftIndex < leftLength) { + args[leftIndex] = partials[leftIndex]; + } - return isFinite(this.valueOf()) - ? this.getUTCFullYear() + "-" + - f(this.getUTCMonth() + 1) + "-" + - f(this.getUTCDate()) + "T" + - f(this.getUTCHours()) + ":" + - f(this.getUTCMinutes()) + ":" + - f(this.getUTCSeconds()) + "Z" - : null; - }; + while (argsLength--) { + args[leftIndex++] = arguments[++argsIndex]; + } - Boolean.prototype.toJSON = this_value; - Number.prototype.toJSON = this_value; - String.prototype.toJSON = this_value; - } + return apply(fn, isBind ? thisArg : this, args); + } - var gap; - var indent; - var meta; - var rep; + return wrapper; + } + /** + * Creates a `_.range` or `_.rangeRight` function. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new range function. + */ - function quote(string) { + function createRange(fromRight) { + return function (start, end, step) { + if (step && typeof step != 'number' && isIterateeCall(start, end, step)) { + end = step = undefined$1; + } // Ensure the sign of `-0` is preserved. - // If the string contains no control characters, no quote characters, and no - // backslash characters, then we can safely slap some quotes around it. - // Otherwise we must also replace the offending characters with safe escape - // sequences. - rx_escapable.lastIndex = 0; - return rx_escapable.test(string) - ? "\"" + string.replace(rx_escapable, function (a) { - var c = meta[a]; - return typeof c === "string" - ? c - : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4); - }) + "\"" - : "\"" + string + "\""; - } + start = toFinite(start); + if (end === undefined$1) { + end = start; + start = 0; + } else { + end = toFinite(end); + } - function str(key, holder) { + step = step === undefined$1 ? start < end ? 1 : -1 : toFinite(step); + return baseRange(start, end, step, fromRight); + }; + } + /** + * Creates a function that performs a relational operation on two values. + * + * @private + * @param {Function} operator The function to perform the operation. + * @returns {Function} Returns the new relational operation function. + */ - // Produce a string from holder[key]. - var i; // The loop counter. - var k; // The member key. - var v; // The member value. - var length; - var mind = gap; - var partial; - var value = holder[key]; + function createRelationalOperation(operator) { + return function (value, other) { + if (!(typeof value == 'string' && typeof other == 'string')) { + value = toNumber(value); + other = toNumber(other); + } - // If the value has a toJSON method, call it to obtain a replacement value. + return operator(value, other); + }; + } + /** + * Creates a function that wraps `func` to continue currying. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {Function} wrapFunc The function to create the `func` wrapper. + * @param {*} placeholder The placeholder value. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to prepend to those provided to + * the new function. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ - if (value && typeof value === "object" && - typeof value.toJSON === "function") { - value = value.toJSON(key); - } - // If we were called with a replacer function, then call the replacer to - // obtain a replacement value. + function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) { + var isCurry = bitmask & WRAP_CURRY_FLAG, + newHolders = isCurry ? holders : undefined$1, + newHoldersRight = isCurry ? undefined$1 : holders, + newPartials = isCurry ? partials : undefined$1, + newPartialsRight = isCurry ? undefined$1 : partials; + bitmask |= isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG; + bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG); - if (typeof rep === "function") { - value = rep.call(holder, key, value); + if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) { + bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG); } - // What happens next depends on the value's type. + var newData = [func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, newHoldersRight, argPos, ary, arity]; + var result = wrapFunc.apply(undefined$1, newData); - switch (typeof value) { - case "string": - return quote(value); + if (isLaziable(func)) { + setData(result, newData); + } - case "number": + result.placeholder = placeholder; + return setWrapToString(result, func, bitmask); + } + /** + * Creates a function like `_.round`. + * + * @private + * @param {string} methodName The name of the `Math` method to use when rounding. + * @returns {Function} Returns the new round function. + */ - // JSON numbers must be finite. Encode non-finite numbers as null. - return isFinite(value) - ? String(value) - : "null"; + function createRound(methodName) { + var func = Math[methodName]; + return function (number, precision) { + number = toNumber(number); + precision = precision == null ? 0 : nativeMin(toInteger(precision), 292); - case "boolean": - case "null": + if (precision && nativeIsFinite(number)) { + // Shift with exponential notation to avoid floating-point issues. + // See [MDN](https://mdn.io/round#Examples) for more details. + var pair = (toString(number) + 'e').split('e'), + value = func(pair[0] + 'e' + (+pair[1] + precision)); + pair = (toString(value) + 'e').split('e'); + return +(pair[0] + 'e' + (+pair[1] - precision)); + } - // If the value is a boolean or null, convert it to a string. Note: - // typeof null does not produce "null". The case is included here in - // the remote chance that this gets fixed someday. + return func(number); + }; + } + /** + * Creates a set object of `values`. + * + * @private + * @param {Array} values The values to add to the set. + * @returns {Object} Returns the new set. + */ - return String(value); - // If the type is "object", we might be dealing with an object or an array or - // null. + var createSet = !(Set && 1 / setToArray(new Set([, -0]))[1] == INFINITY) ? noop : function (values) { + return new Set(values); + }; + /** + * Creates a `_.toPairs` or `_.toPairsIn` function. + * + * @private + * @param {Function} keysFunc The function to get the keys of a given object. + * @returns {Function} Returns the new pairs function. + */ - case "object": + function createToPairs(keysFunc) { + return function (object) { + var tag = getTag(object); - // Due to a specification blunder in ECMAScript, typeof null is "object", - // so watch out for that case. + if (tag == mapTag) { + return mapToArray(object); + } - if (!value) { - return "null"; - } + if (tag == setTag) { + return setToPairs(object); + } - // Make an array to hold the partial results of stringifying this object value. + return baseToPairs(object, keysFunc(object)); + }; + } + /** + * Creates a function that either curries or invokes `func` with optional + * `this` binding and partially applied arguments. + * + * @private + * @param {Function|string} func The function or method name to wrap. + * @param {number} bitmask The bitmask flags. + * 1 - `_.bind` + * 2 - `_.bindKey` + * 4 - `_.curry` or `_.curryRight` of a bound function + * 8 - `_.curry` + * 16 - `_.curryRight` + * 32 - `_.partial` + * 64 - `_.partialRight` + * 128 - `_.rearg` + * 256 - `_.ary` + * 512 - `_.flip` + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to be partially applied. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ - gap += indent; - partial = []; - // Is the value an array? + function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) { + var isBindKey = bitmask & WRAP_BIND_KEY_FLAG; - if (Object.prototype.toString.apply(value) === "[object Array]") { + if (!isBindKey && typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } - // The value is an array. Stringify every element. Use null as a placeholder - // for non-JSON values. + var length = partials ? partials.length : 0; - length = value.length; - for (i = 0; i < length; i += 1) { - partial[i] = str(i, value) || "null"; - } + if (!length) { + bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG); + partials = holders = undefined$1; + } - // Join all of the elements together, separated with commas, and wrap them in - // brackets. + ary = ary === undefined$1 ? ary : nativeMax(toInteger(ary), 0); + arity = arity === undefined$1 ? arity : toInteger(arity); + length -= holders ? holders.length : 0; - v = partial.length === 0 - ? "[]" - : gap - ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]" - : "[" + partial.join(",") + "]"; - gap = mind; - return v; - } + if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) { + var partialsRight = partials, + holdersRight = holders; + partials = holders = undefined$1; + } - // If the replacer is an array, use it to select the members to be stringified. - - if (rep && typeof rep === "object") { - length = rep.length; - for (i = 0; i < length; i += 1) { - if (typeof rep[i] === "string") { - k = rep[i]; - v = str(k, value); - if (v) { - partial.push(quote(k) + ( - gap - ? ": " - : ":" - ) + v); - } - } - } - } else { + var data = isBindKey ? undefined$1 : getData(func); + var newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity]; - // Otherwise, iterate through all of the keys in the object. - - for (k in value) { - if (Object.prototype.hasOwnProperty.call(value, k)) { - v = str(k, value); - if (v) { - partial.push(quote(k) + ( - gap - ? ": " - : ":" - ) + v); - } - } - } - } + if (data) { + mergeData(newData, data); + } - // Join all of the member texts together, separated with commas, - // and wrap them in braces. + func = newData[0]; + bitmask = newData[1]; + thisArg = newData[2]; + partials = newData[3]; + holders = newData[4]; + arity = newData[9] = newData[9] === undefined$1 ? isBindKey ? 0 : func.length : nativeMax(newData[9] - length, 0); - v = partial.length === 0 - ? "{}" - : gap - ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}" - : "{" + partial.join(",") + "}"; - gap = mind; - return v; + if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) { + bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG); } - } - // If the JSON object does not yet have a stringify method, give it one. + if (!bitmask || bitmask == WRAP_BIND_FLAG) { + var result = createBind(func, bitmask, thisArg); + } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) { + result = createCurry(func, bitmask, arity); + } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) { + result = createPartial(func, bitmask, thisArg, partials); + } else { + result = createHybrid.apply(undefined$1, newData); + } - if (typeof JSON.stringify !== "function") { - meta = { // table of character substitutions - "\b": "\\b", - "\t": "\\t", - "\n": "\\n", - "\f": "\\f", - "\r": "\\r", - "\"": "\\\"", - "\\": "\\\\" - }; - JSON.stringify = function (value, replacer, space) { + var setter = data ? baseSetData : setData; + return setWrapToString(setter(result, newData), func, bitmask); + } + /** + * Used by `_.defaults` to customize its `_.assignIn` use to assign properties + * of source objects to the destination object for all destination properties + * that resolve to `undefined`. + * + * @private + * @param {*} objValue The destination value. + * @param {*} srcValue The source value. + * @param {string} key The key of the property to assign. + * @param {Object} object The parent object of `objValue`. + * @returns {*} Returns the value to assign. + */ - // The stringify method takes a value and an optional replacer, and an optional - // space parameter, and returns a JSON text. The replacer can be a function - // that can replace values, or an array of strings that will select the keys. - // A default replacer method can be provided. Use of the space parameter can - // produce text that is more easily readable. - var i; - gap = ""; - indent = ""; + function customDefaultsAssignIn(objValue, srcValue, key, object) { + if (objValue === undefined$1 || eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key)) { + return srcValue; + } - // If the space parameter is a number, make an indent string containing that - // many spaces. + return objValue; + } + /** + * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source + * objects into destination objects that are passed thru. + * + * @private + * @param {*} objValue The destination value. + * @param {*} srcValue The source value. + * @param {string} key The key of the property to merge. + * @param {Object} object The parent object of `objValue`. + * @param {Object} source The parent object of `srcValue`. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + * @returns {*} Returns the value to assign. + */ - if (typeof space === "number") { - for (i = 0; i < space; i += 1) { - indent += " "; - } - // If the space parameter is a string, it will be used as the indent string. + function customDefaultsMerge(objValue, srcValue, key, object, source, stack) { + if (isObject(objValue) && isObject(srcValue)) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, objValue); + baseMerge(objValue, srcValue, undefined$1, customDefaultsMerge, stack); + stack['delete'](srcValue); + } - } else if (typeof space === "string") { - indent = space; - } + return objValue; + } + /** + * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain + * objects. + * + * @private + * @param {*} value The value to inspect. + * @param {string} key The key of the property to inspect. + * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`. + */ - // If there is a replacer, it must be a function or an array. - // Otherwise, throw an error. - rep = replacer; - if (replacer && typeof replacer !== "function" && - (typeof replacer !== "object" || - typeof replacer.length !== "number")) { - throw new Error("JSON.stringify"); - } + function customOmitClone(value) { + return isPlainObject(value) ? undefined$1 : value; + } + /** + * A specialized version of `baseIsEqualDeep` for arrays with support for + * partial deep comparisons. + * + * @private + * @param {Array} array The array to compare. + * @param {Array} other The other array to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `array` and `other` objects. + * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. + */ - // Make a fake root object containing our value under the key of "". - // Return the result of stringifying the value. - return str("", {"": value}); - }; - } + function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + arrLength = array.length, + othLength = other.length; + + if (arrLength != othLength && !(isPartial && othLength > arrLength)) { + return false; + } // Check that cyclic values are equal. - // If the JSON object does not yet have a parse method, give it one. + var arrStacked = stack.get(array); + var othStacked = stack.get(other); - if (typeof JSON.parse !== "function") { - JSON.parse = function (text, reviver) { + if (arrStacked && othStacked) { + return arrStacked == other && othStacked == array; + } - // The parse method takes a text and an optional reviver function, and returns - // a JavaScript value if the text is a valid JSON text. + var index = -1, + result = true, + seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache() : undefined$1; + stack.set(array, other); + stack.set(other, array); // Ignore non-index properties. - var j; + while (++index < arrLength) { + var arrValue = array[index], + othValue = other[index]; - function walk(holder, key) { - - // The walk method is used to recursively walk the resulting structure so - // that modifications can be made. - - var k; - var v; - var value = holder[key]; - if (value && typeof value === "object") { - for (k in value) { - if (Object.prototype.hasOwnProperty.call(value, k)) { - v = walk(value, k); - if (v !== undefined) { - value[k] = v; - } else { - delete value[k]; - } - } - } - } - return reviver.call(holder, key, value); + if (customizer) { + var compared = isPartial ? customizer(othValue, arrValue, index, other, array, stack) : customizer(arrValue, othValue, index, array, other, stack); + } + + if (compared !== undefined$1) { + if (compared) { + continue; } + result = false; + break; + } // Recursively compare arrays (susceptible to call stack limits). - // Parsing happens in four stages. In the first stage, we replace certain - // Unicode characters with escape sequences. JavaScript handles many characters - // incorrectly, either silently deleting them, or treating them as line endings. - text = String(text); - rx_dangerous.lastIndex = 0; - if (rx_dangerous.test(text)) { - text = text.replace(rx_dangerous, function (a) { - return "\\u" + - ("0000" + a.charCodeAt(0).toString(16)).slice(-4); - }); + if (seen) { + if (!arraySome(other, function (othValue, othIndex) { + if (!cacheHas(seen, othIndex) && (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { + return seen.push(othIndex); + } + })) { + result = false; + break; } + } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { + result = false; + break; + } + } + + stack['delete'](array); + stack['delete'](other); + return result; + } + /** + * A specialized version of `baseIsEqualDeep` for comparing objects of + * the same `toStringTag`. + * + * **Note:** This function only supports comparing values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {string} tag The `toStringTag` of the objects to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + - // In the second stage, we run the text against regular expressions that look - // for non-JSON patterns. We are especially concerned with "()" and "new" - // because they can cause invocation, and "=" because it can cause mutation. - // But just to be safe, we want to reject all unexpected forms. - - // We split the second stage into 4 regexp operations in order to work around - // crippling inefficiencies in IE's and Safari's regexp engines. First we - // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we - // replace all simple value tokens with "]" characters. Third, we delete all - // open brackets that follow a colon or comma or that begin the text. Finally, - // we look to see that the remaining characters are only whitespace or "]" or - // "," or ":" or "{" or "}". If that is so, then the text is safe for eval. - - if ( - rx_one.test( - text - .replace(rx_two, "@") - .replace(rx_three, "]") - .replace(rx_four, "") - ) - ) { - - // In the third stage we use the eval function to compile the text into a - // JavaScript structure. The "{" operator is subject to a syntactic ambiguity - // in JavaScript: it can begin a block or an object literal. We wrap the text - // in parens to eliminate the ambiguity. - - j = eval("(" + text + ")"); - - // In the optional fourth stage, we recursively walk the new structure, passing - // each name/value pair to a reviver function for possible transformation. - - return (typeof reviver === "function") - ? walk({"": j}, "") - : j; + function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { + switch (tag) { + case dataViewTag: + if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) { + return false; } - // If the text is not JSON parseable, then a SyntaxError is thrown. + object = object.buffer; + other = other.buffer; - throw new SyntaxError("JSON.parse"); - }; - } - }()); + case arrayBufferTag: + if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array(object), new Uint8Array(other))) { + return false; + } - var json2 = json2Plugin; + return true; - function json2Plugin() { - - return {} - } + case boolTag: + case dateTag: + case numberTag: + // Coerce booleans to `1` or `0` and dates to milliseconds. + // Invalid dates are coerced to `NaN`. + return eq(+object, +other); - var plugins = [json2]; + case errorTag: + return object.name == other.name && object.message == other.message; - var store_legacy = storeEngine.createStore(all, plugins); + case regexpTag: + case stringTag: + // Coerce regexes to strings and treat strings, primitives and objects, + // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring + // for more details. + return object == other + ''; - // # osm-auth - // - // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo) - // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing), - // does not support custom headers, which this uses everywhere. - var osmAuth = function(o) { + case mapTag: + var convert = mapToArray; - var oauth = {}; + case setTag: + var isPartial = bitmask & COMPARE_PARTIAL_FLAG; + convert || (convert = setToArray); - // authenticated users will also have a request token secret, but it's - // not used in transactions with the server - oauth.authenticated = function() { - return !!(token('oauth_token') && token('oauth_token_secret')); - }; + if (object.size != other.size && !isPartial) { + return false; + } // Assume cyclic values are equal. - oauth.logout = function() { - token('oauth_token', ''); - token('oauth_token_secret', ''); - token('oauth_request_token_secret', ''); - return oauth; - }; - // TODO: detect lack of click event - oauth.authenticate = function(callback) { - if (oauth.authenticated()) { return callback(); } - - oauth.logout(); - - // ## Getting a request token - var params = timenonce(getAuth(o)), - url = o.url + '/oauth/request_token'; - - params.oauth_signature = ohauth_1.signature( - o.oauth_secret, '', - ohauth_1.baseString('POST', url, params)); - - if (!o.singlepage) { - // Create a 600x550 popup window in the center of the screen - var w = 600, h = 550, - settings = [ - ['width', w], ['height', h], - ['left', screen.width / 2 - w / 2], - ['top', screen.height / 2 - h / 2]].map(function(x) { - return x.join('='); - }).join(','), - popup = window.open('about:blank', 'oauth_window', settings); - } - - // Request a request token. When this is complete, the popup - // window is redirected to OSM's authorization page. - ohauth_1.xhr('POST', url, params, null, {}, reqTokenDone); - o.loading(); - - function reqTokenDone(err, xhr) { - o.done(); - if (err) { return callback(err); } - var resp = ohauth_1.stringQs(xhr.response); - token('oauth_request_token_secret', resp.oauth_token_secret); - var authorize_url = o.url + '/oauth/authorize?' + ohauth_1.qsString({ - oauth_token: resp.oauth_token, - oauth_callback: resolveUrl$1(o.landing) - }); + var stacked = stack.get(object); - if (o.singlepage) { - location.href = authorize_url; - } else { - popup.location = authorize_url; + if (stacked) { + return stacked == other; } - } - - // Called by a function in a landing page, in the popup window. The - // window closes itself. - window.authComplete = function(token) { - var oauth_token = ohauth_1.stringQs(token.split('?')[1]); - get_access_token(oauth_token.oauth_token); - delete window.authComplete; - }; - // ## Getting an request token - // - // At this point we have an `oauth_token`, brought in from a function - // call on a landing page popup. - function get_access_token(oauth_token) { - var url = o.url + '/oauth/access_token', - params = timenonce(getAuth(o)), - request_token_secret = token('oauth_request_token_secret'); - params.oauth_token = oauth_token; - params.oauth_signature = ohauth_1.signature( - o.oauth_secret, - request_token_secret, - ohauth_1.baseString('POST', url, params)); - - // ## Getting an access token - // - // The final token required for authentication. At this point - // we have a `request token secret` - ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone); - o.loading(); - } - - function accessTokenDone(err, xhr) { - o.done(); - if (err) { return callback(err); } - var access_token = ohauth_1.stringQs(xhr.response); - token('oauth_token', access_token.oauth_token); - token('oauth_token_secret', access_token.oauth_token_secret); - callback(null, oauth); - } - }; + bitmask |= COMPARE_UNORDERED_FLAG; // Recursively compare objects (susceptible to call stack limits). - oauth.bootstrapToken = function(oauth_token, callback) { - // ## Getting an request token - // At this point we have an `oauth_token`, brought in from a function - // call on a landing page popup. - function get_access_token(oauth_token) { - var url = o.url + '/oauth/access_token', - params = timenonce(getAuth(o)), - request_token_secret = token('oauth_request_token_secret'); - params.oauth_token = oauth_token; - params.oauth_signature = ohauth_1.signature( - o.oauth_secret, - request_token_secret, - ohauth_1.baseString('POST', url, params)); - - // ## Getting an access token - // The final token required for authentication. At this point - // we have a `request token secret` - ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone); - o.loading(); - } - - function accessTokenDone(err, xhr) { - o.done(); - if (err) { return callback(err); } - var access_token = ohauth_1.stringQs(xhr.response); - token('oauth_token', access_token.oauth_token); - token('oauth_token_secret', access_token.oauth_token_secret); - callback(null, oauth); - } - - get_access_token(oauth_token); - }; + stack.set(object, other); + var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); + stack['delete'](object); + return result; - // # xhr - // - // A single XMLHttpRequest wrapper that does authenticated calls if the - // user has logged in. - oauth.xhr = function(options, callback) { - if (!oauth.authenticated()) { - if (o.auto) { - return oauth.authenticate(run); - } else { - callback('not authenticated', null); - return; - } - } else { - return run(); - } - - function run() { - var params = timenonce(getAuth(o)), - oauth_token_secret = token('oauth_token_secret'), - url = (options.prefix !== false) ? o.url + options.path : options.path, - url_parts = url.replace(/#.*$/, '').split('?', 2), - base_url = url_parts[0], - query = (url_parts.length === 2) ? url_parts[1] : ''; - - // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1 - if ((!options.options || !options.options.header || - options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') && - options.content) { - params = immutable(params, ohauth_1.stringQs(options.content)); + case symbolTag: + if (symbolValueOf) { + return symbolValueOf.call(object) == symbolValueOf.call(other); } - params.oauth_token = token('oauth_token'); - params.oauth_signature = ohauth_1.signature( - o.oauth_secret, - oauth_token_secret, - ohauth_1.baseString(options.method, base_url, immutable(params, ohauth_1.stringQs(query))) - ); - - return ohauth_1.xhr(options.method, url, params, options.content, options.options, done); } - function done(err, xhr) { - if (err) { return callback(err); } - else if (xhr.responseXML) { return callback(err, xhr.responseXML); } - else { return callback(err, xhr.response); } - } - }; + return false; + } + /** + * A specialized version of `baseIsEqualDeep` for objects with support for + * partial deep comparisons. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ - // pre-authorize this object, if we can just get a token and token_secret - // from the start - oauth.preauth = function(c) { - if (!c) { return; } - if (c.oauth_token) { token('oauth_token', c.oauth_token); } - if (c.oauth_token_secret) { token('oauth_token_secret', c.oauth_token_secret); } - return oauth; - }; - oauth.options = function(_) { - if (!arguments.length) { return o; } + function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + objProps = getAllKeys(object), + objLength = objProps.length, + othProps = getAllKeys(other), + othLength = othProps.length; - o = _; - o.url = o.url || 'https://www.openstreetmap.org'; - o.landing = o.landing || 'land.html'; - o.singlepage = o.singlepage || false; + if (objLength != othLength && !isPartial) { + return false; + } - // Optional loading and loading-done functions for nice UI feedback. - // by default, no-ops - o.loading = o.loading || function() {}; - o.done = o.done || function() {}; + var index = objLength; - return oauth.preauth(o); - }; + while (index--) { + var key = objProps[index]; - // 'stamp' an authentication object from `getAuth()` - // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce) - // and timestamp - function timenonce(o) { - o.oauth_timestamp = ohauth_1.timestamp(); - o.oauth_nonce = ohauth_1.nonce(); - return o; - } + if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { + return false; + } + } // Check that cyclic values are equal. - // get/set tokens. These are prefixed with the base URL so that `osm-auth` - // can be used with multiple APIs and the keys in `localStorage` - // will not clash - var token; - if (store_legacy.enabled) { - token = function (x, y) { - if (arguments.length === 1) { return store_legacy.get(o.url + x); } - else if (arguments.length === 2) { return store_legacy.set(o.url + x, y); } - }; - } else { - var storage = {}; - token = function (x, y) { - if (arguments.length === 1) { return storage[o.url + x]; } - else if (arguments.length === 2) { return storage[o.url + x] = y; } - }; - } + var objStacked = stack.get(object); + var othStacked = stack.get(other); - // Get an authentication object. If you just add and remove properties - // from a single object, you'll need to use `delete` to make sure that - // it doesn't contain undesired properties for authentication - function getAuth(o) { - return { - oauth_consumer_key: o.oauth_consumer_key, - oauth_signature_method: 'HMAC-SHA1' - }; - } + if (objStacked && othStacked) { + return objStacked == other && othStacked == object; + } - // potentially pre-authorize - oauth.options(o); + var result = true; + stack.set(object, other); + stack.set(other, object); + var skipCtor = isPartial; - return oauth; - }; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], + othValue = other[key]; - var JXON = new (function () { - var - sValueProp = 'keyValue', sAttributesProp = 'keyAttributes', sAttrPref = '@', /* you can customize these values */ - aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i; + if (customizer) { + var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack); + } // Recursively compare objects (susceptible to call stack limits). - function parseText (sValue) { - if (rIsNull.test(sValue)) { return null; } - if (rIsBool.test(sValue)) { return sValue.toLowerCase() === 'true'; } - if (isFinite(sValue)) { return parseFloat(sValue); } - if (isFinite(Date.parse(sValue))) { return new Date(sValue); } - return sValue; - } - function EmptyTree () { } - EmptyTree.prototype.toString = function () { return 'null'; }; - EmptyTree.prototype.valueOf = function () { return null; }; + if (!(compared === undefined$1 ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) { + result = false; + break; + } - function objectify (vValue) { - return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue); - } + skipCtor || (skipCtor = key == 'constructor'); + } - function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) { - var - nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(), - bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2); + if (result && !skipCtor) { + var objCtor = object.constructor, + othCtor = other.constructor; // Non `Object` object instances with different constructors are not equal. - var - sProp, vContent, nLength = 0, sCollectedTxt = '', - vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true; + if (objCtor != othCtor && 'constructor' in object && 'constructor' in other && !(typeof objCtor == 'function' && objCtor instanceof objCtor && typeof othCtor == 'function' && othCtor instanceof othCtor)) { + result = false; + } + } - if (bChildren) { - for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) { - oNode = oParentNode.childNodes.item(nItem); - if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is 'CDATASection' (4) */ - else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is 'Text' (3) */ - else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is 'Element' (1) */ + stack['delete'](object); + stack['delete'](other); + return result; } - } - - var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt); + /** + * A specialized version of `baseRest` which flattens the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @returns {Function} Returns the new function. + */ - if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; } - for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) { - sProp = aCache[nElId].nodeName.toLowerCase(); - vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr); - if (vResult.hasOwnProperty(sProp)) { - if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; } - vResult[sProp].push(vContent); - } else { - vResult[sProp] = vContent; - nLength++; + function flatRest(func) { + return setToString(overRest(func, undefined$1, flatten), func + ''); } - } - - if (bAttributes) { - var - nAttrLen = oParentNode.attributes.length, - sAPrefix = bNesteAttr ? '' : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult; + /** + * Creates an array of own enumerable property names and symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ - for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) { - oAttrib = oParentNode.attributes.item(nAttrib); - oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim()); - } - if (bNesteAttr) { - if (bFreeze) { Object.freeze(oAttrParent); } - vResult[sAttributesProp] = oAttrParent; - nLength -= nAttrLen - 1; + function getAllKeys(object) { + return baseGetAllKeys(object, keys, getSymbols); } - } + /** + * Creates an array of own and inherited enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ - if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) { - vResult[sValueProp] = vBuiltVal; - } else if (!bHighVerb && nLength === 0 && sCollectedTxt) { - vResult = vBuiltVal; - } - if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); } + function getAllKeysIn(object) { + return baseGetAllKeys(object, keysIn, getSymbolsIn); + } + /** + * Gets metadata for `func`. + * + * @private + * @param {Function} func The function to query. + * @returns {*} Returns the metadata for `func`. + */ - aCache.length = nLevelStart; - return vResult; - } + var getData = !metaMap ? noop : function (func) { + return metaMap.get(func); + }; + /** + * Gets the name of `func`. + * + * @private + * @param {Function} func The function to query. + * @returns {string} Returns the function name. + */ - function loadObjTree (oXMLDoc, oParentEl, oParentObj) { - var vValue, oChild; + function getFuncName(func) { + var result = func.name + '', + array = realNames[result], + length = hasOwnProperty.call(realNames, result) ? array.length : 0; - if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) { - oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */ - } else if (oParentObj.constructor === Date) { - oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString())); - } + while (length--) { + var data = array[length], + otherFunc = data.func; - for (var sName in oParentObj) { - vValue = oParentObj[sName]; - if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */ - if (sName === sValueProp) { - if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); } - } else if (sName === sAttributesProp) { /* verbosity level is 3 */ - for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); } - } else if (sName.charAt(0) === sAttrPref) { - oParentEl.setAttribute(sName.slice(1), vValue); - } else if (vValue.constructor === Array) { - for (var nItem = 0; nItem < vValue.length; nItem++) { - oChild = oXMLDoc.createElement(sName); - loadObjTree(oXMLDoc, oChild, vValue[nItem]); - oParentEl.appendChild(oChild); - } - } else { - oChild = oXMLDoc.createElement(sName); - if (vValue instanceof Object) { - loadObjTree(oXMLDoc, oChild, vValue); - } else if (vValue !== null && vValue !== true) { - oChild.appendChild(oXMLDoc.createTextNode(vValue.toString())); + if (otherFunc == null || otherFunc == func) { + return data.name; + } } - oParentEl.appendChild(oChild); - } - } - } - - this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) { - var _nVerb = arguments.length > 1 && typeof nVerbosity === 'number' ? nVerbosity & 3 : /* put here the default verbosity level: */ 1; - return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3); - }; - this.unbuild = function (oObjTree) { - var oNewDoc = document.implementation.createDocument('', '', null); - loadObjTree(oNewDoc, oNewDoc, oObjTree); - return oNewDoc; - }; + return result; + } + /** + * Gets the argument placeholder value for `func`. + * + * @private + * @param {Function} func The function to inspect. + * @returns {*} Returns the placeholder value. + */ - this.stringify = function (oObjTree) { - return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree)); - }; - })(); - // var myObject = JXON.build(doc); - // we got our javascript object! try: alert(JSON.stringify(myObject)); + function getHolder(func) { + var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func; + return object.placeholder; + } + /** + * Gets the appropriate "iteratee" function. If `_.iteratee` is customized, + * this function returns the custom method, otherwise it returns `baseIteratee`. + * If arguments are provided, the chosen function is invoked with them and + * its result is returned. + * + * @private + * @param {*} [value] The value to convert to an iteratee. + * @param {number} [arity] The arity of the created iteratee. + * @returns {Function} Returns the chosen function or its result. + */ - // var newDoc = JXON.unbuild(myObject); - // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc)); - var tiler$5 = utilTiler(); - var dispatch$6 = dispatch('apiStatusChange', 'authLoading', 'authDone', 'change', 'loading', 'loaded', 'loadedNotes'); - var urlroot = 'https://www.openstreetmap.org'; - var oauth = osmAuth({ - url: urlroot, - oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT', - oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL', - loading: authLoading, - done: authDone - }); + function getIteratee() { + var result = lodash.iteratee || iteratee; + result = result === iteratee ? baseIteratee : result; + return arguments.length ? result(arguments[0], arguments[1]) : result; + } + /** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ - var _blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*']; - var _tileCache = { toLoad: {}, loaded: {}, inflight: {}, seen: {}, rtree: new RBush() }; - var _noteCache = { toLoad: {}, loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: new RBush() }; - var _userCache = { toLoad: {}, user: {} }; - var _cachedApiStatus; - var _changeset = {}; - var _deferred = new Set(); - var _connectionID = 1; - var _tileZoom$3 = 16; - var _noteZoom = 12; - var _rateLimitError; - var _userChangesets; - var _userDetails; - var _off; + function getMapData(map, key) { + var data = map.__data__; + return isKeyable(key) ? data[typeof key == 'string' ? 'string' : 'hash'] : data.map; + } + /** + * Gets the property names, values, and compare flags of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the match data of `object`. + */ - // set a default but also load this from the API status - var _maxWayNodes = 2000; + function getMatchData(object) { + var result = keys(object), + length = result.length; - function authLoading() { - dispatch$6.call('authLoading'); - } + while (length--) { + var key = result[length], + value = object[key]; + result[length] = [key, value, isStrictComparable(value)]; + } + return result; + } + /** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ - function authDone() { - dispatch$6.call('authDone'); - } + function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined$1; + } + /** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ - function abortRequest$5(controllerOrXHR) { - if (controllerOrXHR) { - controllerOrXHR.abort(); - } - } + function getRawTag(value) { + var isOwn = hasOwnProperty.call(value, symToStringTag), + tag = value[symToStringTag]; - function hasInflightRequests(cache) { - return Object.keys(cache.inflight).length; - } + try { + value[symToStringTag] = undefined$1; + var unmasked = true; + } catch (e) {} + var result = nativeObjectToString.call(value); - function abortUnwantedRequests$3(cache, visibleTiles) { - Object.keys(cache.inflight).forEach(function(k) { - if (cache.toLoad[k]) { return; } - if (visibleTiles.find(function(tile) { return k === tile.id; })) { return; } + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } - abortRequest$5(cache.inflight[k]); - delete cache.inflight[k]; - }); - } + return result; + } + /** + * Creates an array of the own enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ - function getLoc(attrs) { - var lon = attrs.lon && attrs.lon.value; - var lat = attrs.lat && attrs.lat.value; - return [parseFloat(lon), parseFloat(lat)]; - } + var getSymbols = !nativeGetSymbols ? stubArray : function (object) { + if (object == null) { + return []; + } + object = Object(object); + return arrayFilter(nativeGetSymbols(object), function (symbol) { + return propertyIsEnumerable.call(object, symbol); + }); + }; + /** + * Creates an array of the own and inherited enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ - function getNodes(obj) { - var elems = obj.getElementsByTagName('nd'); - var nodes = new Array(elems.length); - for (var i = 0, l = elems.length; i < l; i++) { - nodes[i] = 'n' + elems[i].attributes.ref.value; - } - return nodes; - } + var getSymbolsIn = !nativeGetSymbols ? stubArray : function (object) { + var result = []; - function getNodesJSON(obj) { - var elems = obj.nodes; - var nodes = new Array(elems.length); - for (var i = 0, l = elems.length; i < l; i++) { - nodes[i] = 'n' + elems[i]; - } - return nodes; - } + while (object) { + arrayPush(result, getSymbols(object)); + object = getPrototype(object); + } - function getTags(obj) { - var elems = obj.getElementsByTagName('tag'); - var tags = {}; - for (var i = 0, l = elems.length; i < l; i++) { - var attrs = elems[i].attributes; - tags[attrs.k.value] = attrs.v.value; - } + return result; + }; + /** + * Gets the `toStringTag` of `value`. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ - return tags; - } + var getTag = baseGetTag; // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. + if (DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag || Map && getTag(new Map()) != mapTag || Promise && getTag(Promise.resolve()) != promiseTag || Set && getTag(new Set()) != setTag || WeakMap && getTag(new WeakMap()) != weakMapTag) { + getTag = function getTag(value) { + var result = baseGetTag(value), + Ctor = result == objectTag ? value.constructor : undefined$1, + ctorString = Ctor ? toSource(Ctor) : ''; - function getMembers(obj) { - var elems = obj.getElementsByTagName('member'); - var members = new Array(elems.length); - for (var i = 0, l = elems.length; i < l; i++) { - var attrs = elems[i].attributes; - members[i] = { - id: attrs.type.value[0] + attrs.ref.value, - type: attrs.type.value, - role: attrs.role.value - }; - } - return members; - } + if (ctorString) { + switch (ctorString) { + case dataViewCtorString: + return dataViewTag; - function getMembersJSON(obj) { - var elems = obj.members; - var members = new Array(elems.length); - for (var i = 0, l = elems.length; i < l; i++) { - var attrs = elems[i]; - members[i] = { - id: attrs.type[0] + attrs.ref, - type: attrs.type, - role: attrs.role - }; - } - return members; - } + case mapCtorString: + return mapTag; - function getVisible(attrs) { - return (!attrs.visible || attrs.visible.value !== 'false'); - } + case promiseCtorString: + return promiseTag; + case setCtorString: + return setTag; - function parseComments(comments) { - var parsedComments = []; - - // for each comment - for (var i = 0; i < comments.length; i++) { - var comment = comments[i]; - if (comment.nodeName === 'comment') { - var childNodes = comment.childNodes; - var parsedComment = {}; - - for (var j = 0; j < childNodes.length; j++) { - var node = childNodes[j]; - var nodeName = node.nodeName; - if (nodeName === '#text') { continue; } - parsedComment[nodeName] = node.textContent; - - if (nodeName === 'uid') { - var uid = node.textContent; - if (uid && !_userCache.user[uid]) { - _userCache.toLoad[uid] = true; - } - } + case weakMapCtorString: + return weakMapTag; } + } - if (parsedComment) { - parsedComments.push(parsedComment); - } - } - } - return parsedComments; - } + return result; + }; + } + /** + * Gets the view, applying any `transforms` to the `start` and `end` positions. + * + * @private + * @param {number} start The start of the view. + * @param {number} end The end of the view. + * @param {Array} transforms The transformations to apply to the view. + * @returns {Object} Returns an object containing the `start` and `end` + * positions of the view. + */ - function encodeNoteRtree(note) { - return { - minX: note.loc[0], - minY: note.loc[1], - maxX: note.loc[0], - maxY: note.loc[1], - data: note - }; - } + function getView(start, end, transforms) { + var index = -1, + length = transforms.length; + while (++index < length) { + var data = transforms[index], + size = data.size; - var jsonparsers = { + switch (data.type) { + case 'drop': + start += size; + break; - node: function nodeData(obj, uid) { - return new osmNode({ - id: uid, - visible: typeof obj.visible === 'boolean' ? obj.visible : true, - version: obj.version.toString(), - changeset: obj.changeset.toString(), - timestamp: obj.timestamp, - user: obj.user, - uid: obj.uid.toString(), - loc: [parseFloat(obj.lon), parseFloat(obj.lat)], - tags: obj.tags - }); - }, + case 'dropRight': + end -= size; + break; - way: function wayData(obj, uid) { - return new osmWay({ - id: uid, - visible: typeof obj.visible === 'boolean' ? obj.visible : true, - version: obj.version.toString(), - changeset: obj.changeset.toString(), - timestamp: obj.timestamp, - user: obj.user, - uid: obj.uid.toString(), - tags: obj.tags, - nodes: getNodesJSON(obj) - }); - }, + case 'take': + end = nativeMin(end, start + size); + break; - relation: function relationData(obj, uid) { - return new osmRelation({ - id: uid, - visible: typeof obj.visible === 'boolean' ? obj.visible : true, - version: obj.version.toString(), - changeset: obj.changeset.toString(), - timestamp: obj.timestamp, - user: obj.user, - uid: obj.uid.toString(), - tags: obj.tags, - members: getMembersJSON(obj) - }); - } - }; + case 'takeRight': + start = nativeMax(start, end - size); + break; + } + } - function parseJSON(payload, callback, options) { - options = Object.assign({ skipSeen: true }, options); - if (!payload) { - return callback({ message: 'No JSON', status: -1 }); - } + return { + 'start': start, + 'end': end + }; + } + /** + * Extracts wrapper details from the `source` body comment. + * + * @private + * @param {string} source The source to inspect. + * @returns {Array} Returns the wrapper details. + */ - var json = payload; - if (typeof json !== 'object') - { json = JSON.parse(payload); } - if (!json.elements) - { return callback({ message: 'No JSON', status: -1 }); } + function getWrapDetails(source) { + var match = source.match(reWrapDetails); + return match ? match[1].split(reSplitDetails) : []; + } + /** + * Checks if `path` exists on `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @param {Function} hasFunc The function to check properties. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + */ - var children = json.elements; - var handle = window.requestIdleCallback(function() { - var results = []; - var result; - for (var i = 0; i < children.length; i++) { - result = parseChild(children[i]); - if (result) { results.push(result); } - } - callback(null, results); - }); + function hasPath(object, path, hasFunc) { + path = castPath(path, object); + var index = -1, + length = path.length, + result = false; - _deferred.add(handle); + while (++index < length) { + var key = toKey(path[index]); - function parseChild(child) { - var parser = jsonparsers[child.type]; - if (!parser) { return null; } + if (!(result = object != null && hasFunc(object, key))) { + break; + } - var uid; + object = object[key]; + } - uid = osmEntity.id.fromOSM(child.type, child.id); - if (options.skipSeen) { - if (_tileCache.seen[uid]) { return null; } // avoid reparsing a "seen" entity - _tileCache.seen[uid] = true; + if (result || ++index != length) { + return result; } - return parser(child, uid); - } - } + length = object == null ? 0 : object.length; + return !!length && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object)); + } + /** + * Initializes an array clone. + * + * @private + * @param {Array} array The array to clone. + * @returns {Array} Returns the initialized clone. + */ - var parsers = { - node: function nodeData(obj, uid) { - var attrs = obj.attributes; - return new osmNode({ - id: uid, - visible: getVisible(attrs), - version: attrs.version.value, - changeset: attrs.changeset && attrs.changeset.value, - timestamp: attrs.timestamp && attrs.timestamp.value, - user: attrs.user && attrs.user.value, - uid: attrs.uid && attrs.uid.value, - loc: getLoc(attrs), - tags: getTags(obj) - }); - }, - way: function wayData(obj, uid) { - var attrs = obj.attributes; - return new osmWay({ - id: uid, - visible: getVisible(attrs), - version: attrs.version.value, - changeset: attrs.changeset && attrs.changeset.value, - timestamp: attrs.timestamp && attrs.timestamp.value, - user: attrs.user && attrs.user.value, - uid: attrs.uid && attrs.uid.value, - tags: getTags(obj), - nodes: getNodes(obj), - }); - }, + function initCloneArray(array) { + var length = array.length, + result = new array.constructor(length); // Add properties assigned by `RegExp#exec`. - relation: function relationData(obj, uid) { - var attrs = obj.attributes; - return new osmRelation({ - id: uid, - visible: getVisible(attrs), - version: attrs.version.value, - changeset: attrs.changeset && attrs.changeset.value, - timestamp: attrs.timestamp && attrs.timestamp.value, - user: attrs.user && attrs.user.value, - uid: attrs.uid && attrs.uid.value, - tags: getTags(obj), - members: getMembers(obj) - }); - }, + if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) { + result.index = array.index; + result.input = array.input; + } - note: function parseNote(obj, uid) { - var attrs = obj.attributes; - var childNodes = obj.childNodes; - var props = {}; + return result; + } + /** + * Initializes an object clone. + * + * @private + * @param {Object} object The object to clone. + * @returns {Object} Returns the initialized clone. + */ - props.id = uid; - props.loc = getLoc(attrs); - // if notes are coincident, move them apart slightly - var coincident = false; - var epsilon = 0.00001; - do { - if (coincident) { - props.loc = geoVecAdd(props.loc, [epsilon, epsilon]); - } - var bbox = geoExtent(props.loc).bbox(); - coincident = _noteCache.rtree.search(bbox).length; - } while (coincident); - - // parse note contents - for (var i = 0; i < childNodes.length; i++) { - var node = childNodes[i]; - var nodeName = node.nodeName; - if (nodeName === '#text') { continue; } - - // if the element is comments, parse the comments - if (nodeName === 'comments') { - props[nodeName] = parseComments(node.childNodes); - } else { - props[nodeName] = node.textContent; - } - } + function initCloneObject(object) { + return typeof object.constructor == 'function' && !isPrototype(object) ? baseCreate(getPrototype(object)) : {}; + } + /** + * Initializes an object clone based on its `toStringTag`. + * + * **Note:** This function only supports cloning values with tags of + * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`. + * + * @private + * @param {Object} object The object to clone. + * @param {string} tag The `toStringTag` of the object to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the initialized clone. + */ - var note = new osmNote(props); - var item = encodeNoteRtree(note); - _noteCache.note[note.id] = note; - _noteCache.rtree.insert(item); - return note; - }, + function initCloneByTag(object, tag, isDeep) { + var Ctor = object.constructor; - user: function parseUser(obj, uid) { - var attrs = obj.attributes; - var user = { - id: uid, - display_name: attrs.display_name && attrs.display_name.value, - account_created: attrs.account_created && attrs.account_created.value, - changesets_count: '0', - active_blocks: '0' - }; + switch (tag) { + case arrayBufferTag: + return cloneArrayBuffer(object); - var img = obj.getElementsByTagName('img'); - if (img && img[0] && img[0].getAttribute('href')) { - user.image_url = img[0].getAttribute('href'); - } + case boolTag: + case dateTag: + return new Ctor(+object); - var changesets = obj.getElementsByTagName('changesets'); - if (changesets && changesets[0] && changesets[0].getAttribute('count')) { - user.changesets_count = changesets[0].getAttribute('count'); - } + case dataViewTag: + return cloneDataView(object, isDeep); - var blocks = obj.getElementsByTagName('blocks'); - if (blocks && blocks[0]) { - var received = blocks[0].getElementsByTagName('received'); - if (received && received[0] && received[0].getAttribute('active')) { - user.active_blocks = received[0].getAttribute('active'); - } - } + case float32Tag: + case float64Tag: + case int8Tag: + case int16Tag: + case int32Tag: + case uint8Tag: + case uint8ClampedTag: + case uint16Tag: + case uint32Tag: + return cloneTypedArray(object, isDeep); - _userCache.user[uid] = user; - delete _userCache.toLoad[uid]; - return user; - } - }; + case mapTag: + return new Ctor(); + case numberTag: + case stringTag: + return new Ctor(object); - function parseXML(xml, callback, options) { - options = Object.assign({ skipSeen: true }, options); - if (!xml || !xml.childNodes) { - return callback({ message: 'No XML', status: -1 }); - } + case regexpTag: + return cloneRegExp(object); - var root = xml.childNodes[0]; - var children = root.childNodes; + case setTag: + return new Ctor(); - var handle = window.requestIdleCallback(function() { - var results = []; - var result; - for (var i = 0; i < children.length; i++) { - result = parseChild(children[i]); - if (result) { results.push(result); } + case symbolTag: + return cloneSymbol(object); } - callback(null, results); - }); - - _deferred.add(handle); + } + /** + * Inserts wrapper `details` in a comment at the top of the `source` body. + * + * @private + * @param {string} source The source to modify. + * @returns {Array} details The details to insert. + * @returns {string} Returns the modified source. + */ - function parseChild(child) { - var parser = parsers[child.nodeName]; - if (!parser) { return null; } + function insertWrapDetails(source, details) { + var length = details.length; - var uid; - if (child.nodeName === 'user') { - uid = child.attributes.id.value; - if (options.skipSeen && _userCache.user[uid]) { - delete _userCache.toLoad[uid]; - return null; - } + if (!length) { + return source; + } - } else if (child.nodeName === 'note') { - uid = child.getElementsByTagName('id')[0].textContent; + var lastIndex = length - 1; + details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex]; + details = details.join(length > 2 ? ', ' : ' '); + return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n'); + } + /** + * Checks if `value` is a flattenable `arguments` object or array. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. + */ - } else { - uid = osmEntity.id.fromOSM(child.nodeName, child.attributes.id.value); - if (options.skipSeen) { - if (_tileCache.seen[uid]) { return null; } // avoid reparsing a "seen" entity - _tileCache.seen[uid] = true; - } - } - return parser(child, uid); - } - } + function isFlattenable(value) { + return isArray(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]); + } + /** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ - // replace or remove note from rtree - function updateRtree$3(item, replace) { - _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; }); + function isIndex(value, length) { + var type = _typeof(value); - if (replace) { - _noteCache.rtree.insert(item); - } - } + length = length == null ? MAX_SAFE_INTEGER : length; + return !!length && (type == 'number' || type != 'symbol' && reIsUint.test(value)) && value > -1 && value % 1 == 0 && value < length; + } + /** + * Checks if the given arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, + * else `false`. + */ - function wrapcb(thisArg, callback, cid) { - return function(err, result) { - if (err) { - // 400 Bad Request, 401 Unauthorized, 403 Forbidden.. - if (err.status === 400 || err.status === 401 || err.status === 403) { - thisArg.logout(); - } - return callback.call(thisArg, err); + function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } - } else if (thisArg.getConnectionId() !== cid) { - return callback.call(thisArg, { message: 'Connection Switched', status: -1 }); + var type = _typeof(index); - } else { - return callback.call(thisArg, err, result); + if (type == 'number' ? isArrayLike(object) && isIndex(index, object.length) : type == 'string' && index in object) { + return eq(object[index], value); } - }; - } + return false; + } + /** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ - var serviceOsm = { - init: function() { - utilRebind(this, dispatch$6, 'on'); - }, + function isKey(value, object) { + if (isArray(value)) { + return false; + } + var type = _typeof(value); - reset: function() { - Array.from(_deferred).forEach(function(handle) { - window.cancelIdleCallback(handle); - _deferred.delete(handle); - }); + if (type == 'number' || type == 'symbol' || type == 'boolean' || value == null || isSymbol(value)) { + return true; + } - _connectionID++; - _userChangesets = undefined; - _userDetails = undefined; - _rateLimitError = undefined; + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object != null && value in Object(object); + } + /** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ - Object.values(_tileCache.inflight).forEach(abortRequest$5); - Object.values(_noteCache.inflight).forEach(abortRequest$5); - Object.values(_noteCache.inflightPost).forEach(abortRequest$5); - if (_changeset.inflight) { abortRequest$5(_changeset.inflight); } - _tileCache = { toLoad: {}, loaded: {}, inflight: {}, seen: {}, rtree: new RBush() }; - _noteCache = { toLoad: {}, loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: new RBush() }; - _userCache = { toLoad: {}, user: {} }; - _cachedApiStatus = undefined; - _changeset = {}; + function isKeyable(value) { + var type = _typeof(value); - return this; - }, + return type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean' ? value !== '__proto__' : value === null; + } + /** + * Checks if `func` has a lazy counterpart. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` has a lazy counterpart, + * else `false`. + */ - getConnectionId: function() { - return _connectionID; - }, + function isLaziable(func) { + var funcName = getFuncName(func), + other = lodash[funcName]; + + if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) { + return false; + } + if (func === other) { + return true; + } - changesetURL: function(changesetID) { - return urlroot + '/changeset/' + changesetID; - }, + var data = getData(other); + return !!data && func === data[0]; + } + /** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ - changesetsURL: function(center, zoom) { - var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2)); - return urlroot + '/history#map=' + - Math.floor(zoom) + '/' + - center[1].toFixed(precision) + '/' + - center[0].toFixed(precision); - }, + function isMasked(func) { + return !!maskSrcKey && maskSrcKey in func; + } + /** + * Checks if `func` is capable of being masked. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `func` is maskable, else `false`. + */ - entityURL: function(entity) { - return urlroot + '/' + entity.type + '/' + entity.osmId(); - }, + var isMaskable = coreJsData ? isFunction : stubFalse; + /** + * Checks if `value` is likely a prototype object. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. + */ + function isPrototype(value) { + var Ctor = value && value.constructor, + proto = typeof Ctor == 'function' && Ctor.prototype || objectProto; + return value === proto; + } + /** + * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` if suitable for strict + * equality comparisons, else `false`. + */ - historyURL: function(entity) { - return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history'; - }, + function isStrictComparable(value) { + return value === value && !isObject(value); + } + /** + * A specialized version of `matchesProperty` for source values suitable + * for strict equality comparisons, i.e. `===`. + * + * @private + * @param {string} key The key of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ - userURL: function(username) { - return urlroot + '/user/' + username; - }, + function matchesStrictComparable(key, srcValue) { + return function (object) { + if (object == null) { + return false; + } - noteURL: function(note) { - return urlroot + '/note/' + note.id; - }, + return object[key] === srcValue && (srcValue !== undefined$1 || key in Object(object)); + }; + } + /** + * A specialized version of `_.memoize` which clears the memoized function's + * cache when it exceeds `MAX_MEMOIZE_SIZE`. + * + * @private + * @param {Function} func The function to have its output memoized. + * @returns {Function} Returns the new memoized function. + */ - noteReportURL: function(note) { - return urlroot + '/reports/new?reportable_type=Note&reportable_id=' + note.id; - }, + function memoizeCapped(func) { + var result = memoize(func, function (key) { + if (cache.size === MAX_MEMOIZE_SIZE) { + cache.clear(); + } + return key; + }); + var cache = result.cache; + return result; + } + /** + * Merges the function metadata of `source` into `data`. + * + * Merging metadata reduces the number of wrappers used to invoke a function. + * This is possible because methods like `_.bind`, `_.curry`, and `_.partial` + * may be applied regardless of execution order. Methods like `_.ary` and + * `_.rearg` modify function arguments, making the order in which they are + * executed important, preventing the merging of metadata. However, we make + * an exception for a safe combined case where curried functions have `_.ary` + * and or `_.rearg` applied. + * + * @private + * @param {Array} data The destination metadata. + * @param {Array} source The source metadata. + * @returns {Array} Returns `data`. + */ - // Generic method to load data from the OSM API - // Can handle either auth or unauth calls. - loadFromAPI: function(path, callback, options) { - options = Object.assign({ skipSeen: true }, options); - var that = this; - var cid = _connectionID; - function done(err, payload) { - if (that.getConnectionId() !== cid) { - if (callback) { callback({ message: 'Connection Switched', status: -1 }); } - return; - } + function mergeData(data, source) { + var bitmask = data[1], + srcBitmask = source[1], + newBitmask = bitmask | srcBitmask, + isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG); + var isCombo = srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_CURRY_FLAG || srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_REARG_FLAG && data[7].length <= source[8] || srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG) && source[7].length <= source[8] && bitmask == WRAP_CURRY_FLAG; // Exit early if metadata can't be merged. - var isAuthenticated = that.authenticated(); + if (!(isCommon || isCombo)) { + return data; + } // Use source `thisArg` if available. - // 400 Bad Request, 401 Unauthorized, 403 Forbidden - // Logout and retry the request.. - if (isAuthenticated && err && err.status && - (err.status === 400 || err.status === 401 || err.status === 403)) { - that.logout(); - that.loadFromAPI(path, callback, options); - // else, no retry.. - } else { - // 509 Bandwidth Limit Exceeded, 429 Too Many Requests - // Set the rateLimitError flag and trigger a warning.. - if (!isAuthenticated && !_rateLimitError && err && err.status && - (err.status === 509 || err.status === 429)) { - _rateLimitError = err; - dispatch$6.call('change'); - that.reloadApiStatus(); - - } else if ((err && _cachedApiStatus === 'online') || - (!err && _cachedApiStatus !== 'online')) { - // If the response's error state doesn't match the status, - // it's likely we lost or gained the connection so reload the status - that.reloadApiStatus(); - } + if (srcBitmask & WRAP_BIND_FLAG) { + data[2] = source[2]; // Set when currying a bound function. - if (callback) { - if (err) { - return callback(err); - } else { - if (path.indexOf('.json') !== -1) { - return parseJSON(payload, callback, options); - } else { - return parseXML(payload, callback, options); - } - } - } - } - } + newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG; + } // Compose partial arguments. - if (this.authenticated()) { - return oauth.xhr({ method: 'GET', path: path }, done); - } else { - var url = urlroot + path; - var controller = new AbortController(); - d3_json(url, { signal: controller.signal }) - .then(function(data) { - done(null, data); - }) - .catch(function(err) { - if (err.name === 'AbortError') { return; } - // d3-fetch includes status in the error message, - // but we can't access the response itself - // https://github.com/d3/d3-fetch/issues/27 - var match = err.message.match(/^\d{3}/); - if (match) { - done({ status: +match[0], statusText: err.message }); - } else { - done(err.message); - } - }); - return controller; - } - }, + var value = source[3]; - // Load a single entity by id (ways and relations use the `/full` call) - // GET /api/0.6/node/#id - // GET /api/0.6/[way|relation]/#id/full - loadEntity: function(id, callback) { - var type = osmEntity.id.type(id); - var osmID = osmEntity.id.toOSM(id); - var options = { skipSeen: false }; + if (value) { + var partials = data[3]; + data[3] = partials ? composeArgs(partials, value, source[4]) : value; + data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4]; + } // Compose partial right arguments. - this.loadFromAPI( - '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : '') + '.json', - function(err, entities) { - if (callback) { callback(err, { data: entities }); } - }, - options - ); - }, + value = source[5]; - // Load a single entity with a specific version - // GET /api/0.6/[node|way|relation]/#id/#version - loadEntityVersion: function(id, version, callback) { - var type = osmEntity.id.type(id); - var osmID = osmEntity.id.toOSM(id); - var options = { skipSeen: false }; + if (value) { + partials = data[5]; + data[5] = partials ? composeArgsRight(partials, value, source[6]) : value; + data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6]; + } // Use source `argPos` if available. - this.loadFromAPI( - '/api/0.6/' + type + '/' + osmID + '/' + version + '.json', - function(err, entities) { - if (callback) { callback(err, { data: entities }); } - }, - options - ); - }, + value = source[7]; - // Load multiple entities in chunks - // (note: callback may be called multiple times) - // Unlike `loadEntity`, child nodes and members are not fetched - // GET /api/0.6/[nodes|ways|relations]?#parameters - loadMultiple: function(ids, callback) { - var that = this; - var groups = utilArrayGroupBy(utilArrayUniq(ids), osmEntity.id.type); - - Object.keys(groups).forEach(function(k) { - var type = k + 's'; // nodes, ways, relations - var osmIDs = groups[k].map(function(id) { return osmEntity.id.toOSM(id); }); - var options = { skipSeen: false }; - - utilArrayChunk(osmIDs, 150).forEach(function(arr) { - that.loadFromAPI( - '/api/0.6/' + type + '.json?' + type + '=' + arr.join(), - function(err, entities) { - if (callback) { callback(err, { data: entities }); } - }, - options - ); - }); - }); - }, + if (value) { + data[7] = value; + } // Use source `ary` if it's smaller. - // Create, upload, and close a changeset - // PUT /api/0.6/changeset/create - // POST /api/0.6/changeset/#id/upload - // PUT /api/0.6/changeset/#id/close - putChangeset: function(changeset, changes, callback) { - var cid = _connectionID; + if (srcBitmask & WRAP_ARY_FLAG) { + data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]); + } // Use source `arity` if one is not provided. - if (_changeset.inflight) { - return callback({ message: 'Changeset already inflight', status: -2 }, changeset); - } else if (_changeset.open) { // reuse existing open changeset.. - return createdChangeset.call(this, null, _changeset.open); + if (data[9] == null) { + data[9] = source[9]; + } // Use source `func` and merge bitmasks. - } else { // Open a new changeset.. - var options = { - method: 'PUT', - path: '/api/0.6/changeset/create', - options: { header: { 'Content-Type': 'text/xml' } }, - content: JXON.stringify(changeset.asJXON()) - }; - _changeset.inflight = oauth.xhr( - options, - wrapcb(this, createdChangeset, cid) - ); - } + data[0] = source[0]; + data[1] = newBitmask; + return data; + } + /** + * This function is like + * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * except that it includes inherited enumerable properties. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ - function createdChangeset(err, changesetID) { - _changeset.inflight = null; - if (err) { return callback(err, changeset); } - _changeset.open = changesetID; - changeset = changeset.update({ id: changesetID }); + function nativeKeysIn(object) { + var result = []; - // Upload the changeset.. - var options = { - method: 'POST', - path: '/api/0.6/changeset/' + changesetID + '/upload', - options: { header: { 'Content-Type': 'text/xml' } }, - content: JXON.stringify(changeset.osmChangeJXON(changes)) - }; - _changeset.inflight = oauth.xhr( - options, - wrapcb(this, uploadedChangeset, cid) - ); - } - - - function uploadedChangeset(err) { - _changeset.inflight = null; - if (err) { return callback(err, changeset); } - - // Upload was successful, safe to call the callback. - // Add delay to allow for postgres replication #1646 #2678 - window.setTimeout(function() { callback(null, changeset); }, 2500); - _changeset.open = null; - - // At this point, we don't really care if the connection was switched.. - // Only try to close the changeset if we're still talking to the same server. - if (this.getConnectionId() === cid) { - // Still attempt to close changeset, but ignore response because #2667 - oauth.xhr({ - method: 'PUT', - path: '/api/0.6/changeset/' + changeset.id + '/close', - options: { header: { 'Content-Type': 'text/xml' } } - }, function() { return true; }); - } + if (object != null) { + for (var key in Object(object)) { + result.push(key); + } } - }, + return result; + } + /** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ - // Load multiple users in chunks - // (note: callback may be called multiple times) - // GET /api/0.6/users?users=#id1,#id2,...,#idn - loadUsers: function(uids, callback) { - var toLoad = []; - var cached = []; - utilArrayUniq(uids).forEach(function(uid) { - if (_userCache.user[uid]) { - delete _userCache.toLoad[uid]; - cached.push(_userCache.user[uid]); - } else { - toLoad.push(uid); - } - }); + function objectToString(value) { + return nativeObjectToString.call(value); + } + /** + * A specialized version of `baseRest` which transforms the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @param {Function} transform The rest array transform. + * @returns {Function} Returns the new function. + */ - if (cached.length || !this.authenticated()) { - callback(undefined, cached); - if (!this.authenticated()) { return; } // require auth - } - utilArrayChunk(toLoad, 150).forEach(function(arr) { - oauth.xhr( - { method: 'GET', path: '/api/0.6/users?users=' + arr.join() }, - wrapcb(this, done, _connectionID) - ); - }.bind(this)); + function overRest(func, start, transform) { + start = nativeMax(start === undefined$1 ? func.length - 1 : start, 0); + return function () { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + array = Array(length); - function done(err, xml) { - if (err) { return callback(err); } + while (++index < length) { + array[index] = args[start + index]; + } - var options = { skipSeen: true }; - return parseXML(xml, function(err, results) { - if (err) { - return callback(err); - } else { - return callback(undefined, results); - } - }, options); - } - }, + index = -1; + var otherArgs = Array(start + 1); + while (++index < start) { + otherArgs[index] = args[index]; + } - // Load a given user by id - // GET /api/0.6/user/#id - loadUser: function(uid, callback) { - if (_userCache.user[uid] || !this.authenticated()) { // require auth - delete _userCache.toLoad[uid]; - return callback(undefined, _userCache.user[uid]); - } + otherArgs[start] = transform(array); + return apply(func, this, otherArgs); + }; + } + /** + * Gets the parent value at `path` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} path The path to get the parent value of. + * @returns {*} Returns the parent value. + */ - oauth.xhr( - { method: 'GET', path: '/api/0.6/user/' + uid }, - wrapcb(this, done, _connectionID) - ); - function done(err, xml) { - if (err) { return callback(err); } + function parent(object, path) { + return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1)); + } + /** + * Reorder `array` according to the specified indexes where the element at + * the first index is assigned as the first element, the element at + * the second index is assigned as the second element, and so on. + * + * @private + * @param {Array} array The array to reorder. + * @param {Array} indexes The arranged array indexes. + * @returns {Array} Returns `array`. + */ - var options = { skipSeen: true }; - return parseXML(xml, function(err, results) { - if (err) { - return callback(err); - } else { - return callback(undefined, results[0]); - } - }, options); - } - }, + function reorder(array, indexes) { + var arrLength = array.length, + length = nativeMin(indexes.length, arrLength), + oldArray = copyArray(array); - // Load the details of the logged-in user - // GET /api/0.6/user/details - userDetails: function(callback) { - if (_userDetails) { // retrieve cached - return callback(undefined, _userDetails); + while (length--) { + var index = indexes[length]; + array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined$1; } - oauth.xhr( - { method: 'GET', path: '/api/0.6/user/details' }, - wrapcb(this, done, _connectionID) - ); + return array; + } + /** + * Gets the value at `key`, unless `key` is "__proto__" or "constructor". + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ - function done(err, xml) { - if (err) { return callback(err); } - var options = { skipSeen: false }; - return parseXML(xml, function(err, results) { - if (err) { - return callback(err); - } else { - _userDetails = results[0]; - return callback(undefined, _userDetails); - } - }, options); + function safeGet(object, key) { + if (key === 'constructor' && typeof object[key] === 'function') { + return; } - }, - - // Load previous changesets for the logged in user - // GET /api/0.6/changesets?user=#id - userChangesets: function(callback) { - if (_userChangesets) { // retrieve cached - return callback(undefined, _userChangesets); + if (key == '__proto__') { + return; } - this.userDetails( - wrapcb(this, gotDetails, _connectionID) - ); + return object[key]; + } + /** + * Sets metadata for `func`. + * + * **Note:** If this function becomes hot, i.e. is invoked a lot in a short + * period of time, it will trip its breaker and transition to an identity + * function to avoid garbage collection pauses in V8. See + * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070) + * for more details. + * + * @private + * @param {Function} func The function to associate metadata with. + * @param {*} data The metadata. + * @returns {Function} Returns `func`. + */ - function gotDetails(err, user) { - if (err) { return callback(err); } + var setData = shortOut(baseSetData); + /** + * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout). + * + * @private + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @returns {number|Object} Returns the timer id or timeout object. + */ - oauth.xhr( - { method: 'GET', path: '/api/0.6/changesets?user=' + user.id }, - wrapcb(this, done, _connectionID) - ); - } + var setTimeout = ctxSetTimeout || function (func, wait) { + return root.setTimeout(func, wait); + }; + /** + * Sets the `toString` method of `func` to return `string`. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ - function done(err, xml) { - if (err) { return callback(err); } - _userChangesets = Array.prototype.map.call( - xml.getElementsByTagName('changeset'), - function (changeset) { return { tags: getTags(changeset) }; } - ).filter(function (changeset) { - var comment = changeset.tags.comment; - return comment && comment !== ''; - }); + var setToString = shortOut(baseSetToString); + /** + * Sets the `toString` method of `wrapper` to mimic the source of `reference` + * with wrapper details in a comment at the top of the source body. + * + * @private + * @param {Function} wrapper The function to modify. + * @param {Function} reference The reference function. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @returns {Function} Returns `wrapper`. + */ - return callback(undefined, _userChangesets); - } - }, + function setWrapToString(wrapper, reference, bitmask) { + var source = reference + ''; + return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask))); + } + /** + * Creates a function that'll short out and invoke `identity` instead + * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` + * milliseconds. + * + * @private + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new shortable function. + */ - // Fetch the status of the OSM API - // GET /api/capabilities - status: function(callback) { - var url = urlroot + '/api/capabilities'; - var errback = wrapcb(this, done, _connectionID); - d3_xml(url) - .then(function(data) { errback(null, data); }) - .catch(function(err) { errback(err.message); }); + function shortOut(func) { + var count = 0, + lastCalled = 0; + return function () { + var stamp = nativeNow(), + remaining = HOT_SPAN - (stamp - lastCalled); + lastCalled = stamp; - function done(err, xml) { - if (err) { - // the status is null if no response could be retrieved - return callback(err, null); + if (remaining > 0) { + if (++count >= HOT_COUNT) { + return arguments[0]; } + } else { + count = 0; + } - // update blacklists - var elements = xml.getElementsByTagName('blacklist'); - var regexes = []; - for (var i = 0; i < elements.length; i++) { - var regex = elements[i].getAttribute('regex'); // needs unencode? - if (regex) { - regexes.push(regex); - } - } - if (regexes.length) { - _blacklists = regexes; - } + return func.apply(undefined$1, arguments); + }; + } + /** + * A specialized version of `_.shuffle` which mutates and sets the size of `array`. + * + * @private + * @param {Array} array The array to shuffle. + * @param {number} [size=array.length] The size of `array`. + * @returns {Array} Returns `array`. + */ - if (_rateLimitError) { - return callback(_rateLimitError, 'rateLimited'); - } else { - var waynodes = xml.getElementsByTagName('waynodes'); - var maxWayNodes = waynodes.length && parseInt(waynodes[0].getAttribute('maximum'), 10); - if (maxWayNodes && isFinite(maxWayNodes)) { _maxWayNodes = maxWayNodes; } - var apiStatus = xml.getElementsByTagName('status'); - var val = apiStatus[0].getAttribute('api'); - return callback(undefined, val); - } - } - }, + function shuffleSelf(array, size) { + var index = -1, + length = array.length, + lastIndex = length - 1; + size = size === undefined$1 ? length : size; - // Calls `status` and dispatches an `apiStatusChange` event if the returned - // status differs from the cached status. - reloadApiStatus: function() { - // throttle to avoid unncessary API calls - if (!this.throttledReloadApiStatus) { - var that = this; - this.throttledReloadApiStatus = throttle(function() { - that.status(function(err, status) { - if (status !== _cachedApiStatus) { - _cachedApiStatus = status; - dispatch$6.call('apiStatusChange', that, err, status); - } - }); - }, 500); + while (++index < size) { + var rand = baseRandom(index, lastIndex), + value = array[rand]; + array[rand] = array[index]; + array[index] = value; } - this.throttledReloadApiStatus(); - }, + array.length = size; + return array; + } + /** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ - // Returns the maximum number of nodes a single way can have - maxWayNodes: function() { - return _maxWayNodes; - }, + var stringToPath = memoizeCapped(function (string) { + var result = []; - // Load data (entities) from the API in tiles - // GET /api/0.6/map?bbox= - loadTiles: function(projection, callback) { - if (_off) { return; } + if (string.charCodeAt(0) === 46 + /* . */ + ) { + result.push(''); + } - // determine the needed tiles to cover the view - var tiles = tiler$5.zoomExtent([_tileZoom$3, _tileZoom$3]).getTiles(projection); + string.replace(rePropName, function (match, number, quote, subString) { + result.push(quote ? subString.replace(reEscapeChar, '$1') : number || match); + }); + return result; + }); + /** + * Converts `value` to a string key if it's not a string or symbol. + * + * @private + * @param {*} value The value to inspect. + * @returns {string|symbol} Returns the key. + */ - // abort inflight requests that are no longer needed - var hadRequests = hasInflightRequests(_tileCache); - abortUnwantedRequests$3(_tileCache, tiles); - if (hadRequests && !hasInflightRequests(_tileCache)) { - dispatch$6.call('loaded'); // stop the spinner + function toKey(value) { + if (typeof value == 'string' || isSymbol(value)) { + return value; } - // issue new requests.. - tiles.forEach(function(tile) { - this.loadTile(tile, callback); - }, this); - }, + var result = value + ''; + return result == '0' && 1 / value == -INFINITY ? '-0' : result; + } + /** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to convert. + * @returns {string} Returns the source code. + */ - // Load a single data tile - // GET /api/0.6/map?bbox= - loadTile: function(tile, callback) { - if (_off) { return; } - if (_tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) { return; } + function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} - if (!hasInflightRequests(_tileCache)) { - dispatch$6.call('loading'); // start the spinner + try { + return func + ''; + } catch (e) {} } - var path = '/api/0.6/map.json?bbox='; - var options = { skipSeen: true }; - - _tileCache.inflight[tile.id] = this.loadFromAPI( - path + tile.extent.toParam(), - tileCallback, - options - ); + return ''; + } + /** + * Updates wrapper `details` based on `bitmask` flags. + * + * @private + * @returns {Array} details The details to modify. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @returns {Array} Returns `details`. + */ - function tileCallback(err, parsed) { - delete _tileCache.inflight[tile.id]; - if (!err) { - delete _tileCache.toLoad[tile.id]; - _tileCache.loaded[tile.id] = true; - var bbox = tile.extent.bbox(); - bbox.id = tile.id; - _tileCache.rtree.insert(bbox); - } - if (callback) { - callback(err, Object.assign({ data: parsed }, tile)); - } - if (!hasInflightRequests(_tileCache)) { - dispatch$6.call('loaded'); // stop the spinner - } - } - }, + function updateWrapDetails(details, bitmask) { + arrayEach(wrapFlags, function (pair) { + var value = '_.' + pair[0]; - isDataLoaded: function(loc) { - var bbox = { minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1] }; - return _tileCache.rtree.collides(bbox); - }, + if (bitmask & pair[1] && !arrayIncludes(details, value)) { + details.push(value); + } + }); + return details.sort(); + } + /** + * Creates a clone of `wrapper`. + * + * @private + * @param {Object} wrapper The wrapper to clone. + * @returns {Object} Returns the cloned wrapper. + */ - // load the tile that covers the given `loc` - loadTileAtLoc: function(loc, callback) { - // Back off if the toLoad queue is filling up.. re #6417 - // (Currently `loadTileAtLoc` requests are considered low priority - used by operations to - // let users safely edit geometries which extend to unloaded tiles. We can drop some.) - if (Object.keys(_tileCache.toLoad).length > 50) { return; } + function wrapperClone(wrapper) { + if (wrapper instanceof LazyWrapper) { + return wrapper.clone(); + } - var k = geoZoomToScale(_tileZoom$3 + 1); - var offset = geoRawMercator().scale(k)(loc); - var projection = geoRawMercator().transform({ k: k, x: -offset[0], y: -offset[1] }); - var tiles = tiler$5.zoomExtent([_tileZoom$3, _tileZoom$3]).getTiles(projection); + var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__); + result.__actions__ = copyArray(wrapper.__actions__); + result.__index__ = wrapper.__index__; + result.__values__ = wrapper.__values__; + return result; + } + /*------------------------------------------------------------------------*/ - tiles.forEach(function(tile) { - if (_tileCache.toLoad[tile.id] || _tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) { return; } + /** + * Creates an array of elements split into groups the length of `size`. + * If `array` can't be split evenly, the final chunk will be the remaining + * elements. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to process. + * @param {number} [size=1] The length of each chunk + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the new array of chunks. + * @example + * + * _.chunk(['a', 'b', 'c', 'd'], 2); + * // => [['a', 'b'], ['c', 'd']] + * + * _.chunk(['a', 'b', 'c', 'd'], 3); + * // => [['a', 'b', 'c'], ['d']] + */ - _tileCache.toLoad[tile.id] = true; - this.loadTile(tile, callback); - }, this); - }, + function chunk(array, size, guard) { + if (guard ? isIterateeCall(array, size, guard) : size === undefined$1) { + size = 1; + } else { + size = nativeMax(toInteger(size), 0); + } - // Load notes from the API in tiles - // GET /api/0.6/notes?bbox= - loadNotes: function(projection, noteOptions) { - noteOptions = Object.assign({ limit: 10000, closed: 7 }, noteOptions); - if (_off) { return; } + var length = array == null ? 0 : array.length; - var that = this; - var path = '/api/0.6/notes?limit=' + noteOptions.limit + '&closed=' + noteOptions.closed + '&bbox='; - var throttleLoadUsers = throttle(function() { - var uids = Object.keys(_userCache.toLoad); - if (!uids.length) { return; } - that.loadUsers(uids, function() {}); // eagerly load user details - }, 750); - - // determine the needed tiles to cover the view - var tiles = tiler$5.zoomExtent([_noteZoom, _noteZoom]).getTiles(projection); - - // abort inflight requests that are no longer needed - abortUnwantedRequests$3(_noteCache, tiles); - - // issue new requests.. - tiles.forEach(function(tile) { - if (_noteCache.loaded[tile.id] || _noteCache.inflight[tile.id]) { return; } - - var options = { skipSeen: false }; - _noteCache.inflight[tile.id] = that.loadFromAPI( - path + tile.extent.toParam(), - function(err) { - delete _noteCache.inflight[tile.id]; - if (!err) { - _noteCache.loaded[tile.id] = true; - } - throttleLoadUsers(); - dispatch$6.call('loadedNotes'); - }, - options - ); - }); - }, + if (!length || size < 1) { + return []; + } + var index = 0, + resIndex = 0, + result = Array(nativeCeil(length / size)); - // Create a note - // POST /api/0.6/notes?params - postNoteCreate: function(note, callback) { - if (!this.authenticated()) { - return callback({ message: 'Not Authenticated', status: -3 }, note); + while (index < length) { + result[resIndex++] = baseSlice(array, index, index += size); } - if (_noteCache.inflightPost[note.id]) { - return callback({ message: 'Note update already inflight', status: -2 }, note); - } - - if (!note.loc[0] || !note.loc[1] || !note.newComment) { return; } // location & description required - var comment = note.newComment; - if (note.newCategory && note.newCategory !== 'None') { comment += ' #' + note.newCategory; } + return result; + } + /** + * Creates an array with all falsey values removed. The values `false`, `null`, + * `0`, `""`, `undefined`, and `NaN` are falsey. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to compact. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.compact([0, 1, false, 2, '', 3]); + * // => [1, 2, 3] + */ - var path = '/api/0.6/notes?' + utilQsString({ lon: note.loc[0], lat: note.loc[1], text: comment }); - _noteCache.inflightPost[note.id] = oauth.xhr( - { method: 'POST', path: path }, - wrapcb(this, done, _connectionID) - ); + function compact(array) { + var index = -1, + length = array == null ? 0 : array.length, + resIndex = 0, + result = []; + while (++index < length) { + var value = array[index]; - function done(err, xml) { - delete _noteCache.inflightPost[note.id]; - if (err) { return callback(err); } + if (value) { + result[resIndex++] = value; + } + } - // we get the updated note back, remove from caches and reparse.. - this.removeNote(note); + return result; + } + /** + * Creates a new array concatenating `array` with any additional arrays + * and/or values. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to concatenate. + * @param {...*} [values] The values to concatenate. + * @returns {Array} Returns the new concatenated array. + * @example + * + * var array = [1]; + * var other = _.concat(array, 2, [3], [[4]]); + * + * console.log(other); + * // => [1, 2, 3, [4]] + * + * console.log(array); + * // => [1] + */ - var options = { skipSeen: false }; - return parseXML(xml, function(err, results) { - if (err) { - return callback(err); - } else { - return callback(undefined, results[0]); - } - }, options); - } - }, + function concat() { + var length = arguments.length; - // Update a note - // POST /api/0.6/notes/#id/comment?text=comment - // POST /api/0.6/notes/#id/close?text=comment - // POST /api/0.6/notes/#id/reopen?text=comment - postNoteUpdate: function(note, newStatus, callback) { - if (!this.authenticated()) { - return callback({ message: 'Not Authenticated', status: -3 }, note); - } - if (_noteCache.inflightPost[note.id]) { - return callback({ message: 'Note update already inflight', status: -2 }, note); + if (!length) { + return []; } - var action; - if (note.status !== 'closed' && newStatus === 'closed') { - action = 'close'; - } else if (note.status !== 'open' && newStatus === 'open') { - action = 'reopen'; - } else { - action = 'comment'; - if (!note.newComment) { return; } // when commenting, comment required - } + var args = Array(length - 1), + array = arguments[0], + index = length; - var path = '/api/0.6/notes/' + note.id + '/' + action; - if (note.newComment) { - path += '?' + utilQsString({ text: note.newComment }); + while (index--) { + args[index - 1] = arguments[index]; } - _noteCache.inflightPost[note.id] = oauth.xhr( - { method: 'POST', path: path }, - wrapcb(this, done, _connectionID) - ); - + return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1)); + } + /** + * Creates an array of `array` values not included in the other given arrays + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. The order and references of result values are + * determined by the first array. + * + * **Note:** Unlike `_.pullAll`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @returns {Array} Returns the new array of filtered values. + * @see _.without, _.xor + * @example + * + * _.difference([2, 1], [2, 3]); + * // => [1] + */ - function done(err, xml) { - delete _noteCache.inflightPost[note.id]; - if (err) { return callback(err); } - // we get the updated note back, remove from caches and reparse.. - this.removeNote(note); + var difference = baseRest(function (array, values) { + return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true)) : []; + }); + /** + * This method is like `_.difference` except that it accepts `iteratee` which + * is invoked for each element of `array` and `values` to generate the criterion + * by which they're compared. The order and references of result values are + * determined by the first array. The iteratee is invoked with one argument: + * (value). + * + * **Note:** Unlike `_.pullAllBy`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [1.2] + * + * // The `_.property` iteratee shorthand. + * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x'); + * // => [{ 'x': 2 }] + */ - // update closed note cache - used to populate `closed:note` changeset tag - if (action === 'close') { - _noteCache.closed[note.id] = true; - } else if (action === 'reopen') { - delete _noteCache.closed[note.id]; - } + var differenceBy = baseRest(function (array, values) { + var iteratee = last(values); - var options = { skipSeen: false }; - return parseXML(xml, function(err, results) { - if (err) { - return callback(err); - } else { - return callback(undefined, results[0]); - } - }, options); + if (isArrayLikeObject(iteratee)) { + iteratee = undefined$1; } - }, - - - switch: function(options) { - urlroot = options.urlroot; - - oauth.options(Object.assign({ - url: urlroot, - loading: authLoading, - done: authDone - }, options)); - - this.reset(); - this.userChangesets(function() {}); // eagerly load user details/changesets - dispatch$6.call('change'); - return this; - }, + return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)) : []; + }); + /** + * This method is like `_.difference` except that it accepts `comparator` + * which is invoked to compare elements of `array` to `values`. The order and + * references of result values are determined by the first array. The comparator + * is invoked with two arguments: (arrVal, othVal). + * + * **Note:** Unlike `_.pullAllWith`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * + * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual); + * // => [{ 'x': 2, 'y': 1 }] + */ - toggle: function(val) { - _off = !val; - return this; - }, + var differenceWith = baseRest(function (array, values) { + var comparator = last(values); + if (isArrayLikeObject(comparator)) { + comparator = undefined$1; + } - isChangesetInflight: function() { - return !!_changeset.inflight; - }, + return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined$1, comparator) : []; + }); + /** + * Creates a slice of `array` with `n` elements dropped from the beginning. + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to drop. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.drop([1, 2, 3]); + * // => [2, 3] + * + * _.drop([1, 2, 3], 2); + * // => [3] + * + * _.drop([1, 2, 3], 5); + * // => [] + * + * _.drop([1, 2, 3], 0); + * // => [1, 2, 3] + */ + function drop(array, n, guard) { + var length = array == null ? 0 : array.length; - // get/set cached data - // This is used to save/restore the state when entering/exiting the walkthrough - // Also used for testing purposes. - caches: function(obj) { - function cloneCache(source) { - var target = {}; - Object.keys(source).forEach(function(k) { - if (k === 'rtree') { - target.rtree = new RBush().fromJSON(source.rtree.toJSON()); // clone rbush - } else if (k === 'note') { - target.note = {}; - Object.keys(source.note).forEach(function(id) { - target.note[id] = osmNote(source.note[id]); // copy notes - }); - } else { - target[k] = JSON.parse(JSON.stringify(source[k])); // clone deep - } - }); - return target; + if (!length) { + return []; } - if (!arguments.length) { - return { - tile: cloneCache(_tileCache), - note: cloneCache(_noteCache), - user: cloneCache(_userCache) - }; - } + n = guard || n === undefined$1 ? 1 : toInteger(n); + return baseSlice(array, n < 0 ? 0 : n, length); + } + /** + * Creates a slice of `array` with `n` elements dropped from the end. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to drop. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.dropRight([1, 2, 3]); + * // => [1, 2] + * + * _.dropRight([1, 2, 3], 2); + * // => [1] + * + * _.dropRight([1, 2, 3], 5); + * // => [] + * + * _.dropRight([1, 2, 3], 0); + * // => [1, 2, 3] + */ - // access caches directly for testing (e.g., loading notes rtree) - if (obj === 'get') { - return { - tile: _tileCache, - note: _noteCache, - user: _userCache - }; - } - if (obj.tile) { - _tileCache = obj.tile; - _tileCache.inflight = {}; - } - if (obj.note) { - _noteCache = obj.note; - _noteCache.inflight = {}; - _noteCache.inflightPost = {}; - } - if (obj.user) { - _userCache = obj.user; + function dropRight(array, n, guard) { + var length = array == null ? 0 : array.length; + + if (!length) { + return []; } - return this; - }, + n = guard || n === undefined$1 ? 1 : toInteger(n); + n = length - n; + return baseSlice(array, 0, n < 0 ? 0 : n); + } + /** + * Creates a slice of `array` excluding elements dropped from the end. + * Elements are dropped until `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.dropRightWhile(users, function(o) { return !o.active; }); + * // => objects for ['barney'] + * + * // The `_.matches` iteratee shorthand. + * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false }); + * // => objects for ['barney', 'fred'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.dropRightWhile(users, ['active', false]); + * // => objects for ['barney'] + * + * // The `_.property` iteratee shorthand. + * _.dropRightWhile(users, 'active'); + * // => objects for ['barney', 'fred', 'pebbles'] + */ - logout: function() { - _userChangesets = undefined; - _userDetails = undefined; - oauth.logout(); - dispatch$6.call('change'); - return this; - }, + function dropRightWhile(array, predicate) { + return array && array.length ? baseWhile(array, getIteratee(predicate, 3), true, true) : []; + } + /** + * Creates a slice of `array` excluding elements dropped from the beginning. + * Elements are dropped until `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.dropWhile(users, function(o) { return !o.active; }); + * // => objects for ['pebbles'] + * + * // The `_.matches` iteratee shorthand. + * _.dropWhile(users, { 'user': 'barney', 'active': false }); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.dropWhile(users, ['active', false]); + * // => objects for ['pebbles'] + * + * // The `_.property` iteratee shorthand. + * _.dropWhile(users, 'active'); + * // => objects for ['barney', 'fred', 'pebbles'] + */ - authenticated: function() { - return oauth.authenticated(); - }, + function dropWhile(array, predicate) { + return array && array.length ? baseWhile(array, getIteratee(predicate, 3), true) : []; + } + /** + * Fills elements of `array` with `value` from `start` up to, but not + * including, `end`. + * + * **Note:** This method mutates `array`. + * + * @static + * @memberOf _ + * @since 3.2.0 + * @category Array + * @param {Array} array The array to fill. + * @param {*} value The value to fill `array` with. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns `array`. + * @example + * + * var array = [1, 2, 3]; + * + * _.fill(array, 'a'); + * console.log(array); + * // => ['a', 'a', 'a'] + * + * _.fill(Array(3), 2); + * // => [2, 2, 2] + * + * _.fill([4, 6, 8, 10], '*', 1, 3); + * // => [4, '*', '*', 10] + */ - authenticate: function(callback) { - var that = this; - var cid = _connectionID; - _userChangesets = undefined; - _userDetails = undefined; + function fill(array, value, start, end) { + var length = array == null ? 0 : array.length; - function done(err, res) { - if (err) { - if (callback) { callback(err); } - return; - } - if (that.getConnectionId() !== cid) { - if (callback) { callback({ message: 'Connection Switched', status: -1 }); } - return; - } - _rateLimitError = undefined; - dispatch$6.call('change'); - if (callback) { callback(err, res); } - that.userChangesets(function() {}); // eagerly load user details/changesets + if (!length) { + return []; } - return oauth.authenticate(done); - }, - + if (start && typeof start != 'number' && isIterateeCall(array, value, start)) { + start = 0; + end = length; + } - imageryBlacklists: function() { - return _blacklists; - }, + return baseFill(array, value, start, end); + } + /** + * This method is like `_.find` except that it returns the index of the first + * element `predicate` returns truthy for instead of the element itself. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.findIndex(users, function(o) { return o.user == 'barney'; }); + * // => 0 + * + * // The `_.matches` iteratee shorthand. + * _.findIndex(users, { 'user': 'fred', 'active': false }); + * // => 1 + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findIndex(users, ['active', false]); + * // => 0 + * + * // The `_.property` iteratee shorthand. + * _.findIndex(users, 'active'); + * // => 2 + */ - tileZoom: function(val) { - if (!arguments.length) { return _tileZoom$3; } - _tileZoom$3 = val; - return this; - }, + function findIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } - // get all cached notes covering the viewport - notes: function(projection) { - var viewport = projection.clipExtent(); - var min = [viewport[0][0], viewport[1][1]]; - var max = [viewport[1][0], viewport[0][1]]; - var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox(); + var index = fromIndex == null ? 0 : toInteger(fromIndex); - return _noteCache.rtree.search(bbox) - .map(function(d) { return d.data; }); - }, + if (index < 0) { + index = nativeMax(length + index, 0); + } + return baseFindIndex(array, getIteratee(predicate, 3), index); + } + /** + * This method is like `_.findIndex` except that it iterates over elements + * of `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=array.length-1] The index to search from. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; }); + * // => 2 + * + * // The `_.matches` iteratee shorthand. + * _.findLastIndex(users, { 'user': 'barney', 'active': true }); + * // => 0 + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findLastIndex(users, ['active', false]); + * // => 2 + * + * // The `_.property` iteratee shorthand. + * _.findLastIndex(users, 'active'); + * // => 0 + */ - // get a single note from the cache - getNote: function(id) { - return _noteCache.note[id]; - }, + function findLastIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; - // remove a single note from the cache - removeNote: function(note) { - if (!(note instanceof osmNote) || !note.id) { return; } + if (!length) { + return -1; + } - delete _noteCache.note[note.id]; - updateRtree$3(encodeNoteRtree(note), false); // false = remove - }, + var index = length - 1; + if (fromIndex !== undefined$1) { + index = toInteger(fromIndex); + index = fromIndex < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1); + } - // replace a single note in the cache - replaceNote: function(note) { - if (!(note instanceof osmNote) || !note.id) { return; } + return baseFindIndex(array, getIteratee(predicate, 3), index, true); + } + /** + * Flattens `array` a single level deep. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to flatten. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flatten([1, [2, [3, [4]], 5]]); + * // => [1, 2, [3, [4]], 5] + */ - _noteCache.note[note.id] = note; - updateRtree$3(encodeNoteRtree(note), true); // true = replace - return note; - }, + function flatten(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, 1) : []; + } + /** + * Recursively flattens `array`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to flatten. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flattenDeep([1, [2, [3, [4]], 5]]); + * // => [1, 2, 3, 4, 5] + */ - // Get an array of note IDs closed during this session. - // Used to populate `closed:note` changeset tag - getClosedIDs: function() { - return Object.keys(_noteCache.closed).sort(); - } - }; + function flattenDeep(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, INFINITY) : []; + } + /** + * Recursively flatten `array` up to `depth` times. + * + * @static + * @memberOf _ + * @since 4.4.0 + * @category Array + * @param {Array} array The array to flatten. + * @param {number} [depth=1] The maximum recursion depth. + * @returns {Array} Returns the new flattened array. + * @example + * + * var array = [1, [2, [3, [4]], 5]]; + * + * _.flattenDepth(array, 1); + * // => [1, 2, [3, [4]], 5] + * + * _.flattenDepth(array, 2); + * // => [1, 2, 3, [4], 5] + */ - var apibase$3 = 'https://wiki.openstreetmap.org/w/api.php'; - var _inflight$1 = {}; - var _wikibaseCache = {}; - var _localeIDs = { en: false }; + function flattenDepth(array, depth) { + var length = array == null ? 0 : array.length; - var debouncedRequest = debounce(request, 500, { leading: false }); + if (!length) { + return []; + } - function request(url, callback) { - if (_inflight$1[url]) { return; } - var controller = new AbortController(); - _inflight$1[url] = controller; + depth = depth === undefined$1 ? 1 : toInteger(depth); + return baseFlatten(array, depth); + } + /** + * The inverse of `_.toPairs`; this method returns an object composed + * from key-value `pairs`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} pairs The key-value pairs. + * @returns {Object} Returns the new object. + * @example + * + * _.fromPairs([['a', 1], ['b', 2]]); + * // => { 'a': 1, 'b': 2 } + */ - d3_json(url, { signal: controller.signal }) - .then(function(result) { - delete _inflight$1[url]; - if (callback) { callback(null, result); } - }) - .catch(function(err) { - delete _inflight$1[url]; - if (err.name === 'AbortError') { return; } - if (callback) { callback(err.message); } - }); - } + function fromPairs(pairs) { + var index = -1, + length = pairs == null ? 0 : pairs.length, + result = {}; - /** - * Get the best string value from the descriptions/labels result - * Note that if mediawiki doesn't recognize language code, it will return all values. - * In that case, fallback to use English. - * @param values object - either descriptions or labels - * @param langCode String - * @returns localized string - */ - function localizedToString(values, langCode) { - if (values) { - values = values[langCode] || values.en; - } - return values ? values.value : ''; - } + while (++index < length) { + var pair = pairs[index]; + result[pair[0]] = pair[1]; + } + return result; + } + /** + * Gets the first element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @alias first + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the first element of `array`. + * @example + * + * _.head([1, 2, 3]); + * // => 1 + * + * _.head([]); + * // => undefined + */ - var serviceOsmWikibase = { - init: function() { - _inflight$1 = {}; - _wikibaseCache = {}; - _localeIDs = {}; - }, + function head(array) { + return array && array.length ? array[0] : undefined$1; + } + /** + * Gets the index at which the first occurrence of `value` is found in `array` + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. If `fromIndex` is negative, it's used as the + * offset from the end of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=0] The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.indexOf([1, 2, 1, 2], 2); + * // => 1 + * + * // Search from the `fromIndex`. + * _.indexOf([1, 2, 1, 2], 2, 2); + * // => 3 + */ - reset: function() { - Object.values(_inflight$1).forEach(function(controller) { controller.abort(); }); - _inflight$1 = {}; - }, + function indexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } - /** - * Get the best value for the property, or undefined if not found - * @param entity object from wikibase - * @param property string e.g. 'P4' for image - * @param langCode string e.g. 'fr' for French - */ - claimToValue: function(entity, property, langCode) { - if (!entity.claims[property]) { return undefined; } - var locale = _localeIDs[langCode]; - var preferredPick, localePick; - - entity.claims[property].forEach(function(stmt) { - // If exists, use value limited to the needed language (has a qualifier P26 = locale) - // Or if not found, use the first value with the "preferred" rank - if (!preferredPick && stmt.rank === 'preferred') { - preferredPick = stmt; - } - if (locale && stmt.qualifiers && stmt.qualifiers.P26 && - stmt.qualifiers.P26[0].datavalue.value.id === locale - ) { - localePick = stmt; - } - }); + var index = fromIndex == null ? 0 : toInteger(fromIndex); - var result = localePick || preferredPick; - if (result) { - var datavalue = result.mainsnak.datavalue; - return datavalue.type === 'wikibase-entityid' ? datavalue.value.id : datavalue.value; - } else { - return undefined; + if (index < 0) { + index = nativeMax(length + index, 0); } - }, + return baseIndexOf(array, value, index); + } + /** + * Gets all but the last element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.initial([1, 2, 3]); + * // => [1, 2] + */ - /** - * Convert monolingual property into a key-value object (language -> value) - * @param entity object from wikibase - * @param property string e.g. 'P31' for monolingual wiki page title - */ - monolingualClaimToValueObj: function(entity, property) { - if (!entity || !entity.claims[property]) { return undefined; } - - return entity.claims[property].reduce(function(acc, obj) { - var value = obj.mainsnak.datavalue.value; - acc[value.language] = value.text; - return acc; - }, {}); - }, + function initial(array) { + var length = array == null ? 0 : array.length; + return length ? baseSlice(array, 0, -1) : []; + } + /** + * Creates an array of unique values that are included in all given arrays + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. The order and references of result values are + * determined by the first array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * _.intersection([2, 1], [2, 3]); + * // => [2] + */ - toSitelink: function(key, value) { - var result = value ? ('Tag:' + key + '=' + value) : 'Key:' + key; - return result.replace(/_/g, ' ').trim(); - }, + var intersection = baseRest(function (arrays) { + var mapped = arrayMap(arrays, castArrayLikeObject); + return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped) : []; + }); + /** + * This method is like `_.intersection` except that it accepts `iteratee` + * which is invoked for each element of each `arrays` to generate the criterion + * by which they're compared. The order and references of result values are + * determined by the first array. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [2.1] + * + * // The `_.property` iteratee shorthand. + * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }] + */ - // - // Pass params object of the form: - // { - // key: 'string', - // value: 'string', - // rtype: 'string', - // langCode: 'string' - // } - // - getEntity: function(params, callback) { - var doRequest = params.debounce ? debouncedRequest : request; - var that = this; - var titles = []; - var result = {}; - var rtypeSitelink = params.rtype ? ('Relation:' + params.rtype).replace(/_/g, ' ').trim() : false; - var keySitelink = params.key ? this.toSitelink(params.key) : false; - var tagSitelink = (params.key && params.value) ? this.toSitelink(params.key, params.value) : false; - var localeSitelink; - - if (params.langCode && _localeIDs[params.langCode] === undefined) { - // If this is the first time we are asking about this locale, - // fetch corresponding entity (if it exists), and cache it. - // If there is no such entry, cache `false` value to avoid re-requesting it. - localeSitelink = ('Locale:' + params.langCode).replace(/_/g, ' ').trim(); - titles.push(localeSitelink); - } - - if (rtypeSitelink) { - if (_wikibaseCache[rtypeSitelink]) { - result.rtype = _wikibaseCache[rtypeSitelink]; - } else { - titles.push(rtypeSitelink); - } - } + var intersectionBy = baseRest(function (arrays) { + var iteratee = last(arrays), + mapped = arrayMap(arrays, castArrayLikeObject); - if (keySitelink) { - if (_wikibaseCache[keySitelink]) { - result.key = _wikibaseCache[keySitelink]; - } else { - titles.push(keySitelink); - } + if (iteratee === last(mapped)) { + iteratee = undefined$1; + } else { + mapped.pop(); } - if (tagSitelink) { - if (_wikibaseCache[tagSitelink]) { - result.tag = _wikibaseCache[tagSitelink]; - } else { - titles.push(tagSitelink); - } - } + return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, getIteratee(iteratee, 2)) : []; + }); + /** + * This method is like `_.intersection` except that it accepts `comparator` + * which is invoked to compare elements of `arrays`. The order and references + * of result values are determined by the first array. The comparator is + * invoked with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.intersectionWith(objects, others, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }] + */ - if (!titles.length) { - // Nothing to do, we already had everything in the cache - return callback(null, result); - } - - // Requesting just the user language code - // If backend recognizes the code, it will perform proper fallbacks, - // and the result will contain the requested code. If not, all values are returned: - // {"zh-tw":{"value":"...","language":"zh-tw","source-language":"zh-hant"} - // {"pt-br":{"value":"...","language":"pt","for-language":"pt-br"}} - var obj = { - action: 'wbgetentities', - sites: 'wiki', - titles: titles.join('|'), - languages: params.langCode, - languagefallback: 1, - origin: '*', - format: 'json', - // There is an MW Wikibase API bug https://phabricator.wikimedia.org/T212069 - // We shouldn't use v1 until it gets fixed, but should switch to it afterwards - // formatversion: 2, - }; + var intersectionWith = baseRest(function (arrays) { + var comparator = last(arrays), + mapped = arrayMap(arrays, castArrayLikeObject); + comparator = typeof comparator == 'function' ? comparator : undefined$1; - var url = apibase$3 + '?' + utilQsString(obj); - doRequest(url, function(err, d) { - if (err) { - callback(err); - } else if (!d.success || d.error) { - callback(d.error.messages.map(function(v) { return v.html['*']; }).join('
    ')); - } else { - var localeID = false; - Object.values(d.entities).forEach(function(res) { - if (res.missing !== '') { - // Simplify access to the localized values - res.description = localizedToString(res.descriptions, params.langCode); - res.label = localizedToString(res.labels, params.langCode); - - var title = res.sitelinks.wiki.title; - if (title === rtypeSitelink) { - _wikibaseCache[rtypeSitelink] = res; - result.rtype = res; - } else if (title === keySitelink) { - _wikibaseCache[keySitelink] = res; - result.key = res; - } else if (title === tagSitelink) { - _wikibaseCache[tagSitelink] = res; - result.tag = res; - } else if (title === localeSitelink) { - localeID = res.id; - } else { - console.log('Unexpected title ' + title); // eslint-disable-line no-console - } - } - }); + if (comparator) { + mapped.pop(); + } - if (localeSitelink) { - // If locale ID is not found, store false to prevent repeated queries - that.addLocale(params.langCode, localeID); - } + return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, undefined$1, comparator) : []; + }); + /** + * Converts all elements in `array` into a string separated by `separator`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to convert. + * @param {string} [separator=','] The element separator. + * @returns {string} Returns the joined string. + * @example + * + * _.join(['a', 'b', 'c'], '~'); + * // => 'a~b~c' + */ - callback(null, result); - } - }); - }, + function join(array, separator) { + return array == null ? '' : nativeJoin.call(array, separator); + } + /** + * Gets the last element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the last element of `array`. + * @example + * + * _.last([1, 2, 3]); + * // => 3 + */ - // - // Pass params object of the form: - // { - // key: 'string', // required - // value: 'string' // optional - // } - // -or- - // { - // rtype: 'rtype' // relation type (e.g. 'multipolygon') - // } - // - // Get an result object used to display tag documentation - // { - // title: 'string', - // description: 'string', - // editURL: 'string', - // imageURL: 'string', - // wiki: { title: 'string', text: 'string', url: 'string' } - // } - // - getDocs: function(params, callback) { - var that = this; - var langCode = _mainLocalizer.localeCode().toLowerCase(); - params.langCode = langCode; + function last(array) { + var length = array == null ? 0 : array.length; + return length ? array[length - 1] : undefined$1; + } + /** + * This method is like `_.indexOf` except that it iterates over elements of + * `array` from right to left. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=array.length-1] The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.lastIndexOf([1, 2, 1, 2], 2); + * // => 3 + * + * // Search from the `fromIndex`. + * _.lastIndexOf([1, 2, 1, 2], 2, 2); + * // => 1 + */ - this.getEntity(params, function(err, data) { - if (err) { - callback(err); - return; - } - var entity = data.rtype || data.tag || data.key; - if (!entity) { - callback('No entity'); - return; - } + function lastIndexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; - // prepare result - var result = { - title: entity.title, - description: entity.description, - editURL: 'https://wiki.openstreetmap.org/wiki/' + entity.title - }; + if (!length) { + return -1; + } - // add image - if (entity.claims) { - var imageroot; - var image = that.claimToValue(entity, 'P4', langCode); - if (image) { - imageroot = 'https://commons.wikimedia.org/w/index.php'; - } else { - image = that.claimToValue(entity, 'P28', langCode); - if (image) { - imageroot = 'https://wiki.openstreetmap.org/w/index.php'; - } - } - if (imageroot && image) { - result.imageURL = imageroot + '?' + utilQsString({ - title: 'Special:Redirect/file/' + image, - width: 400 - }); - } - } + var index = length; - // Try to get a wiki page from tag data item first, followed by the corresponding key data item. - // If neither tag nor key data item contain a wiki page in the needed language nor English, - // get the first found wiki page from either the tag or the key item. - var rtypeWiki = that.monolingualClaimToValueObj(data.rtype, 'P31'); - var tagWiki = that.monolingualClaimToValueObj(data.tag, 'P31'); - var keyWiki = that.monolingualClaimToValueObj(data.key, 'P31'); - - // If exact language code does not exist, try to find the first part before the '-' - // BUG: in some cases, a more elaborate fallback logic might be needed - var langPrefix = langCode.split('-', 2)[0]; - - // use the first acceptable wiki page - result.wiki = - getWikiInfo(rtypeWiki, langCode, 'inspector.wiki_reference') || - getWikiInfo(rtypeWiki, langPrefix, 'inspector.wiki_reference') || - getWikiInfo(rtypeWiki, 'en', 'inspector.wiki_en_reference') || - getWikiInfo(tagWiki, langCode, 'inspector.wiki_reference') || - getWikiInfo(tagWiki, langPrefix, 'inspector.wiki_reference') || - getWikiInfo(tagWiki, 'en', 'inspector.wiki_en_reference') || - getWikiInfo(keyWiki, langCode, 'inspector.wiki_reference') || - getWikiInfo(keyWiki, langPrefix, 'inspector.wiki_reference') || - getWikiInfo(keyWiki, 'en', 'inspector.wiki_en_reference'); - - callback(null, result); - - - // Helper method to get wiki info if a given language exists - function getWikiInfo(wiki, langCode, tKey) { - if (wiki && wiki[langCode]) { - return { - title: wiki[langCode], - text: tKey, - url: 'https://wiki.openstreetmap.org/wiki/' + wiki[langCode] - }; - } - } - }); - }, + if (fromIndex !== undefined$1) { + index = toInteger(fromIndex); + index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1); + } + return value === value ? strictLastIndexOf(array, value, index) : baseFindIndex(array, baseIsNaN, index, true); + } + /** + * Gets the element at index `n` of `array`. If `n` is negative, the nth + * element from the end is returned. + * + * @static + * @memberOf _ + * @since 4.11.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=0] The index of the element to return. + * @returns {*} Returns the nth element of `array`. + * @example + * + * var array = ['a', 'b', 'c', 'd']; + * + * _.nth(array, 1); + * // => 'b' + * + * _.nth(array, -2); + * // => 'c'; + */ - addLocale: function(langCode, qid) { - // Makes it easier to unit test - _localeIDs[langCode] = qid; - }, + function nth(array, n) { + return array && array.length ? baseNth(array, toInteger(n)) : undefined$1; + } + /** + * Removes all given values from `array` using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove` + * to remove elements from an array by predicate. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {...*} [values] The values to remove. + * @returns {Array} Returns `array`. + * @example + * + * var array = ['a', 'b', 'c', 'a', 'b', 'c']; + * + * _.pull(array, 'a', 'c'); + * console.log(array); + * // => ['b', 'b'] + */ - apibase: function(val) { - if (!arguments.length) { return apibase$3; } - apibase$3 = val; - return this; - } - }; + var pull = baseRest(pullAll); + /** + * This method is like `_.pull` except that it accepts an array of values to remove. + * + * **Note:** Unlike `_.difference`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @returns {Array} Returns `array`. + * @example + * + * var array = ['a', 'b', 'c', 'a', 'b', 'c']; + * + * _.pullAll(array, ['a', 'c']); + * console.log(array); + * // => ['b', 'b'] + */ - var jsonpCache = {}; - window.jsonpCache = jsonpCache; + function pullAll(array, values) { + return array && array.length && values && values.length ? basePullAll(array, values) : array; + } + /** + * This method is like `_.pullAll` except that it accepts `iteratee` which is + * invoked for each element of `array` and `values` to generate the criterion + * by which they're compared. The iteratee is invoked with one argument: (value). + * + * **Note:** Unlike `_.differenceBy`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns `array`. + * @example + * + * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }]; + * + * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x'); + * console.log(array); + * // => [{ 'x': 2 }] + */ - function jsonpRequest(url, callback) { - var request = { - abort: function() {} - }; - if (window.JSONP_FIX) { - if (window.JSONP_DELAY === 0) { - callback(window.JSONP_FIX); - } else { - var t = window.setTimeout(function() { - callback(window.JSONP_FIX); - }, window.JSONP_DELAY || 0); + function pullAllBy(array, values, iteratee) { + return array && array.length && values && values.length ? basePullAll(array, values, getIteratee(iteratee, 2)) : array; + } + /** + * This method is like `_.pullAll` except that it accepts `comparator` which + * is invoked to compare elements of `array` to `values`. The comparator is + * invoked with two arguments: (arrVal, othVal). + * + * **Note:** Unlike `_.differenceWith`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns `array`. + * @example + * + * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }]; + * + * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual); + * console.log(array); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }] + */ - request.abort = function() { window.clearTimeout(t); }; - } - return request; - } + function pullAllWith(array, values, comparator) { + return array && array.length && values && values.length ? basePullAll(array, values, undefined$1, comparator) : array; + } + /** + * Removes elements from `array` corresponding to `indexes` and returns an + * array of removed elements. + * + * **Note:** Unlike `_.at`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {...(number|number[])} [indexes] The indexes of elements to remove. + * @returns {Array} Returns the new array of removed elements. + * @example + * + * var array = ['a', 'b', 'c', 'd']; + * var pulled = _.pullAt(array, [1, 3]); + * + * console.log(array); + * // => ['a', 'c'] + * + * console.log(pulled); + * // => ['b', 'd'] + */ - function rand() { - var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; - var c = ''; - var i = -1; - while (++i < 15) { c += chars.charAt(Math.floor(Math.random() * 52)); } - return c; - } - function create(url) { - var e = url.match(/callback=(\w+)/); - var c = e ? e[1] : rand(); + var pullAt = flatRest(function (array, indexes) { + var length = array == null ? 0 : array.length, + result = baseAt(array, indexes); + basePullAt(array, arrayMap(indexes, function (index) { + return isIndex(index, length) ? +index : index; + }).sort(compareAscending)); + return result; + }); + /** + * Removes all elements from `array` that `predicate` returns truthy for + * and returns an array of the removed elements. The predicate is invoked + * with three arguments: (value, index, array). + * + * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull` + * to pull elements from an array by value. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new array of removed elements. + * @example + * + * var array = [1, 2, 3, 4]; + * var evens = _.remove(array, function(n) { + * return n % 2 == 0; + * }); + * + * console.log(array); + * // => [1, 3] + * + * console.log(evens); + * // => [2, 4] + */ - jsonpCache[c] = function(data) { - if (jsonpCache[c]) { - callback(data); - } - finalize(); - }; + function remove(array, predicate) { + var result = []; - function finalize() { - delete jsonpCache[c]; - script.remove(); + if (!(array && array.length)) { + return result; } - request.abort = finalize; - return 'jsonpCache.' + c; - } - - var cb = create(url); - - var script = select('head') - .append('script') - .attr('type', 'text/javascript') - .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb)); + var index = -1, + indexes = [], + length = array.length; + predicate = getIteratee(predicate, 3); - return request; - } + while (++index < length) { + var value = array[index]; - var bubbleApi = 'https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?'; - var streetsideImagesApi = 'https://t.ssl.ak.tiles.virtualearth.net/tiles/'; - var bubbleAppKey = 'AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm'; - var pannellumViewerCSS = 'pannellum-streetside/pannellum.css'; - var pannellumViewerJS = 'pannellum-streetside/pannellum.js'; - var maxResults$2 = 2000; - var tileZoom$2 = 16.5; - var tiler$6 = utilTiler().zoomExtent([tileZoom$2, tileZoom$2]).skipNullIsland(true); - var dispatch$7 = dispatch('loadedBubbles', 'viewerChanged'); - var minHfov = 10; // zoom in degrees: 20, 10, 5 - var maxHfov = 90; // zoom out degrees - var defaultHfov = 45; + if (predicate(value, index, array)) { + result.push(value); + indexes.push(index); + } + } - var _hires = false; - var _resolution = 512; // higher numbers are slower - 512, 1024, 2048, 4096 - var _currScene = 0; - var _ssCache; - var _pannellumViewer; - var _sceneOptions; - var _dataUrlArray = []; + basePullAt(array, indexes); + return result; + } + /** + * Reverses `array` so that the first element becomes the last, the second + * element becomes the second to last, and so on. + * + * **Note:** This method mutates `array` and is based on + * [`Array#reverse`](https://mdn.io/Array/reverse). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @returns {Array} Returns `array`. + * @example + * + * var array = [1, 2, 3]; + * + * _.reverse(array); + * // => [3, 2, 1] + * + * console.log(array); + * // => [3, 2, 1] + */ - /** - * abortRequest(). - */ - function abortRequest$6(i) { - i.abort(); - } + function reverse(array) { + return array == null ? array : nativeReverse.call(array); + } + /** + * Creates a slice of `array` from `start` up to, but not including, `end`. + * + * **Note:** This method is used instead of + * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are + * returned. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ - /** - * localeTimeStamp(). - */ - function localeTimestamp(s) { - if (!s) { return null; } - var options = { day: 'numeric', month: 'short', year: 'numeric' }; - var d = new Date(s); - if (isNaN(d.getTime())) { return null; } - return d.toLocaleString(_mainLocalizer.localeCode(), options); - } + function slice(array, start, end) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } - /** - * loadTiles() wraps the process of generating tiles and then fetching image points for each tile. - */ - function loadTiles$2(which, url, projection, margin) { - var tiles = tiler$6.margin(margin).getTiles(projection); + if (end && typeof end != 'number' && isIterateeCall(array, start, end)) { + start = 0; + end = length; + } else { + start = start == null ? 0 : toInteger(start); + end = end === undefined$1 ? length : toInteger(end); + } - // abort inflight requests that are no longer needed - var cache = _ssCache[which]; - Object.keys(cache.inflight).forEach(function (k) { - var wanted = tiles.find(function (tile) { return k.indexOf(tile.id + ',') === 0; }); - if (!wanted) { - abortRequest$6(cache.inflight[k]); - delete cache.inflight[k]; - } - }); + return baseSlice(array, start, end); + } + /** + * Uses a binary search to determine the lowest index at which `value` + * should be inserted into `array` in order to maintain its sort order. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * _.sortedIndex([30, 50], 40); + * // => 1 + */ - tiles.forEach(function (tile) { return loadNextTilePage$2(which, url, tile); }); - } + function sortedIndex(array, value) { + return baseSortedIndex(array, value); + } + /** + * This method is like `_.sortedIndex` except that it accepts `iteratee` + * which is invoked for `value` and each element of `array` to compute their + * sort ranking. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * var objects = [{ 'x': 4 }, { 'x': 5 }]; + * + * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); + * // => 0 + * + * // The `_.property` iteratee shorthand. + * _.sortedIndexBy(objects, { 'x': 4 }, 'x'); + * // => 0 + */ - /** - * loadNextTilePage() load data for the next tile page in line. - */ - function loadNextTilePage$2(which, url, tile) { - var cache = _ssCache[which]; - var nextPage = cache.nextPage[tile.id] || 0; - var id = tile.id + ',' + String(nextPage); - if (cache.loaded[id] || cache.inflight[id]) { return; } - cache.inflight[id] = getBubbles(url, tile, function (bubbles) { - cache.loaded[id] = true; - delete cache.inflight[id]; - if (!bubbles) { return; } + function sortedIndexBy(array, value, iteratee) { + return baseSortedIndexBy(array, value, getIteratee(iteratee, 2)); + } + /** + * This method is like `_.indexOf` except that it performs a binary + * search on a sorted `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.sortedIndexOf([4, 5, 5, 5, 6], 5); + * // => 1 + */ - // [].shift() removes the first element, some statistics info, not a bubble point - bubbles.shift(); - var features = bubbles.map(function (bubble) { - if (cache.points[bubble.id]) { return null; } // skip duplicates + function sortedIndexOf(array, value) { + var length = array == null ? 0 : array.length; - var loc = [bubble.lo, bubble.la]; - var d = { - loc: loc, - key: bubble.id, - ca: bubble.he, - captured_at: bubble.cd, - captured_by: 'microsoft', - // nbn: bubble.nbn, - // pbn: bubble.pbn, - // ad: bubble.ad, - // rn: bubble.rn, - pr: bubble.pr, // previous - ne: bubble.ne, // next - pano: true, - sequenceKey: null - }; + if (length) { + var index = baseSortedIndex(array, value); - cache.points[bubble.id] = d; + if (index < length && eq(array[index], value)) { + return index; + } + } - // a sequence starts here - if (bubble.pr === undefined) { - cache.leaders.push(bubble.id); + return -1; } + /** + * This method is like `_.sortedIndex` except that it returns the highest + * index at which `value` should be inserted into `array` in order to + * maintain its sort order. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * _.sortedLastIndex([4, 5, 5, 5, 6], 5); + * // => 4 + */ - return { - minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d - }; - }).filter(Boolean); + function sortedLastIndex(array, value) { + return baseSortedIndex(array, value, true); + } + /** + * This method is like `_.sortedLastIndex` except that it accepts `iteratee` + * which is invoked for `value` and each element of `array` to compute their + * sort ranking. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * var objects = [{ 'x': 4 }, { 'x': 5 }]; + * + * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); + * // => 1 + * + * // The `_.property` iteratee shorthand. + * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x'); + * // => 1 + */ - cache.rtree.load(features); - connectSequences(); + function sortedLastIndexBy(array, value, iteratee) { + return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true); + } + /** + * This method is like `_.lastIndexOf` except that it performs a binary + * search on a sorted `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5); + * // => 3 + */ - if (which === 'bubbles') { - dispatch$7.call('loadedBubbles'); - } - }); - } + function sortedLastIndexOf(array, value) { + var length = array == null ? 0 : array.length; - // call this sometimes to connect the bubbles into sequences - function connectSequences() { - var cache = _ssCache.bubbles; - var keepLeaders = []; + if (length) { + var index = baseSortedIndex(array, value, true) - 1; - for (var i = 0; i < cache.leaders.length; i++) { - var bubble = cache.points[cache.leaders[i]]; - var seen = {}; + if (eq(array[index], value)) { + return index; + } + } - // try to make a sequence.. use the key of the leader bubble. - var sequence = { key: bubble.key, bubbles: [] }; - var complete = false; + return -1; + } + /** + * This method is like `_.uniq` except that it's designed and optimized + * for sorted arrays. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.sortedUniq([1, 1, 2]); + * // => [1, 2] + */ - do { - sequence.bubbles.push(bubble); - seen[bubble.key] = true; - if (bubble.ne === undefined) { - complete = true; - } else { - bubble = cache.points[bubble.ne]; // advance to next + function sortedUniq(array) { + return array && array.length ? baseSortedUniq(array) : []; } - } while (bubble && !seen[bubble.key] && !complete); + /** + * This method is like `_.uniqBy` except that it's designed and optimized + * for sorted arrays. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor); + * // => [1.1, 2.3] + */ - if (complete) { - _ssCache.sequences[sequence.key] = sequence; + function sortedUniqBy(array, iteratee) { + return array && array.length ? baseSortedUniq(array, getIteratee(iteratee, 2)) : []; + } + /** + * Gets all but the first element of `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to query. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.tail([1, 2, 3]); + * // => [2, 3] + */ - // assign bubbles to the sequence - for (var j = 0; j < sequence.bubbles.length; j++) { - sequence.bubbles[j].sequenceKey = sequence.key; + + function tail(array) { + var length = array == null ? 0 : array.length; + return length ? baseSlice(array, 1, length) : []; } + /** + * Creates a slice of `array` with `n` elements taken from the beginning. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to take. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.take([1, 2, 3]); + * // => [1] + * + * _.take([1, 2, 3], 2); + * // => [1, 2] + * + * _.take([1, 2, 3], 5); + * // => [1, 2, 3] + * + * _.take([1, 2, 3], 0); + * // => [] + */ - // create a GeoJSON LineString - sequence.geojson = { - type: 'LineString', - properties: { key: sequence.key }, - coordinates: sequence.bubbles.map(function (d) { return d.loc; }) - }; - } else { - keepLeaders.push(cache.leaders[i]); - } - } + function take(array, n, guard) { + if (!(array && array.length)) { + return []; + } - // couldn't complete these, save for later - cache.leaders = keepLeaders; - } + n = guard || n === undefined$1 ? 1 : toInteger(n); + return baseSlice(array, 0, n < 0 ? 0 : n); + } + /** + * Creates a slice of `array` with `n` elements taken from the end. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to take. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.takeRight([1, 2, 3]); + * // => [3] + * + * _.takeRight([1, 2, 3], 2); + * // => [2, 3] + * + * _.takeRight([1, 2, 3], 5); + * // => [1, 2, 3] + * + * _.takeRight([1, 2, 3], 0); + * // => [] + */ - /** - * getBubbles() handles the request to the server for a tile extent of 'bubbles' (streetside image locations). - */ - function getBubbles(url, tile, callback) { - var rect = tile.extent.rectangle(); - var urlForRequest = url + utilQsString({ - n: rect[3], - s: rect[1], - e: rect[2], - w: rect[0], - c: maxResults$2, - appkey: bubbleAppKey, - jsCallback: '{callback}' - }); + function takeRight(array, n, guard) { + var length = array == null ? 0 : array.length; - return jsonpRequest(urlForRequest, function (data) { - if (!data || data.error) { - callback(null); - } else { - callback(data); - } - }); - } + if (!length) { + return []; + } + n = guard || n === undefined$1 ? 1 : toInteger(n); + n = length - n; + return baseSlice(array, n < 0 ? 0 : n, length); + } + /** + * Creates a slice of `array` with elements taken from the end. Elements are + * taken until `predicate` returns falsey. The predicate is invoked with + * three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.takeRightWhile(users, function(o) { return !o.active; }); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.matches` iteratee shorthand. + * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false }); + * // => objects for ['pebbles'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.takeRightWhile(users, ['active', false]); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.property` iteratee shorthand. + * _.takeRightWhile(users, 'active'); + * // => [] + */ - // partition viewport into higher zoom tiles - function partitionViewport$2(projection) { - var z = geoScaleToZoom(projection.scale()); - var z2 = (Math.ceil(z * 2) / 2) + 2.5; // round to next 0.5 and add 2.5 - var tiler = utilTiler().zoomExtent([z2, z2]); - return tiler.getTiles(projection) - .map(function (tile) { return tile.extent; }); - } + function takeRightWhile(array, predicate) { + return array && array.length ? baseWhile(array, getIteratee(predicate, 3), false, true) : []; + } + /** + * Creates a slice of `array` with elements taken from the beginning. Elements + * are taken until `predicate` returns falsey. The predicate is invoked with + * three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.takeWhile(users, function(o) { return !o.active; }); + * // => objects for ['barney', 'fred'] + * + * // The `_.matches` iteratee shorthand. + * _.takeWhile(users, { 'user': 'barney', 'active': false }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.takeWhile(users, ['active', false]); + * // => objects for ['barney', 'fred'] + * + * // The `_.property` iteratee shorthand. + * _.takeWhile(users, 'active'); + * // => [] + */ - // no more than `limit` results per partition. - function searchLimited$2(limit, projection, rtree) { - limit = limit || 5; + function takeWhile(array, predicate) { + return array && array.length ? baseWhile(array, getIteratee(predicate, 3)) : []; + } + /** + * Creates an array of unique values, in order, from all given arrays using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of combined values. + * @example + * + * _.union([2], [1, 2]); + * // => [2, 1] + */ - return partitionViewport$2(projection) - .reduce(function (result, extent) { - var found = rtree.search(extent.bbox()) - .slice(0, limit) - .map(function (d) { return d.data; }); - return (found.length ? result.concat(found) : result); - }, []); - } + var union = baseRest(function (arrays) { + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true)); + }); + /** + * This method is like `_.union` except that it accepts `iteratee` which is + * invoked for each element of each `arrays` to generate the criterion by + * which uniqueness is computed. Result values are chosen from the first + * array in which the value occurs. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of combined values. + * @example + * + * _.unionBy([2.1], [1.2, 2.3], Math.floor); + * // => [2.1, 1.2] + * + * // The `_.property` iteratee shorthand. + * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }, { 'x': 2 }] + */ + var unionBy = baseRest(function (arrays) { + var iteratee = last(arrays); - /** - * loadImage() - */ - function loadImage(imgInfo) { - return new Promise(function (resolve) { - var img = new Image(); - img.onload = function () { - var canvas = document.getElementById('ideditor-canvas' + imgInfo.face); - var ctx = canvas.getContext('2d'); - ctx.drawImage(img, imgInfo.x, imgInfo.y); - resolve({ imgInfo: imgInfo, status: 'ok' }); - }; - img.onerror = function () { - resolve({ data: imgInfo, status: 'error' }); - }; - img.setAttribute('crossorigin', ''); - img.src = imgInfo.url; - }); - } + if (isArrayLikeObject(iteratee)) { + iteratee = undefined$1; + } + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)); + }); + /** + * This method is like `_.union` except that it accepts `comparator` which + * is invoked to compare elements of `arrays`. Result values are chosen from + * the first array in which the value occurs. The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of combined values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.unionWith(objects, others, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] + */ - /** - * loadCanvas() - */ - function loadCanvas(imageGroup) { - return Promise.all(imageGroup.map(loadImage)) - .then(function (data) { - var canvas = document.getElementById('ideditor-canvas' + data[0].imgInfo.face); - var which = { '01': 0, '02': 1, '03': 2, '10': 3, '11': 4, '12': 5 }; - var face = data[0].imgInfo.face; - _dataUrlArray[which[face]] = canvas.toDataURL('image/jpeg', 1.0); - return { status: 'loadCanvas for face ' + data[0].imgInfo.face + 'ok'}; - }); - } + var unionWith = baseRest(function (arrays) { + var comparator = last(arrays); + comparator = typeof comparator == 'function' ? comparator : undefined$1; + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined$1, comparator); + }); + /** + * Creates a duplicate-free version of an array, using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons, in which only the first occurrence of each element + * is kept. The order of result values is determined by the order they occur + * in the array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.uniq([2, 1, 2]); + * // => [2, 1] + */ + function uniq(array) { + return array && array.length ? baseUniq(array) : []; + } + /** + * This method is like `_.uniq` except that it accepts `iteratee` which is + * invoked for each element in `array` to generate the criterion by which + * uniqueness is computed. The order of result values is determined by the + * order they occur in the array. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.uniqBy([2.1, 1.2, 2.3], Math.floor); + * // => [2.1, 1.2] + * + * // The `_.property` iteratee shorthand. + * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }, { 'x': 2 }] + */ - /** - * loadFaces() - */ - function loadFaces(faceGroup) { - return Promise.all(faceGroup.map(loadCanvas)) - .then(function () { return { status: 'loadFaces done' }; }); - } + function uniqBy(array, iteratee) { + return array && array.length ? baseUniq(array, getIteratee(iteratee, 2)) : []; + } + /** + * This method is like `_.uniq` except that it accepts `comparator` which + * is invoked to compare elements of `array`. The order of result values is + * determined by the order they occur in the array.The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.uniqWith(objects, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }] + */ - function setupCanvas(selection, reset) { - if (reset) { - selection.selectAll('#ideditor-stitcher-canvases') - .remove(); - } - // Add the Streetside working canvases. These are used for 'stitching', or combining, - // multiple images for each of the six faces, before passing to the Pannellum control as DataUrls - selection.selectAll('#ideditor-stitcher-canvases') - .data([0]) - .enter() - .append('div') - .attr('id', 'ideditor-stitcher-canvases') - .attr('display', 'none') - .selectAll('canvas') - .data(['canvas01', 'canvas02', 'canvas03', 'canvas10', 'canvas11', 'canvas12']) - .enter() - .append('canvas') - .attr('id', function (d) { return 'ideditor-' + d; }) - .attr('width', _resolution) - .attr('height', _resolution); - } + function uniqWith(array, comparator) { + comparator = typeof comparator == 'function' ? comparator : undefined$1; + return array && array.length ? baseUniq(array, undefined$1, comparator) : []; + } + /** + * This method is like `_.zip` except that it accepts an array of grouped + * elements and creates an array regrouping the elements to their pre-zip + * configuration. + * + * @static + * @memberOf _ + * @since 1.2.0 + * @category Array + * @param {Array} array The array of grouped elements to process. + * @returns {Array} Returns the new array of regrouped elements. + * @example + * + * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]); + * // => [['a', 1, true], ['b', 2, false]] + * + * _.unzip(zipped); + * // => [['a', 'b'], [1, 2], [true, false]] + */ - function qkToXY(qk) { - var x = 0; - var y = 0; - var scale = 256; - for (var i = qk.length; i > 0; i--) { - var key = qk[i-1]; - x += (+(key === '1' || key === '3')) * scale; - y += (+(key === '2' || key === '3')) * scale; - scale *= 2; - } - return [x, y]; - } + function unzip(array) { + if (!(array && array.length)) { + return []; + } + var length = 0; + array = arrayFilter(array, function (group) { + if (isArrayLikeObject(group)) { + length = nativeMax(group.length, length); + return true; + } + }); + return baseTimes(length, function (index) { + return arrayMap(array, baseProperty(index)); + }); + } + /** + * This method is like `_.unzip` except that it accepts `iteratee` to specify + * how regrouped values should be combined. The iteratee is invoked with the + * elements of each group: (...group). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Array + * @param {Array} array The array of grouped elements to process. + * @param {Function} [iteratee=_.identity] The function to combine + * regrouped values. + * @returns {Array} Returns the new array of regrouped elements. + * @example + * + * var zipped = _.zip([1, 2], [10, 20], [100, 200]); + * // => [[1, 10, 100], [2, 20, 200]] + * + * _.unzipWith(zipped, _.add); + * // => [3, 30, 300] + */ - function getQuadKeys() { - var dim = _resolution / 256; - var quadKeys; - if (dim === 16) { - quadKeys = [ - '0000','0001','0010','0011','0100','0101','0110','0111', '1000','1001','1010','1011','1100','1101','1110','1111', - '0002','0003','0012','0013','0102','0103','0112','0113', '1002','1003','1012','1013','1102','1103','1112','1113', - '0020','0021','0030','0031','0120','0121','0130','0131', '1020','1021','1030','1031','1120','1121','1130','1131', - '0022','0023','0032','0033','0122','0123','0132','0133', '1022','1023','1032','1033','1122','1123','1132','1133', - '0200','0201','0210','0211','0300','0301','0310','0311', '1200','1201','1210','1211','1300','1301','1310','1311', - '0202','0203','0212','0213','0302','0303','0312','0313', '1202','1203','1212','1213','1302','1303','1312','1313', - '0220','0221','0230','0231','0320','0321','0330','0331', '1220','1221','1230','1231','1320','1321','1330','1331', - '0222','0223','0232','0233','0322','0323','0332','0333', '1222','1223','1232','1233','1322','1323','1332','1333', - - '2000','2001','2010','2011','2100','2101','2110','2111', '3000','3001','3010','3011','3100','3101','3110','3111', - '2002','2003','2012','2013','2102','2103','2112','2113', '3002','3003','3012','3013','3102','3103','3112','3113', - '2020','2021','2030','2031','2120','2121','2130','2131', '3020','3021','3030','3031','3120','3121','3130','3131', - '2022','2023','2032','2033','2122','2123','2132','2133', '3022','3023','3032','3033','3122','3123','3132','3133', - '2200','2201','2210','2211','2300','2301','2310','2311', '3200','3201','3210','3211','3300','3301','3310','3311', - '2202','2203','2212','2213','2302','2303','2312','2313', '3202','3203','3212','3213','3302','3303','3312','3313', - '2220','2221','2230','2231','2320','2321','2330','2331', '3220','3221','3230','3231','3320','3321','3330','3331', - '2222','2223','2232','2233','2322','2323','2332','2333', '3222','3223','3232','3233','3322','3323','3332','3333' - ]; + function unzipWith(array, iteratee) { + if (!(array && array.length)) { + return []; + } - } else if (dim === 8) { - quadKeys = [ - '000','001','010','011', '100','101','110','111', - '002','003','012','013', '102','103','112','113', - '020','021','030','031', '120','121','130','131', - '022','023','032','033', '122','123','132','133', - - '200','201','210','211', '300','301','310','311', - '202','203','212','213', '302','303','312','313', - '220','221','230','231', '320','321','330','331', - '222','223','232','233', '322','323','332','333' - ]; + var result = unzip(array); - } else if (dim === 4) { - quadKeys = [ - '00','01', '10','11', - '02','03', '12','13', + if (iteratee == null) { + return result; + } - '20','21', '30','31', - '22','23', '32','33' - ]; + return arrayMap(result, function (group) { + return apply(iteratee, undefined$1, group); + }); + } + /** + * Creates an array excluding all given values using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * **Note:** Unlike `_.pull`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...*} [values] The values to exclude. + * @returns {Array} Returns the new array of filtered values. + * @see _.difference, _.xor + * @example + * + * _.without([2, 1, 2, 3], 1, 2); + * // => [3] + */ - } else { // dim === 2 - quadKeys = [ - '0', '1', - '2', '3' - ]; - } - return quadKeys; - } + var without = baseRest(function (array, values) { + return isArrayLikeObject(array) ? baseDifference(array, values) : []; + }); + /** + * Creates an array of unique values that is the + * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference) + * of the given arrays. The order of result values is determined by the order + * they occur in the arrays. + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of filtered values. + * @see _.difference, _.without + * @example + * + * _.xor([2, 1], [2, 3]); + * // => [1, 3] + */ + var xor = baseRest(function (arrays) { + return baseXor(arrayFilter(arrays, isArrayLikeObject)); + }); + /** + * This method is like `_.xor` except that it accepts `iteratee` which is + * invoked for each element of each `arrays` to generate the criterion by + * which by which they're compared. The order of result values is determined + * by the order they occur in the arrays. The iteratee is invoked with one + * argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [1.2, 3.4] + * + * // The `_.property` iteratee shorthand. + * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 2 }] + */ + var xorBy = baseRest(function (arrays) { + var iteratee = last(arrays); - var serviceStreetside = { - /** - * init() initialize streetside. - */ - init: function() { - if (!_ssCache) { - this.reset(); - } + if (isArrayLikeObject(iteratee)) { + iteratee = undefined$1; + } - this.event = utilRebind(this, dispatch$7, 'on'); - }, + return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2)); + }); + /** + * This method is like `_.xor` except that it accepts `comparator` which is + * invoked to compare elements of `arrays`. The order of result values is + * determined by the order they occur in the arrays. The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.xorWith(objects, others, _.isEqual); + * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] + */ - /** - * reset() reset the cache. - */ - reset: function() { - if (_ssCache) { - Object.values(_ssCache.bubbles.inflight).forEach(abortRequest$6); - } + var xorWith = baseRest(function (arrays) { + var comparator = last(arrays); + comparator = typeof comparator == 'function' ? comparator : undefined$1; + return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined$1, comparator); + }); + /** + * Creates an array of grouped elements, the first of which contains the + * first elements of the given arrays, the second of which contains the + * second elements of the given arrays, and so on. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to process. + * @returns {Array} Returns the new array of grouped elements. + * @example + * + * _.zip(['a', 'b'], [1, 2], [true, false]); + * // => [['a', 1, true], ['b', 2, false]] + */ - _ssCache = { - bubbles: { inflight: {}, loaded: {}, nextPage: {}, rtree: new RBush(), points: {}, leaders: [] }, - sequences: {} - }; - }, + var zip = baseRest(unzip); + /** + * This method is like `_.fromPairs` except that it accepts two arrays, + * one of property identifiers and one of corresponding values. + * + * @static + * @memberOf _ + * @since 0.4.0 + * @category Array + * @param {Array} [props=[]] The property identifiers. + * @param {Array} [values=[]] The property values. + * @returns {Object} Returns the new object. + * @example + * + * _.zipObject(['a', 'b'], [1, 2]); + * // => { 'a': 1, 'b': 2 } + */ - /** - * bubbles() - */ - bubbles: function(projection) { - var limit = 5; - return searchLimited$2(limit, projection, _ssCache.bubbles.rtree); - }, + function zipObject(props, values) { + return baseZipObject(props || [], values || [], assignValue); + } + /** + * This method is like `_.zipObject` except that it supports property paths. + * + * @static + * @memberOf _ + * @since 4.1.0 + * @category Array + * @param {Array} [props=[]] The property identifiers. + * @param {Array} [values=[]] The property values. + * @returns {Object} Returns the new object. + * @example + * + * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]); + * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } } + */ - sequences: function(projection) { - var viewport = projection.clipExtent(); - var min = [viewport[0][0], viewport[1][1]]; - var max = [viewport[1][0], viewport[0][1]]; - var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox(); - var seen = {}; - var results = []; + function zipObjectDeep(props, values) { + return baseZipObject(props || [], values || [], baseSet); + } + /** + * This method is like `_.zip` except that it accepts `iteratee` to specify + * how grouped values should be combined. The iteratee is invoked with the + * elements of each group: (...group). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Array + * @param {...Array} [arrays] The arrays to process. + * @param {Function} [iteratee=_.identity] The function to combine + * grouped values. + * @returns {Array} Returns the new array of grouped elements. + * @example + * + * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) { + * return a + b + c; + * }); + * // => [111, 222] + */ - // all sequences for bubbles in viewport - _ssCache.bubbles.rtree.search(bbox) - .forEach(function (d) { - var key = d.data.sequenceKey; - if (key && !seen[key]) { - seen[key] = true; - results.push(_ssCache.sequences[key].geojson); - } + + var zipWith = baseRest(function (arrays) { + var length = arrays.length, + iteratee = length > 1 ? arrays[length - 1] : undefined$1; + iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined$1; + return unzipWith(arrays, iteratee); }); + /*------------------------------------------------------------------------*/ - return results; - }, + /** + * Creates a `lodash` wrapper instance that wraps `value` with explicit method + * chain sequences enabled. The result of such sequences must be unwrapped + * with `_#value`. + * + * @static + * @memberOf _ + * @since 1.3.0 + * @category Seq + * @param {*} value The value to wrap. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'pebbles', 'age': 1 } + * ]; + * + * var youngest = _ + * .chain(users) + * .sortBy('age') + * .map(function(o) { + * return o.user + ' is ' + o.age; + * }) + * .head() + * .value(); + * // => 'pebbles is 1' + */ + function chain(value) { + var result = lodash(value); + result.__chain__ = true; + return result; + } + /** + * This method invokes `interceptor` and returns `value`. The interceptor + * is invoked with one argument; (value). The purpose of this method is to + * "tap into" a method chain sequence in order to modify intermediate results. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @param {*} value The value to provide to `interceptor`. + * @param {Function} interceptor The function to invoke. + * @returns {*} Returns `value`. + * @example + * + * _([1, 2, 3]) + * .tap(function(array) { + * // Mutate input array. + * array.pop(); + * }) + * .reverse() + * .value(); + * // => [2, 1] + */ - /** - * loadBubbles() - */ - loadBubbles: function(projection, margin) { - // by default: request 2 nearby tiles so we can connect sequences. - if (margin === undefined) { margin = 2; } - loadTiles$2('bubbles', bubbleApi, projection, margin); - }, + function tap(value, interceptor) { + interceptor(value); + return value; + } + /** + * This method is like `_.tap` except that it returns the result of `interceptor`. + * The purpose of this method is to "pass thru" values replacing intermediate + * results in a method chain sequence. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Seq + * @param {*} value The value to provide to `interceptor`. + * @param {Function} interceptor The function to invoke. + * @returns {*} Returns the result of `interceptor`. + * @example + * + * _(' abc ') + * .chain() + * .trim() + * .thru(function(value) { + * return [value]; + * }) + * .value(); + * // => ['abc'] + */ - viewer: function() { - return _pannellumViewer; - }, + function thru(value, interceptor) { + return interceptor(value); + } + /** + * This method is the wrapper version of `_.at`. + * + * @name at + * @memberOf _ + * @since 1.0.0 + * @category Seq + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; + * + * _(object).at(['a[0].b.c', 'a[1]']).value(); + * // => [3, 4] + */ - initViewer: function () { - if (!window.pannellum) { return; } - if (_pannellumViewer) { return; } + var wrapperAt = flatRest(function (paths) { + var length = paths.length, + start = length ? paths[0] : 0, + value = this.__wrapped__, + interceptor = function interceptor(object) { + return baseAt(object, paths); + }; - var sceneID = ++_currScene + ''; - var options = { - 'default': { firstScene: sceneID }, - scenes: {} - }; - options.scenes[sceneID] = _sceneOptions; + if (length > 1 || this.__actions__.length || !(value instanceof LazyWrapper) || !isIndex(start)) { + return this.thru(interceptor); + } - _pannellumViewer = window.pannellum.viewer('ideditor-viewer-streetside', options); - }, + value = value.slice(start, +start + (length ? 1 : 0)); + value.__actions__.push({ + 'func': thru, + 'args': [interceptor], + 'thisArg': undefined$1 + }); - /** - * loadViewer() create the streeside viewer. - */ - loadViewer: function(context) { - var that = this; + return new LodashWrapper(value, this.__chain__).thru(function (array) { + if (length && !array.length) { + array.push(undefined$1); + } - var pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse'; + return array; + }); + }); + /** + * Creates a `lodash` wrapper instance with explicit method chain sequences enabled. + * + * @name chain + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 } + * ]; + * + * // A sequence without explicit chaining. + * _(users).head(); + * // => { 'user': 'barney', 'age': 36 } + * + * // A sequence with explicit chaining. + * _(users) + * .chain() + * .head() + * .pick('user') + * .value(); + * // => { 'user': 'barney' } + */ - // create ms-wrapper, a photo wrapper class - var wrap = context.container().select('.photoviewer').selectAll('.ms-wrapper') - .data([0]); + function wrapperChain() { + return chain(this); + } + /** + * Executes the chain sequence and returns the wrapped result. + * + * @name commit + * @memberOf _ + * @since 3.2.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var array = [1, 2]; + * var wrapped = _(array).push(3); + * + * console.log(array); + * // => [1, 2] + * + * wrapped = wrapped.commit(); + * console.log(array); + * // => [1, 2, 3] + * + * wrapped.last(); + * // => 3 + * + * console.log(array); + * // => [1, 2, 3] + */ - // inject ms-wrapper into the photoviewer div - // (used by all to house each custom photo viewer) - var wrapEnter = wrap.enter() - .append('div') - .attr('class', 'photo-wrapper ms-wrapper') - .classed('hide', true); - - // inject div to support streetside viewer (pannellum) and attribution line - wrapEnter - .append('div') - .attr('id', 'ideditor-viewer-streetside') - .on(pointerPrefix + 'down.streetside', function () { - select(window) - .on(pointerPrefix + 'move.streetside', function () { - dispatch$7.call('viewerChanged'); - }, true); - }) - .on(pointerPrefix + 'up.streetside pointercancel.streetside', function () { - select(window) - .on(pointerPrefix + 'move.streetside', null); - // continue dispatching events for a few seconds, in case viewer has inertia. - var t = timer(function (elapsed) { - dispatch$7.call('viewerChanged'); - if (elapsed > 2000) { - t.stop(); - } - }); - }) - .append('div') - .attr('class', 'photo-attribution fillD'); - - var controlsEnter = wrapEnter - .append('div') - .attr('class', 'photo-controls-wrap') - .append('div') - .attr('class', 'photo-controls'); - - controlsEnter - .append('button') - .on('click.back', step(-1)) - .text('◄'); - - controlsEnter - .append('button') - .on('click.forward', step(1)) - .text('►'); - - - // create working canvas for stitching together images - wrap = wrap - .merge(wrapEnter) - .call(setupCanvas, true); - - // load streetside pannellum viewer css - select('head').selectAll('#ideditor-streetside-viewercss') - .data([0]) - .enter() - .append('link') - .attr('id', 'ideditor-streetside-viewercss') - .attr('rel', 'stylesheet') - .attr('href', context.asset(pannellumViewerCSS)); - - // load streetside pannellum viewer js - select('head').selectAll('#ideditor-streetside-viewerjs') - .data([0]) - .enter() - .append('script') - .attr('id', 'ideditor-streetside-viewerjs') - .attr('src', context.asset(pannellumViewerJS)); - - - // Register viewer resize handler - context.ui().photoviewer.on('resize.streetside', function () { - if (_pannellumViewer) { - _pannellumViewer.resize(); + function wrapperCommit() { + return new LodashWrapper(this.value(), this.__chain__); } - }); + /** + * Gets the next value on a wrapped object following the + * [iterator protocol](https://mdn.io/iteration_protocols#iterator). + * + * @name next + * @memberOf _ + * @since 4.0.0 + * @category Seq + * @returns {Object} Returns the next iterator value. + * @example + * + * var wrapped = _([1, 2]); + * + * wrapped.next(); + * // => { 'done': false, 'value': 1 } + * + * wrapped.next(); + * // => { 'done': false, 'value': 2 } + * + * wrapped.next(); + * // => { 'done': true, 'value': undefined } + */ - function step(stepBy) { - return function () { - var viewer = context.container().select('.photoviewer'); - var selected = viewer.empty() ? undefined : viewer.datum(); - if (!selected) { return; } + function wrapperNext() { + if (this.__values__ === undefined$1) { + this.__values__ = toArray(this.value()); + } - var nextID = (stepBy === 1 ? selected.ne : selected.pr); - var yaw = _pannellumViewer.getYaw(); - var ca = selected.ca + yaw; - var origin = selected.loc; + var done = this.__index__ >= this.__values__.length, + value = done ? undefined$1 : this.__values__[this.__index__++]; + return { + 'done': done, + 'value': value + }; + } + /** + * Enables the wrapper to be iterable. + * + * @name Symbol.iterator + * @memberOf _ + * @since 4.0.0 + * @category Seq + * @returns {Object} Returns the wrapper object. + * @example + * + * var wrapped = _([1, 2]); + * + * wrapped[Symbol.iterator]() === wrapped; + * // => true + * + * Array.from(wrapped); + * // => [1, 2] + */ - // construct a search trapezoid pointing out from current bubble - var meters = 35; - var p1 = [ - origin[0] + geoMetersToLon(meters / 5, origin[1]), - origin[1] - ]; - var p2 = [ - origin[0] + geoMetersToLon(meters / 2, origin[1]), - origin[1] + geoMetersToLat(meters) - ]; - var p3 = [ - origin[0] - geoMetersToLon(meters / 2, origin[1]), - origin[1] + geoMetersToLat(meters) - ]; - var p4 = [ - origin[0] - geoMetersToLon(meters / 5, origin[1]), - origin[1] - ]; - var poly = [p1, p2, p3, p4, p1]; + function wrapperToIterator() { + return this; + } + /** + * Creates a clone of the chain sequence planting `value` as the wrapped value. + * + * @name plant + * @memberOf _ + * @since 3.2.0 + * @category Seq + * @param {*} value The value to plant. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var wrapped = _([1, 2]).map(square); + * var other = wrapped.plant([3, 4]); + * + * other.value(); + * // => [9, 16] + * + * wrapped.value(); + * // => [1, 4] + */ + - // rotate it to face forward/backward - var angle = (stepBy === 1 ? ca : ca + 180) * (Math.PI / 180); - poly = geoRotate(poly, -angle, origin); + function wrapperPlant(value) { + var result, + parent = this; - var extent = poly.reduce(function (extent, point) { - return extent.extend(geoExtent(point)); - }, geoExtent()); + while (parent instanceof baseLodash) { + var clone = wrapperClone(parent); + clone.__index__ = 0; + clone.__values__ = undefined$1; - // find nearest other bubble in the search polygon - var minDist = Infinity; - _ssCache.bubbles.rtree.search(extent.bbox()) - .forEach(function (d) { - if (d.data.key === selected.key) { return; } - if (!geoPointInPolygon(d.data.loc, poly)) { return; } - - var dist = geoVecLength(d.data.loc, selected.loc); - var theta = selected.ca - d.data.ca; - var minTheta = Math.min(Math.abs(theta), 360 - Math.abs(theta)); - if (minTheta > 20) { - dist += 5; // penalize distance if camera angles don't match - } + if (result) { + previous.__wrapped__ = clone; + } else { + result = clone; + } - if (dist < minDist) { - nextID = d.data.key; - minDist = dist; - } - }); + var previous = clone; + parent = parent.__wrapped__; + } - var nextBubble = nextID && _ssCache.bubbles.points[nextID]; - if (!nextBubble) { return; } + previous.__wrapped__ = value; + return result; + } + /** + * This method is the wrapper version of `_.reverse`. + * + * **Note:** This method mutates the wrapped array. + * + * @name reverse + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var array = [1, 2, 3]; + * + * _(array).reverse().value() + * // => [3, 2, 1] + * + * console.log(array); + * // => [3, 2, 1] + */ - context.map().centerEase(nextBubble.loc); - that.selectImage(context, nextBubble) - .then(function (response) { - if (response.status === 'ok') { - _sceneOptions.yaw = yaw; - that.showViewer(context); - } - }); - }; - } - }, + function wrapperReverse() { + var value = this.__wrapped__; + if (value instanceof LazyWrapper) { + var wrapped = value; - /** - * showViewer() - */ - showViewer: function(context, yaw) { - if (!_sceneOptions) { return; } + if (this.__actions__.length) { + wrapped = new LazyWrapper(this); + } - if (yaw !== undefined) { - _sceneOptions.yaw = yaw; - } + wrapped = wrapped.reverse(); - if (!_pannellumViewer) { - this.initViewer(); - } else { - // make a new scene - var sceneID = ++_currScene + ''; - _pannellumViewer - .addScene(sceneID, _sceneOptions) - .loadScene(sceneID); + wrapped.__actions__.push({ + 'func': thru, + 'args': [reverse], + 'thisArg': undefined$1 + }); - // remove previous scene - if (_currScene > 2) { - sceneID = (_currScene - 1) + ''; - _pannellumViewer - .removeScene(sceneID); + return new LodashWrapper(wrapped, this.__chain__); + } + + return this.thru(reverse); } - } + /** + * Executes the chain sequence to resolve the unwrapped value. + * + * @name value + * @memberOf _ + * @since 0.1.0 + * @alias toJSON, valueOf + * @category Seq + * @returns {*} Returns the resolved unwrapped value. + * @example + * + * _([1, 2, 3]).value(); + * // => [1, 2, 3] + */ - var wrap = context.container().select('.photoviewer') - .classed('hide', false); - var isHidden = wrap.selectAll('.photo-wrapper.ms-wrapper.hide').size(); + function wrapperValue() { + return baseWrapperValue(this.__wrapped__, this.__actions__); + } + /*------------------------------------------------------------------------*/ - if (isHidden) { - wrap - .selectAll('.photo-wrapper:not(.ms-wrapper)') - .classed('hide', true); + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The corresponding value of + * each key is the number of times the key was returned by `iteratee`. The + * iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * _.countBy([6.1, 4.2, 6.3], Math.floor); + * // => { '4': 1, '6': 2 } + * + * // The `_.property` iteratee shorthand. + * _.countBy(['one', 'two', 'three'], 'length'); + * // => { '3': 2, '5': 1 } + */ - wrap - .selectAll('.photo-wrapper.ms-wrapper') - .classed('hide', false); - } - return this; - }, + var countBy = createAggregator(function (result, value, key) { + if (hasOwnProperty.call(result, key)) { + ++result[key]; + } else { + baseAssignValue(result, key, 1); + } + }); + /** + * Checks if `predicate` returns truthy for **all** elements of `collection`. + * Iteration is stopped once `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index|key, collection). + * + * **Note:** This method returns `true` for + * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because + * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of + * elements of empty collections. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + * @example + * + * _.every([true, 1, null, 'yes'], Boolean); + * // => false + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * // The `_.matches` iteratee shorthand. + * _.every(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // The `_.matchesProperty` iteratee shorthand. + * _.every(users, ['active', false]); + * // => true + * + * // The `_.property` iteratee shorthand. + * _.every(users, 'active'); + * // => false + */ + function every(collection, predicate, guard) { + var func = isArray(collection) ? arrayEvery : baseEvery; - /** - * hideViewer() - */ - hideViewer: function (context) { - var viewer = context.container().select('.photoviewer'); - if (!viewer.empty()) { viewer.datum(null); } + if (guard && isIterateeCall(collection, predicate, guard)) { + predicate = undefined$1; + } - viewer - .classed('hide', true) - .selectAll('.photo-wrapper') - .classed('hide', true); + return func(collection, getIteratee(predicate, 3)); + } + /** + * Iterates over elements of `collection`, returning an array of all elements + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). + * + * **Note:** Unlike `_.remove`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + * @see _.reject + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * _.filter(users, function(o) { return !o.active; }); + * // => objects for ['fred'] + * + * // The `_.matches` iteratee shorthand. + * _.filter(users, { 'age': 36, 'active': true }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.filter(users, ['active', false]); + * // => objects for ['fred'] + * + * // The `_.property` iteratee shorthand. + * _.filter(users, 'active'); + * // => objects for ['barney'] + * + * // Combining several predicates using `_.overEvery` or `_.overSome`. + * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]])); + * // => objects for ['fred', 'barney'] + */ - context.container().selectAll('.viewfield-group, .sequence, .icon-sign') - .classed('currentView', false); - return this.setStyles(context, null, true); - }, + function filter(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, getIteratee(predicate, 3)); + } + /** + * Iterates over elements of `collection`, returning the first element + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false }, + * { 'user': 'pebbles', 'age': 1, 'active': true } + * ]; + * + * _.find(users, function(o) { return o.age < 40; }); + * // => object for 'barney' + * + * // The `_.matches` iteratee shorthand. + * _.find(users, { 'age': 1, 'active': true }); + * // => object for 'pebbles' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.find(users, ['active', false]); + * // => object for 'fred' + * + * // The `_.property` iteratee shorthand. + * _.find(users, 'active'); + * // => object for 'barney' + */ - /** - * selectImage(). - */ - selectImage: function (context, d) { - var that = this; - var viewer = context.container().select('.photoviewer'); - if (!viewer.empty()) { viewer.datum(d); } + var find = createFind(findIndex); + /** + * This method is like `_.find` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Collection + * @param {Array|Object} collection The collection to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=collection.length-1] The index to search from. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * _.findLast([1, 2, 3, 4], function(n) { + * return n % 2 == 1; + * }); + * // => 3 + */ - this.setStyles(context, null, true); + var findLast = createFind(findLastIndex); + /** + * Creates a flattened array of values by running each element in `collection` + * thru `iteratee` and flattening the mapped results. The iteratee is invoked + * with three arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [n, n]; + * } + * + * _.flatMap([1, 2], duplicate); + * // => [1, 1, 2, 2] + */ - var wrap = context.container().select('.photoviewer .ms-wrapper'); - var attribution = wrap.selectAll('.photo-attribution').html(''); + function flatMap(collection, iteratee) { + return baseFlatten(map(collection, iteratee), 1); + } + /** + * This method is like `_.flatMap` except that it recursively flattens the + * mapped results. + * + * @static + * @memberOf _ + * @since 4.7.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [[[n, n]]]; + * } + * + * _.flatMapDeep([1, 2], duplicate); + * // => [1, 1, 2, 2] + */ - wrap.selectAll('.pnlm-load-box') // display "loading.." - .style('display', 'block'); - if (!d) { - return Promise.resolve({ status: 'ok' }); - } + function flatMapDeep(collection, iteratee) { + return baseFlatten(map(collection, iteratee), INFINITY); + } + /** + * This method is like `_.flatMap` except that it recursively flattens the + * mapped results up to `depth` times. + * + * @static + * @memberOf _ + * @since 4.7.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {number} [depth=1] The maximum recursion depth. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [[[n, n]]]; + * } + * + * _.flatMapDepth([1, 2], duplicate, 2); + * // => [[1, 1], [2, 2]] + */ - var line1 = attribution - .append('div') - .attr('class', 'attribution-row'); - var hiresDomId = utilUniqueDomId('streetside-hires'); + function flatMapDepth(collection, iteratee, depth) { + depth = depth === undefined$1 ? 1 : toInteger(depth); + return baseFlatten(map(collection, iteratee), depth); + } + /** + * Iterates over elements of `collection` and invokes `iteratee` for each element. + * The iteratee is invoked with three arguments: (value, index|key, collection). + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * **Note:** As with other "Collections" methods, objects with a "length" + * property are iterated like arrays. To avoid this behavior use `_.forIn` + * or `_.forOwn` for object iteration. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @alias each + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + * @see _.forEachRight + * @example + * + * _.forEach([1, 2], function(value) { + * console.log(value); + * }); + * // => Logs `1` then `2`. + * + * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a' then 'b' (iteration order is not guaranteed). + */ + - // Add hires checkbox - var label = line1 - .append('label') - .attr('for', hiresDomId) - .attr('class', 'streetside-hires'); + function forEach(collection, iteratee) { + var func = isArray(collection) ? arrayEach : baseEach; + return func(collection, getIteratee(iteratee, 3)); + } + /** + * This method is like `_.forEach` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @alias eachRight + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + * @see _.forEach + * @example + * + * _.forEachRight([1, 2], function(value) { + * console.log(value); + * }); + * // => Logs `2` then `1`. + */ - label - .append('input') - .attr('type', 'checkbox') - .attr('id', hiresDomId) - .property('checked', _hires) - .on('click', function () { - event.stopPropagation(); - _hires = !_hires; - _resolution = _hires ? 1024 : 512; - wrap.call(setupCanvas, true); + function forEachRight(collection, iteratee) { + var func = isArray(collection) ? arrayEachRight : baseEachRight; + return func(collection, getIteratee(iteratee, 3)); + } + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The order of grouped values + * is determined by the order they occur in `collection`. The corresponding + * value of each key is an array of elements responsible for generating the + * key. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * _.groupBy([6.1, 4.2, 6.3], Math.floor); + * // => { '4': [4.2], '6': [6.1, 6.3] } + * + * // The `_.property` iteratee shorthand. + * _.groupBy(['one', 'two', 'three'], 'length'); + * // => { '3': ['one', 'two'], '5': ['three'] } + */ - var viewstate = { - yaw: _pannellumViewer.getYaw(), - pitch: _pannellumViewer.getPitch(), - hfov: _pannellumViewer.getHfov() - }; - that.selectImage(context, d) - .then(function (response) { - if (response.status === 'ok') { - _sceneOptions = Object.assign(_sceneOptions, viewstate); - that.showViewer(context); - } - }); + var groupBy = createAggregator(function (result, value, key) { + if (hasOwnProperty.call(result, key)) { + result[key].push(value); + } else { + baseAssignValue(result, key, [value]); + } }); + /** + * Checks if `value` is in `collection`. If `collection` is a string, it's + * checked for a substring of `value`, otherwise + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * is used for equality comparisons. If `fromIndex` is negative, it's used as + * the offset from the end of `collection`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object|string} collection The collection to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=0] The index to search from. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. + * @returns {boolean} Returns `true` if `value` is found, else `false`. + * @example + * + * _.includes([1, 2, 3], 1); + * // => true + * + * _.includes([1, 2, 3], 1, 2); + * // => false + * + * _.includes({ 'a': 1, 'b': 2 }, 1); + * // => true + * + * _.includes('abcd', 'bc'); + * // => true + */ - label - .append('span') - .text(_t('streetside.hires')); + function includes(collection, value, fromIndex, guard) { + collection = isArrayLike(collection) ? collection : values(collection); + fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0; + var length = collection.length; + if (fromIndex < 0) { + fromIndex = nativeMax(length + fromIndex, 0); + } - var captureInfo = line1 - .append('div') - .attr('class', 'attribution-capture-info'); + return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1; + } + /** + * Invokes the method at `path` of each element in `collection`, returning + * an array of the results of each invoked method. Any additional arguments + * are provided to each invoked method. If `path` is a function, it's invoked + * for, and `this` bound to, each element in `collection`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Array|Function|string} path The path of the method to invoke or + * the function invoked per iteration. + * @param {...*} [args] The arguments to invoke each method with. + * @returns {Array} Returns the array of results. + * @example + * + * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort'); + * // => [[1, 5, 7], [1, 2, 3]] + * + * _.invokeMap([123, 456], String.prototype.split, ''); + * // => [['1', '2', '3'], ['4', '5', '6']] + */ - // Add capture date - if (d.captured_by) { - var yyyy = (new Date()).getFullYear(); - captureInfo - .append('a') - .attr('class', 'captured_by') - .attr('target', '_blank') - .attr('href', 'https://www.microsoft.com/en-us/maps/streetside') - .text('©' + yyyy + ' Microsoft'); + var invokeMap = baseRest(function (collection, path, args) { + var index = -1, + isFunc = typeof path == 'function', + result = isArrayLike(collection) ? Array(collection.length) : []; + baseEach(collection, function (value) { + result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args); + }); + return result; + }); + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The corresponding value of + * each key is the last element responsible for generating the key. The + * iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * var array = [ + * { 'dir': 'left', 'code': 97 }, + * { 'dir': 'right', 'code': 100 } + * ]; + * + * _.keyBy(array, function(o) { + * return String.fromCharCode(o.code); + * }); + * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } } + * + * _.keyBy(array, 'dir'); + * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } } + */ - captureInfo - .append('span') - .text('|'); - } + var keyBy = createAggregator(function (result, value, key) { + baseAssignValue(result, key, value); + }); + /** + * Creates an array of values by running each element in `collection` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. + * + * The guarded methods are: + * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, + * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, + * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, + * `template`, `trim`, `trimEnd`, `trimStart`, and `words` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + * @example + * + * function square(n) { + * return n * n; + * } + * + * _.map([4, 8], square); + * // => [16, 64] + * + * _.map({ 'a': 4, 'b': 8 }, square); + * // => [16, 64] (iteration order is not guaranteed) + * + * var users = [ + * { 'user': 'barney' }, + * { 'user': 'fred' } + * ]; + * + * // The `_.property` iteratee shorthand. + * _.map(users, 'user'); + * // => ['barney', 'fred'] + */ - if (d.captured_at) { - captureInfo - .append('span') - .attr('class', 'captured_at') - .text(localeTimestamp(d.captured_at)); - } + function map(collection, iteratee) { + var func = isArray(collection) ? arrayMap : baseMap; + return func(collection, getIteratee(iteratee, 3)); + } + /** + * This method is like `_.sortBy` except that it allows specifying the sort + * orders of the iteratees to sort by. If `orders` is unspecified, all values + * are sorted in ascending order. Otherwise, specify an order of "desc" for + * descending or "asc" for ascending sort order of corresponding values. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]] + * The iteratees to sort by. + * @param {string[]} [orders] The sort orders of `iteratees`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. + * @returns {Array} Returns the new sorted array. + * @example + * + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 34 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'barney', 'age': 36 } + * ]; + * + * // Sort by `user` in ascending order and by `age` in descending order. + * _.orderBy(users, ['user', 'age'], ['asc', 'desc']); + * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] + */ - // Add image links - var line2 = attribution - .append('div') - .attr('class', 'attribution-row'); - line2 - .append('a') - .attr('class', 'image-view-link') - .attr('target', '_blank') - .attr('href', 'https://www.bing.com/maps?cp=' + d.loc[1] + '~' + d.loc[0] + - '&lvl=17&dir=' + d.ca + '&style=x&v=2&sV=1') - .text(_t('streetside.view_on_bing')); + function orderBy(collection, iteratees, orders, guard) { + if (collection == null) { + return []; + } - line2 - .append('a') - .attr('class', 'image-report-link') - .attr('target', '_blank') - .attr('href', 'https://www.bing.com/maps/privacyreport/streetsideprivacyreport?bubbleid=' + - encodeURIComponent(d.key) + '&focus=photo&lat=' + d.loc[1] + '&lng=' + d.loc[0] + '&z=17') - .text(_t('streetside.report')); + if (!isArray(iteratees)) { + iteratees = iteratees == null ? [] : [iteratees]; + } + orders = guard ? undefined$1 : orders; - var bubbleIdQuadKey = d.key.toString(4); - var paddingNeeded = 16 - bubbleIdQuadKey.length; - for (var i = 0; i < paddingNeeded; i++) { - bubbleIdQuadKey = '0' + bubbleIdQuadKey; - } - var imgUrlPrefix = streetsideImagesApi + 'hs' + bubbleIdQuadKey; - var imgUrlSuffix = '.jpg?g=6338&n=z'; + if (!isArray(orders)) { + orders = orders == null ? [] : [orders]; + } - // Cubemap face code order matters here: front=01, right=02, back=03, left=10, up=11, down=12 - var faceKeys = ['01','02','03','10','11','12']; + return baseOrderBy(collection, iteratees, orders); + } + /** + * Creates an array of elements split into two groups, the first of which + * contains elements `predicate` returns truthy for, the second of which + * contains elements `predicate` returns falsey for. The predicate is + * invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the array of grouped elements. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': true }, + * { 'user': 'pebbles', 'age': 1, 'active': false } + * ]; + * + * _.partition(users, function(o) { return o.active; }); + * // => objects for [['fred'], ['barney', 'pebbles']] + * + * // The `_.matches` iteratee shorthand. + * _.partition(users, { 'age': 1, 'active': false }); + * // => objects for [['pebbles'], ['barney', 'fred']] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.partition(users, ['active', false]); + * // => objects for [['barney', 'pebbles'], ['fred']] + * + * // The `_.property` iteratee shorthand. + * _.partition(users, 'active'); + * // => objects for [['fred'], ['barney', 'pebbles']] + */ - // Map images to cube faces - var quadKeys = getQuadKeys(); - var faces = faceKeys.map(function (faceKey) { - return quadKeys.map(function (quadKey) { - var xy = qkToXY(quadKey); - return { - face: faceKey, - url: imgUrlPrefix + faceKey + quadKey + imgUrlSuffix, - x: xy[0], - y: xy[1] - }; + + var partition = createAggregator(function (result, value, key) { + result[key ? 0 : 1].push(value); + }, function () { + return [[], []]; }); - }); + /** + * Reduces `collection` to a value which is the accumulated result of running + * each element in `collection` thru `iteratee`, where each successive + * invocation is supplied the return value of the previous. If `accumulator` + * is not given, the first element of `collection` is used as the initial + * value. The iteratee is invoked with four arguments: + * (accumulator, value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.reduce`, `_.reduceRight`, and `_.transform`. + * + * The guarded methods are: + * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`, + * and `sortBy` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @returns {*} Returns the accumulated value. + * @see _.reduceRight + * @example + * + * _.reduce([1, 2], function(sum, n) { + * return sum + n; + * }, 0); + * // => 3 + * + * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { + * (result[value] || (result[value] = [])).push(key); + * return result; + * }, {}); + * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed) + */ + + function reduce(collection, iteratee, accumulator) { + var func = isArray(collection) ? arrayReduce : baseReduce, + initAccum = arguments.length < 3; + return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach); + } + /** + * This method is like `_.reduce` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @returns {*} Returns the accumulated value. + * @see _.reduce + * @example + * + * var array = [[0, 1], [2, 3], [4, 5]]; + * + * _.reduceRight(array, function(flattened, other) { + * return flattened.concat(other); + * }, []); + * // => [4, 5, 2, 3, 0, 1] + */ + + + function reduceRight(collection, iteratee, accumulator) { + var func = isArray(collection) ? arrayReduceRight : baseReduce, + initAccum = arguments.length < 3; + return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight); + } + /** + * The opposite of `_.filter`; this method returns the elements of `collection` + * that `predicate` does **not** return truthy for. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + * @see _.filter + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': true } + * ]; + * + * _.reject(users, function(o) { return !o.active; }); + * // => objects for ['fred'] + * + * // The `_.matches` iteratee shorthand. + * _.reject(users, { 'age': 40, 'active': true }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.reject(users, ['active', false]); + * // => objects for ['fred'] + * + * // The `_.property` iteratee shorthand. + * _.reject(users, 'active'); + * // => objects for ['barney'] + */ + + + function reject(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, negate(getIteratee(predicate, 3))); + } + /** + * Gets a random element from `collection`. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Collection + * @param {Array|Object} collection The collection to sample. + * @returns {*} Returns the random element. + * @example + * + * _.sample([1, 2, 3, 4]); + * // => 2 + */ - return loadFaces(faces) - .then(function () { - _sceneOptions = { - showFullscreenCtrl: false, - autoLoad: true, - compass: true, - northOffset: d.ca, - yaw: 0, - minHfov: minHfov, - maxHfov: maxHfov, - hfov: defaultHfov, - type: 'cubemap', - cubeMap: [ - _dataUrlArray[0], - _dataUrlArray[1], - _dataUrlArray[2], - _dataUrlArray[3], - _dataUrlArray[4], - _dataUrlArray[5] - ] - }; - return { status: 'ok' }; - }); - }, + function sample(collection) { + var func = isArray(collection) ? arraySample : baseSample; + return func(collection); + } + /** + * Gets `n` random elements at unique keys from `collection` up to the + * size of `collection`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to sample. + * @param {number} [n=1] The number of elements to sample. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the random elements. + * @example + * + * _.sampleSize([1, 2, 3], 2); + * // => [3, 1] + * + * _.sampleSize([1, 2, 3], 4); + * // => [2, 3, 1] + */ - getSequenceKeyForBubble: function(d) { - return d && d.sequenceKey; - }, + function sampleSize(collection, n, guard) { + if (guard ? isIterateeCall(collection, n, guard) : n === undefined$1) { + n = 1; + } else { + n = toInteger(n); + } - // Updates the currently highlighted sequence and selected bubble. - // Reset is only necessary when interacting with the viewport because - // this implicitly changes the currently selected bubble/sequence - setStyles: function (context, hovered, reset) { - if (reset) { // reset all layers - context.container().selectAll('.viewfield-group') - .classed('highlighted', false) - .classed('hovered', false) - .classed('currentView', false); + var func = isArray(collection) ? arraySampleSize : baseSampleSize; + return func(collection, n); + } + /** + * Creates an array of shuffled values, using a version of the + * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to shuffle. + * @returns {Array} Returns the new shuffled array. + * @example + * + * _.shuffle([1, 2, 3, 4]); + * // => [4, 1, 3, 2] + */ - context.container().selectAll('.sequence') - .classed('highlighted', false) - .classed('currentView', false); - } - var hoveredBubbleKey = hovered && hovered.key; - var hoveredSequenceKey = this.getSequenceKeyForBubble(hovered); - var hoveredSequence = hoveredSequenceKey && _ssCache.sequences[hoveredSequenceKey]; - var hoveredBubbleKeys = (hoveredSequence && hoveredSequence.bubbles.map(function (d) { return d.key; })) || []; + function shuffle(collection) { + var func = isArray(collection) ? arrayShuffle : baseShuffle; + return func(collection); + } + /** + * Gets the size of `collection` by returning its length for array-like + * values or the number of own enumerable string keyed properties for objects. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object|string} collection The collection to inspect. + * @returns {number} Returns the collection size. + * @example + * + * _.size([1, 2, 3]); + * // => 3 + * + * _.size({ 'a': 1, 'b': 2 }); + * // => 2 + * + * _.size('pebbles'); + * // => 7 + */ - var viewer = context.container().select('.photoviewer'); - var selected = viewer.empty() ? undefined : viewer.datum(); - var selectedBubbleKey = selected && selected.key; - var selectedSequenceKey = this.getSequenceKeyForBubble(selected); - var selectedSequence = selectedSequenceKey && _ssCache.sequences[selectedSequenceKey]; - var selectedBubbleKeys = (selectedSequence && selectedSequence.bubbles.map(function (d) { return d.key; })) || []; - // highlight sibling viewfields on either the selected or the hovered sequences - var highlightedBubbleKeys = utilArrayUnion(hoveredBubbleKeys, selectedBubbleKeys); + function size(collection) { + if (collection == null) { + return 0; + } - context.container().selectAll('.layer-streetside-images .viewfield-group') - .classed('highlighted', function (d) { return highlightedBubbleKeys.indexOf(d.key) !== -1; }) - .classed('hovered', function (d) { return d.key === hoveredBubbleKey; }) - .classed('currentView', function (d) { return d.key === selectedBubbleKey; }); + if (isArrayLike(collection)) { + return isString(collection) ? stringSize(collection) : collection.length; + } - context.container().selectAll('.layer-streetside-images .sequence') - .classed('highlighted', function (d) { return d.properties.key === hoveredSequenceKey; }) - .classed('currentView', function (d) { return d.properties.key === selectedSequenceKey; }); + var tag = getTag(collection); - // update viewfields if needed - context.container().selectAll('.viewfield-group .viewfield') - .attr('d', viewfieldPath); + if (tag == mapTag || tag == setTag) { + return collection.size; + } - function viewfieldPath() { - var d = this.parentNode.__data__; - if (d.pano && d.key !== selectedBubbleKey) { - return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0'; - } else { - return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z'; + return baseKeys(collection).length; } - } + /** + * Checks if `predicate` returns truthy for **any** element of `collection`. + * Iteration is stopped once `predicate` returns truthy. The predicate is + * invoked with three arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + * @example + * + * _.some([null, 0, 'yes', false], Boolean); + * // => true + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false } + * ]; + * + * // The `_.matches` iteratee shorthand. + * _.some(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // The `_.matchesProperty` iteratee shorthand. + * _.some(users, ['active', false]); + * // => true + * + * // The `_.property` iteratee shorthand. + * _.some(users, 'active'); + * // => true + */ - return this; - }, + function some(collection, predicate, guard) { + var func = isArray(collection) ? arraySome : baseSome; - /** - * cache(). - */ - cache: function () { - return _ssCache; - } - }; + if (guard && isIterateeCall(collection, predicate, guard)) { + predicate = undefined$1; + } - var apibase$4 = 'https://taginfo.openstreetmap.org/api/4/'; - var _inflight$2 = {}; - var _popularKeys = {}; - var _taginfoCache = {}; + return func(collection, getIteratee(predicate, 3)); + } + /** + * Creates an array of elements, sorted in ascending order by the results of + * running each element in a collection thru each iteratee. This method + * performs a stable sort, that is, it preserves the original sort order of + * equal elements. The iteratees are invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {...(Function|Function[])} [iteratees=[_.identity]] + * The iteratees to sort by. + * @returns {Array} Returns the new sorted array. + * @example + * + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 30 }, + * { 'user': 'barney', 'age': 34 } + * ]; + * + * _.sortBy(users, [function(o) { return o.user; }]); + * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]] + * + * _.sortBy(users, ['user', 'age']); + * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]] + */ - var tag_sorts = { - point: 'count_nodes', - vertex: 'count_nodes', - area: 'count_ways', - line: 'count_ways' - }; - var tag_sort_members = { - point: 'count_node_members', - vertex: 'count_node_members', - area: 'count_way_members', - line: 'count_way_members', - relation: 'count_relation_members' - }; - var tag_filters = { - point: 'nodes', - vertex: 'nodes', - area: 'ways', - line: 'ways' - }; - var tag_members_fractions = { - point: 'count_node_members_fraction', - vertex: 'count_node_members_fraction', - area: 'count_way_members_fraction', - line: 'count_way_members_fraction', - relation: 'count_relation_members_fraction' - }; + var sortBy = baseRest(function (collection, iteratees) { + if (collection == null) { + return []; + } - function sets(params, n, o) { - if (params.geometry && o[params.geometry]) { - params[n] = o[params.geometry]; - } - return params; - } + var length = iteratees.length; + if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) { + iteratees = []; + } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) { + iteratees = [iteratees[0]]; + } - function setFilter(params) { - return sets(params, 'filter', tag_filters); - } + return baseOrderBy(collection, baseFlatten(iteratees, 1), []); + }); + /*------------------------------------------------------------------------*/ + /** + * Gets the timestamp of the number of milliseconds that have elapsed since + * the Unix epoch (1 January 1970 00:00:00 UTC). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Date + * @returns {number} Returns the timestamp. + * @example + * + * _.defer(function(stamp) { + * console.log(_.now() - stamp); + * }, _.now()); + * // => Logs the number of milliseconds it took for the deferred invocation. + */ - function setSort(params) { - return sets(params, 'sortname', tag_sorts); - } + var now = ctxNow || function () { + return root.Date.now(); + }; + /*------------------------------------------------------------------------*/ + /** + * The opposite of `_.before`; this method creates a function that invokes + * `func` once it's called `n` or more times. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {number} n The number of calls before `func` is invoked. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var saves = ['profile', 'settings']; + * + * var done = _.after(saves.length, function() { + * console.log('done saving!'); + * }); + * + * _.forEach(saves, function(type) { + * asyncSave({ 'type': type, 'complete': done }); + * }); + * // => Logs 'done saving!' after the two async saves have completed. + */ - function setSortMembers(params) { - return sets(params, 'sortname', tag_sort_members); - } + function after(n, func) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } - function clean(params) { - return utilObjectOmit(params, ['geometry', 'debounce']); - } + n = toInteger(n); + return function () { + if (--n < 1) { + return func.apply(this, arguments); + } + }; + } + /** + * Creates a function that invokes `func`, with up to `n` arguments, + * ignoring any additional arguments. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to cap arguments for. + * @param {number} [n=func.length] The arity cap. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new capped function. + * @example + * + * _.map(['6', '8', '10'], _.ary(parseInt, 1)); + * // => [6, 8, 10] + */ - function filterKeys(type) { - var count_type = type ? 'count_' + type : 'count_all'; - return function(d) { - return parseFloat(d[count_type]) > 2500 || d.in_wiki; - }; - } + function ary(func, n, guard) { + n = guard ? undefined$1 : n; + n = func && n == null ? func.length : n; + return createWrap(func, WRAP_ARY_FLAG, undefined$1, undefined$1, undefined$1, undefined$1, n); + } + /** + * Creates a function that invokes `func`, with the `this` binding and arguments + * of the created function, while it's called less than `n` times. Subsequent + * calls to the created function return the result of the last `func` invocation. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {number} n The number of calls at which `func` is no longer invoked. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * jQuery(element).on('click', _.before(5, addContactToList)); + * // => Allows adding up to 4 contacts to the list. + */ - function filterMultikeys(prefix) { - return function(d) { - // d.key begins with prefix, and d.key contains no additional ':'s - var re = new RegExp('^' + prefix + '(.*)$'); - var matches = d.key.match(re) || []; - return (matches.length === 2 && matches[1].indexOf(':') === -1); - }; - } + function before(n, func) { + var result; + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } - function filterValues(allowUpperCase) { - return function(d) { - if (d.value.match(/[;,]/) !== null) { return false; } // exclude some punctuation - if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) { return false; } // exclude uppercase letters - return parseFloat(d.fraction) > 0.0; - }; - } + n = toInteger(n); + return function () { + if (--n > 0) { + result = func.apply(this, arguments); + } + if (n <= 1) { + func = undefined$1; + } - function filterRoles(geometry) { - return function(d) { - if (d.role === '') { return false; } // exclude empty role - if (d.role.match(/[A-Z*;,]/) !== null) { return false; } // exclude uppercase letters and some punctuation - return parseFloat(d[tag_members_fractions[geometry]]) > 0.0; - }; - } + return result; + }; + } + /** + * Creates a function that invokes `func` with the `this` binding of `thisArg` + * and `partials` prepended to the arguments it receives. + * + * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for partially applied arguments. + * + * **Note:** Unlike native `Function#bind`, this method doesn't set the "length" + * property of bound functions. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to bind. + * @param {*} thisArg The `this` binding of `func`. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * function greet(greeting, punctuation) { + * return greeting + ' ' + this.user + punctuation; + * } + * + * var object = { 'user': 'fred' }; + * + * var bound = _.bind(greet, object, 'hi'); + * bound('!'); + * // => 'hi fred!' + * + * // Bound with placeholders. + * var bound = _.bind(greet, object, _, '!'); + * bound('hi'); + * // => 'hi fred!' + */ - function valKey(d) { - return { - value: d.key, - title: d.key - }; - } + var bind = baseRest(function (func, thisArg, partials) { + var bitmask = WRAP_BIND_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bind)); + bitmask |= WRAP_PARTIAL_FLAG; + } - function valKeyDescription(d) { - var obj = { - value: d.value, - title: d.description || d.value - }; - if (d.count) { - obj.count = d.count; - } - return obj; - } + return createWrap(func, bitmask, thisArg, partials, holders); + }); + /** + * Creates a function that invokes the method at `object[key]` with `partials` + * prepended to the arguments it receives. + * + * This method differs from `_.bind` by allowing bound functions to reference + * methods that may be redefined or don't yet exist. See + * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern) + * for more details. + * + * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * @static + * @memberOf _ + * @since 0.10.0 + * @category Function + * @param {Object} object The object to invoke the method on. + * @param {string} key The key of the method. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * var object = { + * 'user': 'fred', + * 'greet': function(greeting, punctuation) { + * return greeting + ' ' + this.user + punctuation; + * } + * }; + * + * var bound = _.bindKey(object, 'greet', 'hi'); + * bound('!'); + * // => 'hi fred!' + * + * object.greet = function(greeting, punctuation) { + * return greeting + 'ya ' + this.user + punctuation; + * }; + * + * bound('!'); + * // => 'hiya fred!' + * + * // Bound with placeholders. + * var bound = _.bindKey(object, 'greet', _, '!'); + * bound('hi'); + * // => 'hiya fred!' + */ + var bindKey = baseRest(function (object, key, partials) { + var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG; - function roleKey(d) { - return { - value: d.role, - title: d.role - }; - } + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bindKey)); + bitmask |= WRAP_PARTIAL_FLAG; + } + + return createWrap(key, bitmask, object, partials, holders); + }); + /** + * Creates a function that accepts arguments of `func` and either invokes + * `func` returning its result, if at least `arity` number of arguments have + * been provided, or returns a function that accepts the remaining `func` + * arguments, and so on. The arity of `func` may be specified if `func.length` + * is not sufficient. + * + * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for provided arguments. + * + * **Note:** This method doesn't set the "length" property of curried functions. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Function + * @param {Function} func The function to curry. + * @param {number} [arity=func.length] The arity of `func`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new curried function. + * @example + * + * var abc = function(a, b, c) { + * return [a, b, c]; + * }; + * + * var curried = _.curry(abc); + * + * curried(1)(2)(3); + * // => [1, 2, 3] + * + * curried(1, 2)(3); + * // => [1, 2, 3] + * + * curried(1, 2, 3); + * // => [1, 2, 3] + * + * // Curried with placeholders. + * curried(1)(_, 3)(2); + * // => [1, 2, 3] + */ + function curry(func, arity, guard) { + arity = guard ? undefined$1 : arity; + var result = createWrap(func, WRAP_CURRY_FLAG, undefined$1, undefined$1, undefined$1, undefined$1, undefined$1, arity); + result.placeholder = curry.placeholder; + return result; + } + /** + * This method is like `_.curry` except that arguments are applied to `func` + * in the manner of `_.partialRight` instead of `_.partial`. + * + * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for provided arguments. + * + * **Note:** This method doesn't set the "length" property of curried functions. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to curry. + * @param {number} [arity=func.length] The arity of `func`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new curried function. + * @example + * + * var abc = function(a, b, c) { + * return [a, b, c]; + * }; + * + * var curried = _.curryRight(abc); + * + * curried(3)(2)(1); + * // => [1, 2, 3] + * + * curried(2, 3)(1); + * // => [1, 2, 3] + * + * curried(1, 2, 3); + * // => [1, 2, 3] + * + * // Curried with placeholders. + * curried(3)(1, _)(2); + * // => [1, 2, 3] + */ - // sort keys with ':' lower than keys without ':' - function sortKeys(a, b) { - return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1 - : (a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1) ? 1 - : 0; - } + function curryRight(func, arity, guard) { + arity = guard ? undefined$1 : arity; + var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined$1, undefined$1, undefined$1, undefined$1, undefined$1, arity); + result.placeholder = curryRight.placeholder; + return result; + } + /** + * Creates a debounced function that delays invoking `func` until after `wait` + * milliseconds have elapsed since the last time the debounced function was + * invoked. The debounced function comes with a `cancel` method to cancel + * delayed `func` invocations and a `flush` method to immediately invoke them. + * Provide `options` to indicate whether `func` should be invoked on the + * leading and/or trailing edge of the `wait` timeout. The `func` is invoked + * with the last arguments provided to the debounced function. Subsequent + * calls to the debounced function return the result of the last `func` + * invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the debounced function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.debounce` and `_.throttle`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to debounce. + * @param {number} [wait=0] The number of milliseconds to delay. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=false] + * Specify invoking on the leading edge of the timeout. + * @param {number} [options.maxWait] + * The maximum time `func` is allowed to be delayed before it's invoked. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new debounced function. + * @example + * + * // Avoid costly calculations while the window size is in flux. + * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); + * + * // Invoke `sendMail` when clicked, debouncing subsequent calls. + * jQuery(element).on('click', _.debounce(sendMail, 300, { + * 'leading': true, + * 'trailing': false + * })); + * + * // Ensure `batchLog` is invoked once after 1 second of debounced calls. + * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); + * var source = new EventSource('/stream'); + * jQuery(source).on('message', debounced); + * + * // Cancel the trailing debounced invocation. + * jQuery(window).on('popstate', debounced.cancel); + */ - var debouncedRequest$1 = debounce(request$1, 300, { leading: false }); - function request$1(url, params, exactMatch, callback, loaded) { - if (_inflight$2[url]) { return; } + function debounce(func, wait, options) { + var lastArgs, + lastThis, + maxWait, + result, + timerId, + lastCallTime, + lastInvokeTime = 0, + leading = false, + maxing = false, + trailing = true; - if (checkCache(url, params, exactMatch, callback)) { return; } + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } - var controller = new AbortController(); - _inflight$2[url] = controller; + wait = toNumber(wait) || 0; - d3_json(url, { signal: controller.signal }) - .then(function(result) { - delete _inflight$2[url]; - if (loaded) { loaded(null, result); } - }) - .catch(function(err) { - delete _inflight$2[url]; - if (err.name === 'AbortError') { return; } - if (loaded) { loaded(err.message); } - }); - } + if (isObject(options)) { + leading = !!options.leading; + maxing = 'maxWait' in options; + maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + function invokeFunc(time) { + var args = lastArgs, + thisArg = lastThis; + lastArgs = lastThis = undefined$1; + lastInvokeTime = time; + result = func.apply(thisArg, args); + return result; + } - function checkCache(url, params, exactMatch, callback) { - var rp = params.rp || 25; - var testQuery = params.query || ''; - var testUrl = url; + function leadingEdge(time) { + // Reset any `maxWait` timer. + lastInvokeTime = time; // Start the timer for the trailing edge. - do { - var hit = _taginfoCache[testUrl]; + timerId = setTimeout(timerExpired, wait); // Invoke the leading edge. - // exact match, or shorter match yielding fewer than max results (rp) - if (hit && (url === testUrl || hit.length < rp)) { - callback(null, hit); - return true; + return leading ? invokeFunc(time) : result; + } + + function remainingWait(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime, + timeWaiting = wait - timeSinceLastCall; + return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting; } - // don't try to shorten the query - if (exactMatch || !testQuery.length) { return false; } + function shouldInvoke(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime; // Either this is the first call, activity has stopped and we're at the + // trailing edge, the system time has gone backwards and we're treating + // it as the trailing edge, or we've hit the `maxWait` limit. - // do shorten the query to see if we already have a cached result - // that has returned fewer than max results (rp) - testQuery = testQuery.slice(0, -1); - testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&'); - } while (testQuery.length >= 0); + return lastCallTime === undefined$1 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait; + } - return false; - } + function timerExpired() { + var time = now(); + if (shouldInvoke(time)) { + return trailingEdge(time); + } // Restart the timer. - var serviceTaginfo = { - init: function() { - _inflight$2 = {}; - _taginfoCache = {}; - _popularKeys = { - // manually exclude some keys – #5377, #7485 - postal_code: true, - full_name: true, - loc_name: true, - reg_name: true, - short_name: true, - sorting_name: true, - artist_name: true, - nat_name: true, - long_name: true, - 'bridge:name': true - }; + timerId = setTimeout(timerExpired, remainingWait(time)); + } - // Fetch popular keys. We'll exclude these from `values` - // lookups because they stress taginfo, and they aren't likely - // to yield meaningful autocomplete results.. see #3955 - var params = { - rp: 100, - sortname: 'values_all', - sortorder: 'desc', - page: 1, - debounce: false, - lang: _mainLocalizer.languageCode() - }; - this.keys(params, function(err, data) { - if (err) { return; } - data.forEach(function(d) { - if (d.value === 'opening_hours') { return; } // exception - _popularKeys[d.value] = true; - }); - }); - }, + function trailingEdge(time) { + timerId = undefined$1; // Only invoke if we have `lastArgs` which means `func` has been + // debounced at least once. + if (trailing && lastArgs) { + return invokeFunc(time); + } - reset: function() { - Object.values(_inflight$2).forEach(function(controller) { controller.abort(); }); - _inflight$2 = {}; - }, + lastArgs = lastThis = undefined$1; + return result; + } + function cancel() { + if (timerId !== undefined$1) { + clearTimeout(timerId); + } - keys: function(params, callback) { - var doRequest = params.debounce ? debouncedRequest$1 : request$1; - params = clean(setSort(params)); - params = Object.assign({ - rp: 10, - sortname: 'count_all', - sortorder: 'desc', - page: 1, - lang: _mainLocalizer.languageCode() - }, params); + lastInvokeTime = 0; + lastArgs = lastCallTime = lastThis = timerId = undefined$1; + } - var url = apibase$4 + 'keys/all?' + utilQsString(params); - doRequest(url, params, false, callback, function(err, d) { - if (err) { - callback(err); - } else { - var f = filterKeys(params.filter); - var result = d.data.filter(f).sort(sortKeys).map(valKey); - _taginfoCache[url] = result; - callback(null, result); - } - }); - }, + function flush() { + return timerId === undefined$1 ? result : trailingEdge(now()); + } + function debounced() { + var time = now(), + isInvoking = shouldInvoke(time); + lastArgs = arguments; + lastThis = this; + lastCallTime = time; - multikeys: function(params, callback) { - var doRequest = params.debounce ? debouncedRequest$1 : request$1; - params = clean(setSort(params)); - params = Object.assign({ - rp: 25, - sortname: 'count_all', - sortorder: 'desc', - page: 1, - lang: _mainLocalizer.languageCode() - }, params); - - var prefix = params.query; - var url = apibase$4 + 'keys/all?' + utilQsString(params); - doRequest(url, params, true, callback, function(err, d) { - if (err) { - callback(err); - } else { - var f = filterMultikeys(prefix); - var result = d.data.filter(f).map(valKey); - _taginfoCache[url] = result; - callback(null, result); + if (isInvoking) { + if (timerId === undefined$1) { + return leadingEdge(lastCallTime); } - }); - }, + if (maxing) { + // Handle invocations in a tight loop. + clearTimeout(timerId); + timerId = setTimeout(timerExpired, wait); + return invokeFunc(lastCallTime); + } + } - values: function(params, callback) { - // Exclude popular keys from values lookups.. see #3955 - var key = params.key; - if (key && _popularKeys[key]) { - callback(null, []); - return; + if (timerId === undefined$1) { + timerId = setTimeout(timerExpired, wait); + } + + return result; } - var doRequest = params.debounce ? debouncedRequest$1 : request$1; - params = clean(setSort(setFilter(params))); - params = Object.assign({ - rp: 25, - sortname: 'count_all', - sortorder: 'desc', - page: 1, - lang: _mainLocalizer.languageCode() - }, params); + debounced.cancel = cancel; + debounced.flush = flush; + return debounced; + } + /** + * Defers invoking the `func` until the current call stack has cleared. Any + * additional arguments are provided to `func` when it's invoked. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to defer. + * @param {...*} [args] The arguments to invoke `func` with. + * @returns {number} Returns the timer id. + * @example + * + * _.defer(function(text) { + * console.log(text); + * }, 'deferred'); + * // => Logs 'deferred' after one millisecond. + */ - var url = apibase$4 + 'key/values?' + utilQsString(params); - doRequest(url, params, false, callback, function(err, d) { - if (err) { - callback(err); - } else { - // In most cases we prefer taginfo value results with lowercase letters. - // A few OSM keys expect values to contain uppercase values (see #3377). - // This is not an exhaustive list (e.g. `name` also has uppercase values) - // but these are the fields where taginfo value lookup is most useful. - var re = /network|taxon|genus|species|brand|grape_variety|royal_cypher|listed_status|booth|rating|stars|:output|_hours|_times|_ref|manufacturer|country|target|brewery/; - var allowUpperCase = re.test(params.key); - var f = filterValues(allowUpperCase); - - var result = d.data.filter(f).map(valKeyDescription); - _taginfoCache[url] = result; - callback(null, result); - } - }); - }, + var defer = baseRest(function (func, args) { + return baseDelay(func, 1, args); + }); + /** + * Invokes `func` after `wait` milliseconds. Any additional arguments are + * provided to `func` when it's invoked. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {...*} [args] The arguments to invoke `func` with. + * @returns {number} Returns the timer id. + * @example + * + * _.delay(function(text) { + * console.log(text); + * }, 1000, 'later'); + * // => Logs 'later' after one second. + */ - roles: function(params, callback) { - var doRequest = params.debounce ? debouncedRequest$1 : request$1; - var geometry = params.geometry; - params = clean(setSortMembers(params)); - params = Object.assign({ - rp: 25, - sortname: 'count_all_members', - sortorder: 'desc', - page: 1, - lang: _mainLocalizer.languageCode() - }, params); - - var url = apibase$4 + 'relation/roles?' + utilQsString(params); - doRequest(url, params, true, callback, function(err, d) { - if (err) { - callback(err); - } else { - var f = filterRoles(geometry); - var result = d.data.filter(f).map(roleKey); - _taginfoCache[url] = result; - callback(null, result); - } - }); - }, + var delay = baseRest(function (func, wait, args) { + return baseDelay(func, toNumber(wait) || 0, args); + }); + /** + * Creates a function that invokes `func` with arguments reversed. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to flip arguments for. + * @returns {Function} Returns the new flipped function. + * @example + * + * var flipped = _.flip(function() { + * return _.toArray(arguments); + * }); + * + * flipped('a', 'b', 'c', 'd'); + * // => ['d', 'c', 'b', 'a'] + */ + function flip(func) { + return createWrap(func, WRAP_FLIP_FLAG); + } + /** + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided, it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is used as the map cache key. The `func` + * is invoked with the `this` binding of the memoized function. + * + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the + * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) + * method interface of `clear`, `delete`, `get`, `has`, and `set`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoized function. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * var other = { 'c': 3, 'd': 4 }; + * + * var values = _.memoize(_.values); + * values(object); + * // => [1, 2] + * + * values(other); + * // => [3, 4] + * + * object.a = 2; + * values(object); + * // => [1, 2] + * + * // Modify the result cache. + * values.cache.set(object, ['a', 'b']); + * values(object); + * // => ['a', 'b'] + * + * // Replace `_.memoize.Cache`. + * _.memoize.Cache = WeakMap; + */ - docs: function(params, callback) { - var doRequest = params.debounce ? debouncedRequest$1 : request$1; - params = clean(setSort(params)); - var path = 'key/wiki_pages?'; - if (params.value) { - path = 'tag/wiki_pages?'; - } else if (params.rtype) { - path = 'relation/wiki_pages?'; + function memoize(func, resolver) { + if (typeof func != 'function' || resolver != null && typeof resolver != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); } - var url = apibase$4 + path + utilQsString(params); - doRequest(url, params, true, callback, function(err, d) { - if (err) { - callback(err); - } else { - _taginfoCache[url] = d.data; - callback(null, d.data); - } - }); - }, + var memoized = function memoized() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; + if (cache.has(key)) { + return cache.get(key); + } - apibase: function(_) { - if (!arguments.length) { return apibase$4; } - apibase$4 = _; - return this; - } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result) || cache; + return result; + }; - }; + memoized.cache = new (memoize.Cache || MapCache)(); + return memoized; + } // Expose `MapCache`. - var helpers$1 = createCommonjsModule(function (module, exports) { - Object.defineProperty(exports, "__esModule", { value: true }); - /** - * @module helpers - */ - /** - * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth. - * - * @memberof helpers - * @type {number} - */ - exports.earthRadius = 6371008.8; - /** - * Unit of measurement factors using a spherical (non-ellipsoid) earth radius. - * - * @memberof helpers - * @type {Object} - */ - exports.factors = { - centimeters: exports.earthRadius * 100, - centimetres: exports.earthRadius * 100, - degrees: exports.earthRadius / 111325, - feet: exports.earthRadius * 3.28084, - inches: exports.earthRadius * 39.370, - kilometers: exports.earthRadius / 1000, - kilometres: exports.earthRadius / 1000, - meters: exports.earthRadius, - metres: exports.earthRadius, - miles: exports.earthRadius / 1609.344, - millimeters: exports.earthRadius * 1000, - millimetres: exports.earthRadius * 1000, - nauticalmiles: exports.earthRadius / 1852, - radians: 1, - yards: exports.earthRadius / 1.0936, - }; - /** - * Units of measurement factors based on 1 meter. - * - * @memberof helpers - * @type {Object} - */ - exports.unitsFactors = { - centimeters: 100, - centimetres: 100, - degrees: 1 / 111325, - feet: 3.28084, - inches: 39.370, - kilometers: 1 / 1000, - kilometres: 1 / 1000, - meters: 1, - metres: 1, - miles: 1 / 1609.344, - millimeters: 1000, - millimetres: 1000, - nauticalmiles: 1 / 1852, - radians: 1 / exports.earthRadius, - yards: 1 / 1.0936, - }; - /** - * Area of measurement factors based on 1 square meter. - * - * @memberof helpers - * @type {Object} - */ - exports.areaFactors = { - acres: 0.000247105, - centimeters: 10000, - centimetres: 10000, - feet: 10.763910417, - inches: 1550.003100006, - kilometers: 0.000001, - kilometres: 0.000001, - meters: 1, - metres: 1, - miles: 3.86e-7, - millimeters: 1000000, - millimetres: 1000000, - yards: 1.195990046, - }; - /** - * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}. - * - * @name feature - * @param {Geometry} geometry input geometry - * @param {Object} [properties={}] an Object of key-value pairs to add as properties - * @param {Object} [options={}] Optional Parameters - * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature - * @param {string|number} [options.id] Identifier associated with the Feature - * @returns {Feature} a GeoJSON Feature - * @example - * var geometry = { - * "type": "Point", - * "coordinates": [110, 50] - * }; - * - * var feature = turf.feature(geometry); - * - * //=feature - */ - function feature(geom, properties, options) { - if (options === void 0) { options = {}; } - var feat = { type: "Feature" }; - if (options.id === 0 || options.id) { - feat.id = options.id; - } - if (options.bbox) { - feat.bbox = options.bbox; - } - feat.properties = properties || {}; - feat.geometry = geom; - return feat; - } - exports.feature = feature; - /** - * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates. - * For GeometryCollection type use `helpers.geometryCollection` - * - * @name geometry - * @param {string} type Geometry Type - * @param {Array} coordinates Coordinates - * @param {Object} [options={}] Optional Parameters - * @returns {Geometry} a GeoJSON Geometry - * @example - * var type = "Point"; - * var coordinates = [110, 50]; - * var geometry = turf.geometry(type, coordinates); - * // => geometry - */ - function geometry(type, coordinates, options) { - switch (type) { - case "Point": return point(coordinates).geometry; - case "LineString": return lineString(coordinates).geometry; - case "Polygon": return polygon(coordinates).geometry; - case "MultiPoint": return multiPoint(coordinates).geometry; - case "MultiLineString": return multiLineString(coordinates).geometry; - case "MultiPolygon": return multiPolygon(coordinates).geometry; - default: throw new Error(type + " is invalid"); - } - } - exports.geometry = geometry; - /** - * Creates a {@link Point} {@link Feature} from a Position. - * - * @name point - * @param {Array} coordinates longitude, latitude position (each in decimal degrees) - * @param {Object} [properties={}] an Object of key-value pairs to add as properties - * @param {Object} [options={}] Optional Parameters - * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature - * @param {string|number} [options.id] Identifier associated with the Feature - * @returns {Feature} a Point feature - * @example - * var point = turf.point([-75.343, 39.984]); - * - * //=point - */ - function point(coordinates, properties, options) { - if (options === void 0) { options = {}; } - var geom = { - type: "Point", - coordinates: coordinates, - }; - return feature(geom, properties, options); - } - exports.point = point; - /** - * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates. - * - * @name points - * @param {Array>} coordinates an array of Points - * @param {Object} [properties={}] Translate these properties to each Feature - * @param {Object} [options={}] Optional Parameters - * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] - * associated with the FeatureCollection - * @param {string|number} [options.id] Identifier associated with the FeatureCollection - * @returns {FeatureCollection} Point Feature - * @example - * var points = turf.points([ - * [-75, 39], - * [-80, 45], - * [-78, 50] - * ]); - * - * //=points - */ - function points(coordinates, properties, options) { - if (options === void 0) { options = {}; } - return featureCollection(coordinates.map(function (coords) { - return point(coords, properties); - }), options); - } - exports.points = points; - /** - * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings. - * - * @name polygon - * @param {Array>>} coordinates an array of LinearRings - * @param {Object} [properties={}] an Object of key-value pairs to add as properties - * @param {Object} [options={}] Optional Parameters - * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature - * @param {string|number} [options.id] Identifier associated with the Feature - * @returns {Feature} Polygon Feature - * @example - * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' }); - * - * //=polygon - */ - function polygon(coordinates, properties, options) { - if (options === void 0) { options = {}; } - for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) { - var ring = coordinates_1[_i]; - if (ring.length < 4) { - throw new Error("Each LinearRing of a Polygon must have 4 or more Positions."); - } - for (var j = 0; j < ring[ring.length - 1].length; j++) { - // Check if first point of Polygon contains two numbers - if (ring[ring.length - 1][j] !== ring[0][j]) { - throw new Error("First and last Position are not equivalent."); - } + + memoize.Cache = MapCache; + /** + * Creates a function that negates the result of the predicate `func`. The + * `func` predicate is invoked with the `this` binding and arguments of the + * created function. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} predicate The predicate to negate. + * @returns {Function} Returns the new negated function. + * @example + * + * function isEven(n) { + * return n % 2 == 0; + * } + * + * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); + * // => [1, 3, 5] + */ + + function negate(predicate) { + if (typeof predicate != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); } - } - var geom = { - type: "Polygon", - coordinates: coordinates, - }; - return feature(geom, properties, options); - } - exports.polygon = polygon; - /** - * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates. - * - * @name polygons - * @param {Array>>>} coordinates an array of Polygon coordinates - * @param {Object} [properties={}] an Object of key-value pairs to add as properties - * @param {Object} [options={}] Optional Parameters - * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature - * @param {string|number} [options.id] Identifier associated with the FeatureCollection - * @returns {FeatureCollection} Polygon FeatureCollection - * @example - * var polygons = turf.polygons([ - * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], - * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]], - * ]); - * - * //=polygons - */ - function polygons(coordinates, properties, options) { - if (options === void 0) { options = {}; } - return featureCollection(coordinates.map(function (coords) { - return polygon(coords, properties); - }), options); - } - exports.polygons = polygons; - /** - * Creates a {@link LineString} {@link Feature} from an Array of Positions. - * - * @name lineString - * @param {Array>} coordinates an array of Positions - * @param {Object} [properties={}] an Object of key-value pairs to add as properties - * @param {Object} [options={}] Optional Parameters - * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature - * @param {string|number} [options.id] Identifier associated with the Feature - * @returns {Feature} LineString Feature - * @example - * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'}); - * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'}); - * - * //=linestring1 - * //=linestring2 - */ - function lineString(coordinates, properties, options) { - if (options === void 0) { options = {}; } - if (coordinates.length < 2) { - throw new Error("coordinates must be an array of two or more positions"); - } - var geom = { - type: "LineString", - coordinates: coordinates, - }; - return feature(geom, properties, options); - } - exports.lineString = lineString; - /** - * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates. - * - * @name lineStrings - * @param {Array>>} coordinates an array of LinearRings - * @param {Object} [properties={}] an Object of key-value pairs to add as properties - * @param {Object} [options={}] Optional Parameters - * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] - * associated with the FeatureCollection - * @param {string|number} [options.id] Identifier associated with the FeatureCollection - * @returns {FeatureCollection} LineString FeatureCollection - * @example - * var linestrings = turf.lineStrings([ - * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]], - * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]] - * ]); - * - * //=linestrings - */ - function lineStrings(coordinates, properties, options) { - if (options === void 0) { options = {}; } - return featureCollection(coordinates.map(function (coords) { - return lineString(coords, properties); - }), options); - } - exports.lineStrings = lineStrings; - /** - * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}. - * - * @name featureCollection - * @param {Feature[]} features input features - * @param {Object} [options={}] Optional Parameters - * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature - * @param {string|number} [options.id] Identifier associated with the Feature - * @returns {FeatureCollection} FeatureCollection of Features - * @example - * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'}); - * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'}); - * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'}); - * - * var collection = turf.featureCollection([ - * locationA, - * locationB, - * locationC - * ]); - * - * //=collection - */ - function featureCollection(features, options) { - if (options === void 0) { options = {}; } - var fc = { type: "FeatureCollection" }; - if (options.id) { - fc.id = options.id; - } - if (options.bbox) { - fc.bbox = options.bbox; - } - fc.features = features; - return fc; - } - exports.featureCollection = featureCollection; - /** - * Creates a {@link Feature} based on a - * coordinate array. Properties can be added optionally. - * - * @name multiLineString - * @param {Array>>} coordinates an array of LineStrings - * @param {Object} [properties={}] an Object of key-value pairs to add as properties - * @param {Object} [options={}] Optional Parameters - * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature - * @param {string|number} [options.id] Identifier associated with the Feature - * @returns {Feature} a MultiLineString feature - * @throws {Error} if no coordinates are passed - * @example - * var multiLine = turf.multiLineString([[[0,0],[10,10]]]); - * - * //=multiLine - */ - function multiLineString(coordinates, properties, options) { - if (options === void 0) { options = {}; } - var geom = { - type: "MultiLineString", - coordinates: coordinates, - }; - return feature(geom, properties, options); - } - exports.multiLineString = multiLineString; - /** - * Creates a {@link Feature} based on a - * coordinate array. Properties can be added optionally. - * - * @name multiPoint - * @param {Array>} coordinates an array of Positions - * @param {Object} [properties={}] an Object of key-value pairs to add as properties - * @param {Object} [options={}] Optional Parameters - * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature - * @param {string|number} [options.id] Identifier associated with the Feature - * @returns {Feature} a MultiPoint feature - * @throws {Error} if no coordinates are passed - * @example - * var multiPt = turf.multiPoint([[0,0],[10,10]]); - * - * //=multiPt - */ - function multiPoint(coordinates, properties, options) { - if (options === void 0) { options = {}; } - var geom = { - type: "MultiPoint", - coordinates: coordinates, - }; - return feature(geom, properties, options); - } - exports.multiPoint = multiPoint; - /** - * Creates a {@link Feature} based on a - * coordinate array. Properties can be added optionally. - * - * @name multiPolygon - * @param {Array>>>} coordinates an array of Polygons - * @param {Object} [properties={}] an Object of key-value pairs to add as properties - * @param {Object} [options={}] Optional Parameters - * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature - * @param {string|number} [options.id] Identifier associated with the Feature - * @returns {Feature} a multipolygon feature - * @throws {Error} if no coordinates are passed - * @example - * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]); - * - * //=multiPoly - * - */ - function multiPolygon(coordinates, properties, options) { - if (options === void 0) { options = {}; } - var geom = { - type: "MultiPolygon", - coordinates: coordinates, - }; - return feature(geom, properties, options); - } - exports.multiPolygon = multiPolygon; - /** - * Creates a {@link Feature} based on a - * coordinate array. Properties can be added optionally. - * - * @name geometryCollection - * @param {Array} geometries an array of GeoJSON Geometries - * @param {Object} [properties={}] an Object of key-value pairs to add as properties - * @param {Object} [options={}] Optional Parameters - * @param {Array} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature - * @param {string|number} [options.id] Identifier associated with the Feature - * @returns {Feature} a GeoJSON GeometryCollection Feature - * @example - * var pt = turf.geometry("Point", [100, 0]); - * var line = turf.geometry("LineString", [[101, 0], [102, 1]]); - * var collection = turf.geometryCollection([pt, line]); - * - * // => collection - */ - function geometryCollection(geometries, properties, options) { - if (options === void 0) { options = {}; } - var geom = { - type: "GeometryCollection", - geometries: geometries, - }; - return feature(geom, properties, options); - } - exports.geometryCollection = geometryCollection; - /** - * Round number to precision - * - * @param {number} num Number - * @param {number} [precision=0] Precision - * @returns {number} rounded number - * @example - * turf.round(120.4321) - * //=120 - * - * turf.round(120.4321, 2) - * //=120.43 - */ - function round(num, precision) { - if (precision === void 0) { precision = 0; } - if (precision && !(precision >= 0)) { - throw new Error("precision must be a positive number"); - } - var multiplier = Math.pow(10, precision || 0); - return Math.round(num * multiplier) / multiplier; - } - exports.round = round; - /** - * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit. - * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet - * - * @name radiansToLength - * @param {number} radians in radians across the sphere - * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres, - * meters, kilometres, kilometers. - * @returns {number} distance - */ - function radiansToLength(radians, units) { - if (units === void 0) { units = "kilometers"; } - var factor = exports.factors[units]; - if (!factor) { - throw new Error(units + " units is invalid"); - } - return radians * factor; - } - exports.radiansToLength = radiansToLength; - /** - * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians - * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet - * - * @name lengthToRadians - * @param {number} distance in real units - * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres, - * meters, kilometres, kilometers. - * @returns {number} radians - */ - function lengthToRadians(distance, units) { - if (units === void 0) { units = "kilometers"; } - var factor = exports.factors[units]; - if (!factor) { - throw new Error(units + " units is invalid"); - } - return distance / factor; - } - exports.lengthToRadians = lengthToRadians; - /** - * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees - * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet - * - * @name lengthToDegrees - * @param {number} distance in real units - * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres, - * meters, kilometres, kilometers. - * @returns {number} degrees - */ - function lengthToDegrees(distance, units) { - return radiansToDegrees(lengthToRadians(distance, units)); - } - exports.lengthToDegrees = lengthToDegrees; - /** - * Converts any bearing angle from the north line direction (positive clockwise) - * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line - * - * @name bearingToAzimuth - * @param {number} bearing angle, between -180 and +180 degrees - * @returns {number} angle between 0 and 360 degrees - */ - function bearingToAzimuth(bearing) { - var angle = bearing % 360; - if (angle < 0) { - angle += 360; - } - return angle; - } - exports.bearingToAzimuth = bearingToAzimuth; - /** - * Converts an angle in radians to degrees - * - * @name radiansToDegrees - * @param {number} radians angle in radians - * @returns {number} degrees between 0 and 360 degrees - */ - function radiansToDegrees(radians) { - var degrees = radians % (2 * Math.PI); - return degrees * 180 / Math.PI; - } - exports.radiansToDegrees = radiansToDegrees; - /** - * Converts an angle in degrees to radians - * - * @name degreesToRadians - * @param {number} degrees angle between 0 and 360 degrees - * @returns {number} angle in radians - */ - function degreesToRadians(degrees) { - var radians = degrees % 360; - return radians * Math.PI / 180; - } - exports.degreesToRadians = degreesToRadians; - /** - * Converts a length to the requested unit. - * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet - * - * @param {number} length to be converted - * @param {Units} [originalUnit="kilometers"] of the length - * @param {Units} [finalUnit="kilometers"] returned unit - * @returns {number} the converted length - */ - function convertLength(length, originalUnit, finalUnit) { - if (originalUnit === void 0) { originalUnit = "kilometers"; } - if (finalUnit === void 0) { finalUnit = "kilometers"; } - if (!(length >= 0)) { - throw new Error("length must be a positive number"); - } - return radiansToLength(lengthToRadians(length, originalUnit), finalUnit); - } - exports.convertLength = convertLength; - /** - * Converts a area to the requested unit. - * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches - * @param {number} area to be converted - * @param {Units} [originalUnit="meters"] of the distance - * @param {Units} [finalUnit="kilometers"] returned unit - * @returns {number} the converted distance - */ - function convertArea(area, originalUnit, finalUnit) { - if (originalUnit === void 0) { originalUnit = "meters"; } - if (finalUnit === void 0) { finalUnit = "kilometers"; } - if (!(area >= 0)) { - throw new Error("area must be a positive number"); - } - var startFactor = exports.areaFactors[originalUnit]; - if (!startFactor) { - throw new Error("invalid original units"); - } - var finalFactor = exports.areaFactors[finalUnit]; - if (!finalFactor) { - throw new Error("invalid final units"); - } - return (area / startFactor) * finalFactor; - } - exports.convertArea = convertArea; - /** - * isNumber - * - * @param {*} num Number to validate - * @returns {boolean} true/false - * @example - * turf.isNumber(123) - * //=true - * turf.isNumber('foo') - * //=false - */ - function isNumber(num) { - return !isNaN(num) && num !== null && !Array.isArray(num) && !/^\s*$/.test(num); - } - exports.isNumber = isNumber; - /** - * isObject - * - * @param {*} input variable to validate - * @returns {boolean} true/false - * @example - * turf.isObject({elevation: 10}) - * //=true - * turf.isObject('foo') - * //=false - */ - function isObject(input) { - return (!!input) && (input.constructor === Object); - } - exports.isObject = isObject; - /** - * Validate BBox - * - * @private - * @param {Array} bbox BBox to validate - * @returns {void} - * @throws Error if BBox is not valid - * @example - * validateBBox([-180, -40, 110, 50]) - * //=OK - * validateBBox([-180, -40]) - * //=Error - * validateBBox('Foo') - * //=Error - * validateBBox(5) - * //=Error - * validateBBox(null) - * //=Error - * validateBBox(undefined) - * //=Error - */ - function validateBBox(bbox) { - if (!bbox) { - throw new Error("bbox is required"); - } - if (!Array.isArray(bbox)) { - throw new Error("bbox must be an Array"); - } - if (bbox.length !== 4 && bbox.length !== 6) { - throw new Error("bbox must be an Array of 4 or 6 numbers"); - } - bbox.forEach(function (num) { - if (!isNumber(num)) { - throw new Error("bbox must only contain numbers"); + + return function () { + var args = arguments; + + switch (args.length) { + case 0: + return !predicate.call(this); + + case 1: + return !predicate.call(this, args[0]); + + case 2: + return !predicate.call(this, args[0], args[1]); + + case 3: + return !predicate.call(this, args[0], args[1], args[2]); + } + + return !predicate.apply(this, args); + }; + } + /** + * Creates a function that is restricted to invoking `func` once. Repeat calls + * to the function return the value of the first invocation. The `func` is + * invoked with the `this` binding and arguments of the created function. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var initialize = _.once(createApplication); + * initialize(); + * initialize(); + * // => `createApplication` is invoked once + */ + + + function once(func) { + return before(2, func); + } + /** + * Creates a function that invokes `func` with its arguments transformed. + * + * @static + * @since 4.0.0 + * @memberOf _ + * @category Function + * @param {Function} func The function to wrap. + * @param {...(Function|Function[])} [transforms=[_.identity]] + * The argument transforms. + * @returns {Function} Returns the new function. + * @example + * + * function doubled(n) { + * return n * 2; + * } + * + * function square(n) { + * return n * n; + * } + * + * var func = _.overArgs(function(x, y) { + * return [x, y]; + * }, [square, doubled]); + * + * func(9, 3); + * // => [81, 6] + * + * func(10, 5); + * // => [100, 10] + */ + + + var overArgs = castRest(function (func, transforms) { + transforms = transforms.length == 1 && isArray(transforms[0]) ? arrayMap(transforms[0], baseUnary(getIteratee())) : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee())); + var funcsLength = transforms.length; + return baseRest(function (args) { + var index = -1, + length = nativeMin(args.length, funcsLength); + + while (++index < length) { + args[index] = transforms[index].call(this, args[index]); + } + + return apply(func, this, args); + }); + }); + /** + * Creates a function that invokes `func` with `partials` prepended to the + * arguments it receives. This method is like `_.bind` except it does **not** + * alter the `this` binding. + * + * The `_.partial.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * **Note:** This method doesn't set the "length" property of partially + * applied functions. + * + * @static + * @memberOf _ + * @since 0.2.0 + * @category Function + * @param {Function} func The function to partially apply arguments to. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new partially applied function. + * @example + * + * function greet(greeting, name) { + * return greeting + ' ' + name; + * } + * + * var sayHelloTo = _.partial(greet, 'hello'); + * sayHelloTo('fred'); + * // => 'hello fred' + * + * // Partially applied with placeholders. + * var greetFred = _.partial(greet, _, 'fred'); + * greetFred('hi'); + * // => 'hi fred' + */ + + var partial = baseRest(function (func, partials) { + var holders = replaceHolders(partials, getHolder(partial)); + return createWrap(func, WRAP_PARTIAL_FLAG, undefined$1, partials, holders); + }); + /** + * This method is like `_.partial` except that partially applied arguments + * are appended to the arguments it receives. + * + * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * **Note:** This method doesn't set the "length" property of partially + * applied functions. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Function + * @param {Function} func The function to partially apply arguments to. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new partially applied function. + * @example + * + * function greet(greeting, name) { + * return greeting + ' ' + name; + * } + * + * var greetFred = _.partialRight(greet, 'fred'); + * greetFred('hi'); + * // => 'hi fred' + * + * // Partially applied with placeholders. + * var sayHelloTo = _.partialRight(greet, 'hello', _); + * sayHelloTo('fred'); + * // => 'hello fred' + */ + + var partialRight = baseRest(function (func, partials) { + var holders = replaceHolders(partials, getHolder(partialRight)); + return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined$1, partials, holders); + }); + /** + * Creates a function that invokes `func` with arguments arranged according + * to the specified `indexes` where the argument value at the first index is + * provided as the first argument, the argument value at the second index is + * provided as the second argument, and so on. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to rearrange arguments for. + * @param {...(number|number[])} indexes The arranged argument indexes. + * @returns {Function} Returns the new function. + * @example + * + * var rearged = _.rearg(function(a, b, c) { + * return [a, b, c]; + * }, [2, 0, 1]); + * + * rearged('b', 'c', 'a') + * // => ['a', 'b', 'c'] + */ + + var rearg = flatRest(function (func, indexes) { + return createWrap(func, WRAP_REARG_FLAG, undefined$1, undefined$1, undefined$1, indexes); + }); + /** + * Creates a function that invokes `func` with the `this` binding of the + * created function and arguments from `start` and beyond provided as + * an array. + * + * **Note:** This method is based on the + * [rest parameter](https://mdn.io/rest_parameters). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.rest(function(what, names) { + * return what + ' ' + _.initial(names).join(', ') + + * (_.size(names) > 1 ? ', & ' : '') + _.last(names); + * }); + * + * say('hello', 'fred', 'barney', 'pebbles'); + * // => 'hello fred, barney, & pebbles' + */ + + function rest(func, start) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); } - }); - } - exports.validateBBox = validateBBox; - /** - * Validate Id - * - * @private - * @param {string|number} id Id to validate - * @returns {void} - * @throws Error if Id is not valid - * @example - * validateId([-180, -40, 110, 50]) - * //=Error - * validateId([-180, -40]) - * //=Error - * validateId('Foo') - * //=OK - * validateId(5) - * //=OK - * validateId(null) - * //=Error - * validateId(undefined) - * //=Error - */ - function validateId(id) { - if (!id) { - throw new Error("id is required"); - } - if (["string", "number"].indexOf(typeof id) === -1) { - throw new Error("id must be a number or a string"); - } - } - exports.validateId = validateId; - // Deprecated methods - function radians2degrees() { - throw new Error("method has been renamed to `radiansToDegrees`"); - } - exports.radians2degrees = radians2degrees; - function degrees2radians() { - throw new Error("method has been renamed to `degreesToRadians`"); - } - exports.degrees2radians = degrees2radians; - function distanceToDegrees() { - throw new Error("method has been renamed to `lengthToDegrees`"); - } - exports.distanceToDegrees = distanceToDegrees; - function distanceToRadians() { - throw new Error("method has been renamed to `lengthToRadians`"); - } - exports.distanceToRadians = distanceToRadians; - function radiansToDistance() { - throw new Error("method has been renamed to `radiansToLength`"); - } - exports.radiansToDistance = radiansToDistance; - function bearingToAngle() { - throw new Error("method has been renamed to `bearingToAzimuth`"); - } - exports.bearingToAngle = bearingToAngle; - function convertDistance() { - throw new Error("method has been renamed to `convertLength`"); - } - exports.convertDistance = convertDistance; - }); - var invariant = createCommonjsModule(function (module, exports) { - Object.defineProperty(exports, "__esModule", { value: true }); + start = start === undefined$1 ? start : toInteger(start); + return baseRest(func, start); + } + /** + * Creates a function that invokes `func` with the `this` binding of the + * create function and an array of arguments much like + * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply). + * + * **Note:** This method is based on the + * [spread operator](https://mdn.io/spread_operator). + * + * @static + * @memberOf _ + * @since 3.2.0 + * @category Function + * @param {Function} func The function to spread arguments over. + * @param {number} [start=0] The start position of the spread. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.spread(function(who, what) { + * return who + ' says ' + what; + * }); + * + * say(['fred', 'hello']); + * // => 'fred says hello' + * + * var numbers = Promise.all([ + * Promise.resolve(40), + * Promise.resolve(36) + * ]); + * + * numbers.then(_.spread(function(x, y) { + * return x + y; + * })); + * // => a Promise of 76 + */ - /** - * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate. - * - * @name getCoord - * @param {Array|Geometry|Feature} coord GeoJSON Point or an Array of numbers - * @returns {Array} coordinates - * @example - * var pt = turf.point([10, 10]); - * - * var coord = turf.getCoord(pt); - * //= [10, 10] - */ - function getCoord(coord) { - if (!coord) { - throw new Error("coord is required"); - } - if (!Array.isArray(coord)) { - if (coord.type === "Feature" && coord.geometry !== null && coord.geometry.type === "Point") { - return coord.geometry.coordinates; + + function spread(func, start) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); } - if (coord.type === "Point") { - return coord.coordinates; + + start = start == null ? 0 : nativeMax(toInteger(start), 0); + return baseRest(function (args) { + var array = args[start], + otherArgs = castSlice(args, 0, start); + + if (array) { + arrayPush(otherArgs, array); + } + + return apply(func, this, otherArgs); + }); + } + /** + * Creates a throttled function that only invokes `func` at most once per + * every `wait` milliseconds. The throttled function comes with a `cancel` + * method to cancel delayed `func` invocations and a `flush` method to + * immediately invoke them. Provide `options` to indicate whether `func` + * should be invoked on the leading and/or trailing edge of the `wait` + * timeout. The `func` is invoked with the last arguments provided to the + * throttled function. Subsequent calls to the throttled function return the + * result of the last `func` invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the throttled function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.throttle` and `_.debounce`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to throttle. + * @param {number} [wait=0] The number of milliseconds to throttle invocations to. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=true] + * Specify invoking on the leading edge of the timeout. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new throttled function. + * @example + * + * // Avoid excessively updating the position while scrolling. + * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); + * + * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes. + * var throttled = _.throttle(renewToken, 300000, { 'trailing': false }); + * jQuery(element).on('click', throttled); + * + * // Cancel the trailing throttled invocation. + * jQuery(window).on('popstate', throttled.cancel); + */ + + + function throttle(func, wait, options) { + var leading = true, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); } - } - if (Array.isArray(coord) && coord.length >= 2 && !Array.isArray(coord[0]) && !Array.isArray(coord[1])) { - return coord; - } - throw new Error("coord must be GeoJSON Point or an Array of numbers"); - } - exports.getCoord = getCoord; - /** - * Unwrap coordinates from a Feature, Geometry Object or an Array - * - * @name getCoords - * @param {Array|Geometry|Feature} coords Feature, Geometry Object or an Array - * @returns {Array} coordinates - * @example - * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]); - * - * var coords = turf.getCoords(poly); - * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]] - */ - function getCoords(coords) { - if (Array.isArray(coords)) { - return coords; - } - // Feature - if (coords.type === "Feature") { - if (coords.geometry !== null) { - return coords.geometry.coordinates; + + if (isObject(options)) { + leading = 'leading' in options ? !!options.leading : leading; + trailing = 'trailing' in options ? !!options.trailing : trailing; } - } - else { - // Geometry - if (coords.coordinates) { - return coords.coordinates; + + return debounce(func, wait, { + 'leading': leading, + 'maxWait': wait, + 'trailing': trailing + }); + } + /** + * Creates a function that accepts up to one argument, ignoring any + * additional arguments. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + * @example + * + * _.map(['6', '8', '10'], _.unary(parseInt)); + * // => [6, 8, 10] + */ + + + function unary(func) { + return ary(func, 1); + } + /** + * Creates a function that provides `value` to `wrapper` as its first + * argument. Any additional arguments provided to the function are appended + * to those provided to the `wrapper`. The wrapper is invoked with the `this` + * binding of the created function. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {*} value The value to wrap. + * @param {Function} [wrapper=identity] The wrapper function. + * @returns {Function} Returns the new function. + * @example + * + * var p = _.wrap(_.escape, function(func, text) { + * return '

    ' + func(text) + '

    '; + * }); + * + * p('fred, barney, & pebbles'); + * // => '

    fred, barney, & pebbles

    ' + */ + + + function wrap(value, wrapper) { + return partial(castFunction(wrapper), value); + } + /*------------------------------------------------------------------------*/ + + /** + * Casts `value` as an array if it's not one. + * + * @static + * @memberOf _ + * @since 4.4.0 + * @category Lang + * @param {*} value The value to inspect. + * @returns {Array} Returns the cast array. + * @example + * + * _.castArray(1); + * // => [1] + * + * _.castArray({ 'a': 1 }); + * // => [{ 'a': 1 }] + * + * _.castArray('abc'); + * // => ['abc'] + * + * _.castArray(null); + * // => [null] + * + * _.castArray(undefined); + * // => [undefined] + * + * _.castArray(); + * // => [] + * + * var array = [1, 2, 3]; + * console.log(_.castArray(array) === array); + * // => true + */ + + + function castArray() { + if (!arguments.length) { + return []; } - } - throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array"); - } - exports.getCoords = getCoords; - /** - * Checks if coordinates contains a number - * - * @name containsNumber - * @param {Array} coordinates GeoJSON Coordinates - * @returns {boolean} true if Array contains a number - */ - function containsNumber(coordinates) { - if (coordinates.length > 1 && helpers$1.isNumber(coordinates[0]) && helpers$1.isNumber(coordinates[1])) { + + var value = arguments[0]; + return isArray(value) ? value : [value]; + } + /** + * Creates a shallow clone of `value`. + * + * **Note:** This method is loosely based on the + * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) + * and supports cloning arrays, array buffers, booleans, date objects, maps, + * numbers, `Object` objects, regexes, sets, strings, symbols, and typed + * arrays. The own enumerable properties of `arguments` objects are cloned + * as plain objects. An empty object is returned for uncloneable values such + * as error objects, functions, DOM nodes, and WeakMaps. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to clone. + * @returns {*} Returns the cloned value. + * @see _.cloneDeep + * @example + * + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var shallow = _.clone(objects); + * console.log(shallow[0] === objects[0]); + * // => true + */ + + + function clone(value) { + return baseClone(value, CLONE_SYMBOLS_FLAG); + } + /** + * This method is like `_.clone` except that it accepts `customizer` which + * is invoked to produce the cloned value. If `customizer` returns `undefined`, + * cloning is handled by the method instead. The `customizer` is invoked with + * up to four arguments; (value [, index|key, object, stack]). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to clone. + * @param {Function} [customizer] The function to customize cloning. + * @returns {*} Returns the cloned value. + * @see _.cloneDeepWith + * @example + * + * function customizer(value) { + * if (_.isElement(value)) { + * return value.cloneNode(false); + * } + * } + * + * var el = _.cloneWith(document.body, customizer); + * + * console.log(el === document.body); + * // => false + * console.log(el.nodeName); + * // => 'BODY' + * console.log(el.childNodes.length); + * // => 0 + */ + + + function cloneWith(value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined$1; + return baseClone(value, CLONE_SYMBOLS_FLAG, customizer); + } + /** + * This method is like `_.clone` except that it recursively clones `value`. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Lang + * @param {*} value The value to recursively clone. + * @returns {*} Returns the deep cloned value. + * @see _.clone + * @example + * + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var deep = _.cloneDeep(objects); + * console.log(deep[0] === objects[0]); + * // => false + */ + + + function cloneDeep(value) { + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG); + } + /** + * This method is like `_.cloneWith` except that it recursively clones `value`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to recursively clone. + * @param {Function} [customizer] The function to customize cloning. + * @returns {*} Returns the deep cloned value. + * @see _.cloneWith + * @example + * + * function customizer(value) { + * if (_.isElement(value)) { + * return value.cloneNode(true); + * } + * } + * + * var el = _.cloneDeepWith(document.body, customizer); + * + * console.log(el === document.body); + * // => false + * console.log(el.nodeName); + * // => 'BODY' + * console.log(el.childNodes.length); + * // => 20 + */ + + + function cloneDeepWith(value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined$1; + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer); + } + /** + * Checks if `object` conforms to `source` by invoking the predicate + * properties of `source` with the corresponding property values of `object`. + * + * **Note:** This method is equivalent to `_.conforms` when `source` is + * partially applied. + * + * @static + * @memberOf _ + * @since 4.14.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property predicates to conform to. + * @returns {boolean} Returns `true` if `object` conforms, else `false`. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * + * _.conformsTo(object, { 'b': function(n) { return n > 1; } }); + * // => true + * + * _.conformsTo(object, { 'b': function(n) { return n > 2; } }); + * // => false + */ + + + function conformsTo(object, source) { + return source == null || baseConformsTo(object, source, keys(source)); + } + /** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ + + + function eq(value, other) { + return value === other || value !== value && other !== other; + } + /** + * Checks if `value` is greater than `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, + * else `false`. + * @see _.lt + * @example + * + * _.gt(3, 1); + * // => true + * + * _.gt(3, 3); + * // => false + * + * _.gt(1, 3); + * // => false + */ + + + var gt = createRelationalOperation(baseGt); + /** + * Checks if `value` is greater than or equal to `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than or equal to + * `other`, else `false`. + * @see _.lte + * @example + * + * _.gte(3, 1); + * // => true + * + * _.gte(3, 3); + * // => true + * + * _.gte(1, 3); + * // => false + */ + + var gte = createRelationalOperation(function (value, other) { + return value >= other; + }); + /** + * Checks if `value` is likely an `arguments` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + * else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ + + var isArguments = baseIsArguments(function () { + return arguments; + }()) ? baseIsArguments : function (value) { + return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee'); + }; + /** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ + + var isArray = Array.isArray; + /** + * Checks if `value` is classified as an `ArrayBuffer` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. + * @example + * + * _.isArrayBuffer(new ArrayBuffer(2)); + * // => true + * + * _.isArrayBuffer(new Array(2)); + * // => false + */ + + var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer; + /** + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @example + * + * _.isArrayLike([1, 2, 3]); + * // => true + * + * _.isArrayLike(document.body.children); + * // => true + * + * _.isArrayLike('abc'); + * // => true + * + * _.isArrayLike(_.noop); + * // => false + */ + + function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); + } + /** + * This method is like `_.isArrayLike` except that it also checks if `value` + * is an object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array-like object, + * else `false`. + * @example + * + * _.isArrayLikeObject([1, 2, 3]); + * // => true + * + * _.isArrayLikeObject(document.body.children); + * // => true + * + * _.isArrayLikeObject('abc'); + * // => false + * + * _.isArrayLikeObject(_.noop); + * // => false + */ + + + function isArrayLikeObject(value) { + return isObjectLike(value) && isArrayLike(value); + } + /** + * Checks if `value` is classified as a boolean primitive or object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a boolean, else `false`. + * @example + * + * _.isBoolean(false); + * // => true + * + * _.isBoolean(null); + * // => false + */ + + + function isBoolean(value) { + return value === true || value === false || isObjectLike(value) && baseGetTag(value) == boolTag; + } + /** + * Checks if `value` is a buffer. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. + * @example + * + * _.isBuffer(new Buffer(2)); + * // => true + * + * _.isBuffer(new Uint8Array(2)); + * // => false + */ + + + var isBuffer = nativeIsBuffer || stubFalse; + /** + * Checks if `value` is classified as a `Date` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a date object, else `false`. + * @example + * + * _.isDate(new Date); + * // => true + * + * _.isDate('Mon April 23 2012'); + * // => false + */ + + var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate; + /** + * Checks if `value` is likely a DOM element. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`. + * @example + * + * _.isElement(document.body); + * // => true + * + * _.isElement(''); + * // => false + */ + + function isElement(value) { + return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value); + } + /** + * Checks if `value` is an empty object, collection, map, or set. + * + * Objects are considered empty if they have no own enumerable string keyed + * properties. + * + * Array-like values such as `arguments` objects, arrays, buffers, strings, or + * jQuery-like collections are considered empty if they have a `length` of `0`. + * Similarly, maps and sets are considered empty if they have a `size` of `0`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is empty, else `false`. + * @example + * + * _.isEmpty(null); + * // => true + * + * _.isEmpty(true); + * // => true + * + * _.isEmpty(1); + * // => true + * + * _.isEmpty([1, 2, 3]); + * // => false + * + * _.isEmpty({ 'a': 1 }); + * // => false + */ + + + function isEmpty(value) { + if (value == null) { + return true; + } + + if (isArrayLike(value) && (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' || isBuffer(value) || isTypedArray(value) || isArguments(value))) { + return !value.length; + } + + var tag = getTag(value); + + if (tag == mapTag || tag == setTag) { + return !value.size; + } + + if (isPrototype(value)) { + return !baseKeys(value).length; + } + + for (var key in value) { + if (hasOwnProperty.call(value, key)) { + return false; + } + } + return true; - } - if (Array.isArray(coordinates[0]) && coordinates[0].length) { - return containsNumber(coordinates[0]); - } - throw new Error("coordinates must only contain numbers"); - } - exports.containsNumber = containsNumber; - /** - * Enforce expectations about types of GeoJSON objects for Turf. - * - * @name geojsonType - * @param {GeoJSON} value any GeoJSON object - * @param {string} type expected GeoJSON type - * @param {string} name name of calling function - * @throws {Error} if value is not the expected type. - */ - function geojsonType(value, type, name) { - if (!type || !name) { - throw new Error("type and name required"); - } - if (!value || value.type !== type) { - throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + value.type); - } - } - exports.geojsonType = geojsonType; - /** - * Enforce expectations about types of {@link Feature} inputs for Turf. - * Internally this uses {@link geojsonType} to judge geometry types. - * - * @name featureOf - * @param {Feature} feature a feature with an expected geometry type - * @param {string} type expected GeoJSON type - * @param {string} name name of calling function - * @throws {Error} error if value is not the expected type. - */ - function featureOf(feature, type, name) { - if (!feature) { - throw new Error("No feature passed"); - } - if (!name) { - throw new Error(".featureOf() requires a name"); - } - if (!feature || feature.type !== "Feature" || !feature.geometry) { - throw new Error("Invalid input to " + name + ", Feature with geometry required"); - } - if (!feature.geometry || feature.geometry.type !== type) { - throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type); - } - } - exports.featureOf = featureOf; - /** - * Enforce expectations about types of {@link FeatureCollection} inputs for Turf. - * Internally this uses {@link geojsonType} to judge geometry types. - * - * @name collectionOf - * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged - * @param {string} type expected GeoJSON type - * @param {string} name name of calling function - * @throws {Error} if value is not the expected type. - */ - function collectionOf(featureCollection, type, name) { - if (!featureCollection) { - throw new Error("No featureCollection passed"); - } - if (!name) { - throw new Error(".collectionOf() requires a name"); - } - if (!featureCollection || featureCollection.type !== "FeatureCollection") { - throw new Error("Invalid input to " + name + ", FeatureCollection required"); - } - for (var _i = 0, _a = featureCollection.features; _i < _a.length; _i++) { - var feature = _a[_i]; - if (!feature || feature.type !== "Feature" || !feature.geometry) { - throw new Error("Invalid input to " + name + ", Feature with geometry required"); + } + /** + * Performs a deep comparison between two values to determine if they are + * equivalent. + * + * **Note:** This method supports comparing arrays, array buffers, booleans, + * date objects, error objects, maps, numbers, `Object` objects, regexes, + * sets, strings, symbols, and typed arrays. `Object` objects are compared + * by their own, not inherited, enumerable properties. Functions and DOM + * nodes are compared by strict equality, i.e. `===`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.isEqual(object, other); + * // => true + * + * object === other; + * // => false + */ + + + function isEqual(value, other) { + return baseIsEqual(value, other); + } + /** + * This method is like `_.isEqual` except that it accepts `customizer` which + * is invoked to compare values. If `customizer` returns `undefined`, comparisons + * are handled by the method instead. The `customizer` is invoked with up to + * six arguments: (objValue, othValue [, index|key, object, other, stack]). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * function isGreeting(value) { + * return /^h(?:i|ello)$/.test(value); + * } + * + * function customizer(objValue, othValue) { + * if (isGreeting(objValue) && isGreeting(othValue)) { + * return true; + * } + * } + * + * var array = ['hello', 'goodbye']; + * var other = ['hi', 'goodbye']; + * + * _.isEqualWith(array, other, customizer); + * // => true + */ + + + function isEqualWith(value, other, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined$1; + var result = customizer ? customizer(value, other) : undefined$1; + return result === undefined$1 ? baseIsEqual(value, other, undefined$1, customizer) : !!result; + } + /** + * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`, + * `SyntaxError`, `TypeError`, or `URIError` object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an error object, else `false`. + * @example + * + * _.isError(new Error); + * // => true + * + * _.isError(Error); + * // => false + */ + + + function isError(value) { + if (!isObjectLike(value)) { + return false; + } + + var tag = baseGetTag(value); + return tag == errorTag || tag == domExcTag || typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value); + } + /** + * Checks if `value` is a finite primitive number. + * + * **Note:** This method is based on + * [`Number.isFinite`](https://mdn.io/Number/isFinite). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a finite number, else `false`. + * @example + * + * _.isFinite(3); + * // => true + * + * _.isFinite(Number.MIN_VALUE); + * // => true + * + * _.isFinite(Infinity); + * // => false + * + * _.isFinite('3'); + * // => false + */ + + + function isFinite(value) { + return typeof value == 'number' && nativeIsFinite(value); + } + /** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ + + + function isFunction(value) { + if (!isObject(value)) { + return false; + } // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 9 which returns 'object' for typed arrays and other constructors. + + + var tag = baseGetTag(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; + } + /** + * Checks if `value` is an integer. + * + * **Note:** This method is based on + * [`Number.isInteger`](https://mdn.io/Number/isInteger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an integer, else `false`. + * @example + * + * _.isInteger(3); + * // => true + * + * _.isInteger(Number.MIN_VALUE); + * // => false + * + * _.isInteger(Infinity); + * // => false + * + * _.isInteger('3'); + * // => false + */ + + + function isInteger(value) { + return typeof value == 'number' && value == toInteger(value); + } + /** + * Checks if `value` is a valid array-like length. + * + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ + + + function isLength(value) { + return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; + } + /** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ + + + function isObject(value) { + var type = _typeof(value); + + return value != null && (type == 'object' || type == 'function'); + } + /** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ + + + function isObjectLike(value) { + return value != null && _typeof(value) == 'object'; + } + /** + * Checks if `value` is classified as a `Map` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a map, else `false`. + * @example + * + * _.isMap(new Map); + * // => true + * + * _.isMap(new WeakMap); + * // => false + */ + + + var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; + /** + * Performs a partial deep comparison between `object` and `source` to + * determine if `object` contains equivalent property values. + * + * **Note:** This method is equivalent to `_.matches` when `source` is + * partially applied. + * + * Partial comparisons will match empty array and empty object `source` + * values against any array or object value, respectively. See `_.isEqual` + * for a list of supported value comparisons. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * + * _.isMatch(object, { 'b': 2 }); + * // => true + * + * _.isMatch(object, { 'b': 1 }); + * // => false + */ + + function isMatch(object, source) { + return object === source || baseIsMatch(object, source, getMatchData(source)); + } + /** + * This method is like `_.isMatch` except that it accepts `customizer` which + * is invoked to compare values. If `customizer` returns `undefined`, comparisons + * are handled by the method instead. The `customizer` is invoked with five + * arguments: (objValue, srcValue, index|key, object, source). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + * @example + * + * function isGreeting(value) { + * return /^h(?:i|ello)$/.test(value); + * } + * + * function customizer(objValue, srcValue) { + * if (isGreeting(objValue) && isGreeting(srcValue)) { + * return true; + * } + * } + * + * var object = { 'greeting': 'hello' }; + * var source = { 'greeting': 'hi' }; + * + * _.isMatchWith(object, source, customizer); + * // => true + */ + + + function isMatchWith(object, source, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined$1; + return baseIsMatch(object, source, getMatchData(source), customizer); + } + /** + * Checks if `value` is `NaN`. + * + * **Note:** This method is based on + * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as + * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for + * `undefined` and other non-number values. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + * @example + * + * _.isNaN(NaN); + * // => true + * + * _.isNaN(new Number(NaN)); + * // => true + * + * isNaN(undefined); + * // => true + * + * _.isNaN(undefined); + * // => false + */ + + + function isNaN(value) { + // An `NaN` primitive is the only value that is not equal to itself. + // Perform the `toStringTag` check first to avoid errors with some + // ActiveX objects in IE. + return isNumber(value) && value != +value; + } + /** + * Checks if `value` is a pristine native function. + * + * **Note:** This method can't reliably detect native functions in the presence + * of the core-js package because core-js circumvents this kind of detection. + * Despite multiple requests, the core-js maintainer has made it clear: any + * attempt to fix the detection will be obstructed. As a result, we're left + * with little choice but to throw an error. Unfortunately, this also affects + * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill), + * which rely on core-js. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + * @example + * + * _.isNative(Array.prototype.push); + * // => true + * + * _.isNative(_); + * // => false + */ + + + function isNative(value) { + if (isMaskable(value)) { + throw new Error(CORE_ERROR_TEXT); } - if (!feature.geometry || feature.geometry.type !== type) { - throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type); + + return baseIsNative(value); + } + /** + * Checks if `value` is `null`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `null`, else `false`. + * @example + * + * _.isNull(null); + * // => true + * + * _.isNull(void 0); + * // => false + */ + + + function isNull(value) { + return value === null; + } + /** + * Checks if `value` is `null` or `undefined`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is nullish, else `false`. + * @example + * + * _.isNil(null); + * // => true + * + * _.isNil(void 0); + * // => true + * + * _.isNil(NaN); + * // => false + */ + + + function isNil(value) { + return value == null; + } + /** + * Checks if `value` is classified as a `Number` primitive or object. + * + * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are + * classified as numbers, use the `_.isFinite` method. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a number, else `false`. + * @example + * + * _.isNumber(3); + * // => true + * + * _.isNumber(Number.MIN_VALUE); + * // => true + * + * _.isNumber(Infinity); + * // => true + * + * _.isNumber('3'); + * // => false + */ + + + function isNumber(value) { + return typeof value == 'number' || isObjectLike(value) && baseGetTag(value) == numberTag; + } + /** + * Checks if `value` is a plain object, that is, an object created by the + * `Object` constructor or one with a `[[Prototype]]` of `null`. + * + * @static + * @memberOf _ + * @since 0.8.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * _.isPlainObject(new Foo); + * // => false + * + * _.isPlainObject([1, 2, 3]); + * // => false + * + * _.isPlainObject({ 'x': 0, 'y': 0 }); + * // => true + * + * _.isPlainObject(Object.create(null)); + * // => true + */ + + + function isPlainObject(value) { + if (!isObjectLike(value) || baseGetTag(value) != objectTag) { + return false; } - } - } - exports.collectionOf = collectionOf; - /** - * Get Geometry from Feature or Geometry Object - * - * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object - * @returns {Geometry|null} GeoJSON Geometry Object - * @throws {Error} if geojson is not a Feature or Geometry Object - * @example - * var point = { - * "type": "Feature", - * "properties": {}, - * "geometry": { - * "type": "Point", - * "coordinates": [110, 40] - * } - * } - * var geom = turf.getGeom(point) - * //={"type": "Point", "coordinates": [110, 40]} - */ - function getGeom(geojson) { - if (geojson.type === "Feature") { - return geojson.geometry; - } - return geojson; - } - exports.getGeom = getGeom; - /** - * Get GeoJSON object's type, Geometry type is prioritize. - * - * @param {GeoJSON} geojson GeoJSON object - * @param {string} [name="geojson"] name of the variable to display in error message - * @returns {string} GeoJSON type - * @example - * var point = { - * "type": "Feature", - * "properties": {}, - * "geometry": { - * "type": "Point", - * "coordinates": [110, 40] - * } - * } - * var geom = turf.getType(point) - * //="Point" - */ - function getType(geojson, name) { - if (geojson.type === "FeatureCollection") { - return "FeatureCollection"; - } - if (geojson.type === "GeometryCollection") { - return "GeometryCollection"; - } - if (geojson.type === "Feature" && geojson.geometry !== null) { - return geojson.geometry.type; - } - return geojson.type; - } - exports.getType = getType; - }); - var lineclip_1 = lineclip; - var _default = lineclip; + var proto = getPrototype(value); + + if (proto === null) { + return true; + } + + var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; + return typeof Ctor == 'function' && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString; + } + /** + * Checks if `value` is classified as a `RegExp` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. + * @example + * + * _.isRegExp(/abc/); + * // => true + * + * _.isRegExp('/abc/'); + * // => false + */ + - lineclip.polyline = lineclip; - lineclip.polygon = polygonclip; + var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp; + /** + * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754 + * double precision number which isn't the result of a rounded unsafe integer. + * + * **Note:** This method is based on + * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`. + * @example + * + * _.isSafeInteger(3); + * // => true + * + * _.isSafeInteger(Number.MIN_VALUE); + * // => false + * + * _.isSafeInteger(Infinity); + * // => false + * + * _.isSafeInteger('3'); + * // => false + */ + function isSafeInteger(value) { + return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER; + } + /** + * Checks if `value` is classified as a `Set` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a set, else `false`. + * @example + * + * _.isSet(new Set); + * // => true + * + * _.isSet(new WeakSet); + * // => false + */ - // Cohen-Sutherland line clippign algorithm, adapted to efficiently - // handle polylines rather than just segments - function lineclip(points, bbox, result) { + var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; + /** + * Checks if `value` is classified as a `String` primitive or object. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a string, else `false`. + * @example + * + * _.isString('abc'); + * // => true + * + * _.isString(1); + * // => false + */ - var len = points.length, - codeA = bitCode(points[0], bbox), - part = [], - i, a, b, codeB, lastCode; + function isString(value) { + return typeof value == 'string' || !isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag; + } + /** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ - if (!result) { result = []; } - for (i = 1; i < len; i++) { - a = points[i - 1]; - b = points[i]; - codeB = lastCode = bitCode(b, bbox); + function isSymbol(value) { + return _typeof(value) == 'symbol' || isObjectLike(value) && baseGetTag(value) == symbolTag; + } + /** + * Checks if `value` is classified as a typed array. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + * @example + * + * _.isTypedArray(new Uint8Array); + * // => true + * + * _.isTypedArray([]); + * // => false + */ - while (true) { - if (!(codeA | codeB)) { // accept - part.push(a); + var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; + /** + * Checks if `value` is `undefined`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. + * @example + * + * _.isUndefined(void 0); + * // => true + * + * _.isUndefined(null); + * // => false + */ - if (codeB !== lastCode) { // segment went outside - part.push(b); + function isUndefined(value) { + return value === undefined$1; + } + /** + * Checks if `value` is classified as a `WeakMap` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a weak map, else `false`. + * @example + * + * _.isWeakMap(new WeakMap); + * // => true + * + * _.isWeakMap(new Map); + * // => false + */ - if (i < len - 1) { // start a new line - result.push(part); - part = []; - } - } else if (i === len - 1) { - part.push(b); - } - break; - } else if (codeA & codeB) { // trivial reject - break; + function isWeakMap(value) { + return isObjectLike(value) && getTag(value) == weakMapTag; + } + /** + * Checks if `value` is classified as a `WeakSet` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a weak set, else `false`. + * @example + * + * _.isWeakSet(new WeakSet); + * // => true + * + * _.isWeakSet(new Set); + * // => false + */ - } else if (codeA) { // a outside, intersect with clip edge - a = intersect(a, b, codeA, bbox); - codeA = bitCode(a, bbox); - } else { // b outside - b = intersect(a, b, codeB, bbox); - codeB = bitCode(b, bbox); - } + function isWeakSet(value) { + return isObjectLike(value) && baseGetTag(value) == weakSetTag; + } + /** + * Checks if `value` is less than `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than `other`, + * else `false`. + * @see _.gt + * @example + * + * _.lt(1, 3); + * // => true + * + * _.lt(3, 3); + * // => false + * + * _.lt(3, 1); + * // => false + */ + + + var lt = createRelationalOperation(baseLt); + /** + * Checks if `value` is less than or equal to `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than or equal to + * `other`, else `false`. + * @see _.gte + * @example + * + * _.lte(1, 3); + * // => true + * + * _.lte(3, 3); + * // => true + * + * _.lte(3, 1); + * // => false + */ + + var lte = createRelationalOperation(function (value, other) { + return value <= other; + }); + /** + * Converts `value` to an array. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to convert. + * @returns {Array} Returns the converted array. + * @example + * + * _.toArray({ 'a': 1, 'b': 2 }); + * // => [1, 2] + * + * _.toArray('abc'); + * // => ['a', 'b', 'c'] + * + * _.toArray(1); + * // => [] + * + * _.toArray(null); + * // => [] + */ + + function toArray(value) { + if (!value) { + return []; } - codeA = lastCode; - } + if (isArrayLike(value)) { + return isString(value) ? stringToArray(value) : copyArray(value); + } + + if (symIterator && value[symIterator]) { + return iteratorToArray(value[symIterator]()); + } + + var tag = getTag(value), + func = tag == mapTag ? mapToArray : tag == setTag ? setToArray : values; + return func(value); + } + /** + * Converts `value` to a finite number. + * + * @static + * @memberOf _ + * @since 4.12.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted number. + * @example + * + * _.toFinite(3.2); + * // => 3.2 + * + * _.toFinite(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toFinite(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toFinite('3.2'); + * // => 3.2 + */ - if (part.length) { result.push(part); } - return result; - } + function toFinite(value) { + if (!value) { + return value === 0 ? value : 0; + } - // Sutherland-Hodgeman polygon clipping algorithm + value = toNumber(value); - function polygonclip(points, bbox) { + if (value === INFINITY || value === -INFINITY) { + var sign = value < 0 ? -1 : 1; + return sign * MAX_INTEGER; + } + + return value === value ? value : 0; + } + /** + * Converts `value` to an integer. + * + * **Note:** This method is loosely based on + * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toInteger(3.2); + * // => 3 + * + * _.toInteger(Number.MIN_VALUE); + * // => 0 + * + * _.toInteger(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toInteger('3.2'); + * // => 3 + */ - var result, edge, prev, prevInside, i, p, inside; - // clip against each side of the clip rectangle - for (edge = 1; edge <= 8; edge *= 2) { - result = []; - prev = points[points.length - 1]; - prevInside = !(bitCode(prev, bbox) & edge); + function toInteger(value) { + var result = toFinite(value), + remainder = result % 1; + return result === result ? remainder ? result - remainder : result : 0; + } + /** + * Converts `value` to an integer suitable for use as the length of an + * array-like object. + * + * **Note:** This method is based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toLength(3.2); + * // => 3 + * + * _.toLength(Number.MIN_VALUE); + * // => 0 + * + * _.toLength(Infinity); + * // => 4294967295 + * + * _.toLength('3.2'); + * // => 3 + */ - for (i = 0; i < points.length; i++) { - p = points[i]; - inside = !(bitCode(p, bbox) & edge); - // if segment goes through the clip window, add an intersection - if (inside !== prevInside) { result.push(intersect(prev, p, edge, bbox)); } + function toLength(value) { + return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0; + } + /** + * Converts `value` to a number. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {number} Returns the number. + * @example + * + * _.toNumber(3.2); + * // => 3.2 + * + * _.toNumber(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toNumber(Infinity); + * // => Infinity + * + * _.toNumber('3.2'); + * // => 3.2 + */ - if (inside) { result.push(p); } // add a point if it's inside - prev = p; - prevInside = inside; + function toNumber(value) { + if (typeof value == 'number') { + return value; } - points = result; + if (isSymbol(value)) { + return NAN; + } - if (!points.length) { break; } - } + if (isObject(value)) { + var other = typeof value.valueOf == 'function' ? value.valueOf() : value; + value = isObject(other) ? other + '' : other; + } - return result; - } + if (typeof value != 'string') { + return value === 0 ? value : +value; + } - // intersect a segment against one of the 4 lines that make up the bbox + value = baseTrim(value); + var isBinary = reIsBinary.test(value); + return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value; + } + /** + * Converts `value` to a plain object flattening inherited enumerable string + * keyed properties of `value` to own properties of the plain object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {Object} Returns the converted plain object. + * @example + * + * function Foo() { + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.assign({ 'a': 1 }, new Foo); + * // => { 'a': 1, 'b': 2 } + * + * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); + * // => { 'a': 1, 'b': 2, 'c': 3 } + */ - function intersect(a, b, edge, bbox) { - return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top - edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom - edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right - edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left - null; - } - // bit code reflects the point position relative to the bbox: + function toPlainObject(value) { + return copyObject(value, keysIn(value)); + } + /** + * Converts `value` to a safe integer. A safe integer can be compared and + * represented correctly. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toSafeInteger(3.2); + * // => 3 + * + * _.toSafeInteger(Number.MIN_VALUE); + * // => 0 + * + * _.toSafeInteger(Infinity); + * // => 9007199254740991 + * + * _.toSafeInteger('3.2'); + * // => 3 + */ - // left mid right - // top 1001 1000 1010 - // mid 0001 0000 0010 - // bottom 0101 0100 0110 - function bitCode(p, bbox) { - var code = 0; + function toSafeInteger(value) { + return value ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) : value === 0 ? value : 0; + } + /** + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' + * + * _.toString([1, 2, 3]); + * // => '1,2,3' + */ - if (p[0] < bbox[0]) { code |= 1; } // left - else if (p[0] > bbox[2]) { code |= 2; } // right - if (p[1] < bbox[1]) { code |= 4; } // bottom - else if (p[1] > bbox[3]) { code |= 8; } // top + function toString(value) { + return value == null ? '' : baseToString(value); + } + /*------------------------------------------------------------------------*/ - return code; - } - lineclip_1.default = _default; + /** + * Assigns own enumerable string keyed properties of source objects to the + * destination object. Source objects are applied from left to right. + * Subsequent sources overwrite property assignments of previous sources. + * + * **Note:** This method mutates `object` and is loosely based on + * [`Object.assign`](https://mdn.io/Object/assign). + * + * @static + * @memberOf _ + * @since 0.10.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.assignIn + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * function Bar() { + * this.c = 3; + * } + * + * Foo.prototype.b = 2; + * Bar.prototype.d = 4; + * + * _.assign({ 'a': 0 }, new Foo, new Bar); + * // => { 'a': 1, 'c': 3 } + */ - var bboxClip_1 = createCommonjsModule(function (module, exports) { - var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) { - if (mod && mod.__esModule) { return mod; } - var result = {}; - if (mod != null) { for (var k in mod) { if (Object.hasOwnProperty.call(mod, k)) { result[k] = mod[k]; } } } - result["default"] = mod; - return result; - }; - Object.defineProperty(exports, "__esModule", { value: true }); + var assign = createAssigner(function (object, source) { + if (isPrototype(source) || isArrayLike(source)) { + copyObject(source, keys(source), object); + return; + } - var lineclip = __importStar(lineclip_1); - /** - * Takes a {@link Feature} and a bbox and clips the feature to the bbox using - * [lineclip](https://github.com/mapbox/lineclip). - * May result in degenerate edges when clipping Polygons. - * - * @name bboxClip - * @param {Feature} feature feature to clip to the bbox - * @param {BBox} bbox extent in [minX, minY, maxX, maxY] order - * @returns {Feature} clipped Feature - * @example - * var bbox = [0, 0, 10, 10]; - * var poly = turf.polygon([[[2, 2], [8, 4], [12, 8], [3, 7], [2, 2]]]); - * - * var clipped = turf.bboxClip(poly, bbox); - * - * //addToMap - * var addToMap = [bbox, poly, clipped] - */ - function bboxClip(feature, bbox) { - var geom = invariant.getGeom(feature); - var type = geom.type; - var properties = feature.type === "Feature" ? feature.properties : {}; - var coords = geom.coordinates; - switch (type) { - case "LineString": - case "MultiLineString": - var lines_1 = []; - if (type === "LineString") { - coords = [coords]; - } - coords.forEach(function (line) { - lineclip.polyline(line, bbox, lines_1); - }); - if (lines_1.length === 1) { - return helpers$1.lineString(lines_1[0], properties); - } - return helpers$1.multiLineString(lines_1, properties); - case "Polygon": - return helpers$1.polygon(clipPolygon(coords, bbox), properties); - case "MultiPolygon": - return helpers$1.multiPolygon(coords.map(function (poly) { - return clipPolygon(poly, bbox); - }), properties); - default: - throw new Error("geometry " + type + " not supported"); - } - } - exports.default = bboxClip; - function clipPolygon(rings, bbox) { - var outRings = []; - for (var _i = 0, rings_1 = rings; _i < rings_1.length; _i++) { - var ring = rings_1[_i]; - var clipped = lineclip.polygon(ring, bbox); - if (clipped.length > 0) { - if (clipped[0][0] !== clipped[clipped.length - 1][0] || clipped[0][1] !== clipped[clipped.length - 1][1]) { - clipped.push(clipped[0]); - } - if (clipped.length >= 4) { - outRings.push(clipped); - } + for (var key in source) { + if (hasOwnProperty.call(source, key)) { + assignValue(object, key, source[key]); + } } - } - return outRings; - } - }); + }); + /** + * This method is like `_.assign` except that it iterates over own and + * inherited source properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias extend + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.assign + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * function Bar() { + * this.c = 3; + * } + * + * Foo.prototype.b = 2; + * Bar.prototype.d = 4; + * + * _.assignIn({ 'a': 0 }, new Foo, new Bar); + * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 } + */ + + var assignIn = createAssigner(function (object, source) { + copyObject(source, keysIn(source), object); + }); + /** + * This method is like `_.assignIn` except that it accepts `customizer` + * which is invoked to produce the assigned values. If `customizer` returns + * `undefined`, assignment is handled by the method instead. The `customizer` + * is invoked with five arguments: (objValue, srcValue, key, object, source). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias extendWith + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @see _.assignWith + * @example + * + * function customizer(objValue, srcValue) { + * return _.isUndefined(objValue) ? srcValue : objValue; + * } + * + * var defaults = _.partialRight(_.assignInWith, customizer); + * + * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + + var assignInWith = createAssigner(function (object, source, srcIndex, customizer) { + copyObject(source, keysIn(source), object, customizer); + }); + /** + * This method is like `_.assign` except that it accepts `customizer` + * which is invoked to produce the assigned values. If `customizer` returns + * `undefined`, assignment is handled by the method instead. The `customizer` + * is invoked with five arguments: (objValue, srcValue, key, object, source). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @see _.assignInWith + * @example + * + * function customizer(objValue, srcValue) { + * return _.isUndefined(objValue) ? srcValue : objValue; + * } + * + * var defaults = _.partialRight(_.assignWith, customizer); + * + * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + + var assignWith = createAssigner(function (object, source, srcIndex, customizer) { + copyObject(source, keys(source), object, customizer); + }); + /** + * Creates an array of values corresponding to `paths` of `object`. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Array} Returns the picked values. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; + * + * _.at(object, ['a[0].b.c', 'a[1]']); + * // => [3, 4] + */ + + var at = flatRest(baseAt); + /** + * Creates an object that inherits from the `prototype` object. If a + * `properties` object is given, its own enumerable string keyed properties + * are assigned to the created object. + * + * @static + * @memberOf _ + * @since 2.3.0 + * @category Object + * @param {Object} prototype The object to inherit from. + * @param {Object} [properties] The properties to assign to the object. + * @returns {Object} Returns the new object. + * @example + * + * function Shape() { + * this.x = 0; + * this.y = 0; + * } + * + * function Circle() { + * Shape.call(this); + * } + * + * Circle.prototype = _.create(Shape.prototype, { + * 'constructor': Circle + * }); + * + * var circle = new Circle; + * circle instanceof Circle; + * // => true + * + * circle instanceof Shape; + * // => true + */ + + function create(prototype, properties) { + var result = baseCreate(prototype); + return properties == null ? result : baseAssign(result, properties); + } + /** + * Assigns own and inherited enumerable string keyed properties of source + * objects to the destination object for all destination properties that + * resolve to `undefined`. Source objects are applied from left to right. + * Once a property is set, additional values of the same property are ignored. + * + * **Note:** This method mutates `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaultsDeep + * @example + * + * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ - var fastJsonStableStringify = function (data, opts) { - if (!opts) { opts = {}; } - if (typeof opts === 'function') { opts = { cmp: opts }; } - var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false; - - var cmp = opts.cmp && (function (f) { - return function (node) { - return function (a, b) { - var aobj = { key: a, value: node[a] }; - var bobj = { key: b, value: node[b] }; - return f(aobj, bobj); - }; - }; - })(opts.cmp); - var seen = []; - return (function stringify (node) { - if (node && node.toJSON && typeof node.toJSON === 'function') { - node = node.toJSON(); + var defaults = baseRest(function (object, sources) { + object = Object(object); + var index = -1; + var length = sources.length; + var guard = length > 2 ? sources[2] : undefined$1; + + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + length = 1; } - if (node === undefined) { return; } - if (typeof node == 'number') { return isFinite(node) ? '' + node : 'null'; } - if (typeof node !== 'object') { return JSON.stringify(node); } + while (++index < length) { + var source = sources[index]; + var props = keysIn(source); + var propsIndex = -1; + var propsLength = props.length; + + while (++propsIndex < propsLength) { + var key = props[propsIndex]; + var value = object[key]; - var i, out; - if (Array.isArray(node)) { - out = '['; - for (i = 0; i < node.length; i++) { - if (i) { out += ','; } - out += stringify(node[i]) || 'null'; + if (value === undefined$1 || eq(value, objectProto[key]) && !hasOwnProperty.call(object, key)) { + object[key] = source[key]; } - return out + ']'; + } } - if (node === null) { return 'null'; } + return object; + }); + /** + * This method is like `_.defaults` except that it recursively assigns + * default properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.10.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaults + * @example + * + * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } }); + * // => { 'a': { 'b': 2, 'c': 3 } } + */ - if (seen.indexOf(node) !== -1) { - if (cycles) { return JSON.stringify('__cycle__'); } - throw new TypeError('Converting circular structure to JSON'); - } + var defaultsDeep = baseRest(function (args) { + args.push(undefined$1, customDefaultsMerge); + return apply(mergeWith, undefined$1, args); + }); + /** + * This method is like `_.find` except that it returns the key of the first + * element `predicate` returns truthy for instead of the element itself. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Object + * @param {Object} object The object to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {string|undefined} Returns the key of the matched element, + * else `undefined`. + * @example + * + * var users = { + * 'barney': { 'age': 36, 'active': true }, + * 'fred': { 'age': 40, 'active': false }, + * 'pebbles': { 'age': 1, 'active': true } + * }; + * + * _.findKey(users, function(o) { return o.age < 40; }); + * // => 'barney' (iteration order is not guaranteed) + * + * // The `_.matches` iteratee shorthand. + * _.findKey(users, { 'age': 1, 'active': true }); + * // => 'pebbles' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findKey(users, ['active', false]); + * // => 'fred' + * + * // The `_.property` iteratee shorthand. + * _.findKey(users, 'active'); + * // => 'barney' + */ - var seenIndex = seen.push(node) - 1; - var keys = Object.keys(node).sort(cmp && cmp(node)); - out = ''; - for (i = 0; i < keys.length; i++) { - var key = keys[i]; - var value = stringify(node[key]); + function findKey(object, predicate) { + return baseFindKey(object, getIteratee(predicate, 3), baseForOwn); + } + /** + * This method is like `_.findKey` except that it iterates over elements of + * a collection in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {string|undefined} Returns the key of the matched element, + * else `undefined`. + * @example + * + * var users = { + * 'barney': { 'age': 36, 'active': true }, + * 'fred': { 'age': 40, 'active': false }, + * 'pebbles': { 'age': 1, 'active': true } + * }; + * + * _.findLastKey(users, function(o) { return o.age < 40; }); + * // => returns 'pebbles' assuming `_.findKey` returns 'barney' + * + * // The `_.matches` iteratee shorthand. + * _.findLastKey(users, { 'age': 36, 'active': true }); + * // => 'barney' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findLastKey(users, ['active', false]); + * // => 'fred' + * + * // The `_.property` iteratee shorthand. + * _.findLastKey(users, 'active'); + * // => 'pebbles' + */ - if (!value) { continue; } - if (out) { out += ','; } - out += JSON.stringify(key) + ':' + value; - } - seen.splice(seenIndex, 1); - return '{' + out + '}'; - })(data); - }; - function DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; } + function findLastKey(object, predicate) { + return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight); + } + /** + * Iterates over own and inherited enumerable string keyed properties of an + * object and invokes `iteratee` for each property. The iteratee is invoked + * with three arguments: (value, key, object). Iteratee functions may exit + * iteration early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 0.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forInRight + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forIn(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed). + */ - var SplayTree = function SplayTree(compare, noDuplicates) { - if ( compare === void 0 ) compare = DEFAULT_COMPARE; - if ( noDuplicates === void 0 ) noDuplicates = false; - this._compare = compare; - this._root = null; - this._size = 0; - this._noDuplicates = !!noDuplicates; - }; + function forIn(object, iteratee) { + return object == null ? object : baseFor(object, getIteratee(iteratee, 3), keysIn); + } + /** + * This method is like `_.forIn` except that it iterates over properties of + * `object` in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forIn + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forInRight(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'. + */ - var prototypeAccessors = { size: { configurable: true } }; + function forInRight(object, iteratee) { + return object == null ? object : baseForRight(object, getIteratee(iteratee, 3), keysIn); + } + /** + * Iterates over own enumerable string keyed properties of an object and + * invokes `iteratee` for each property. The iteratee is invoked with three + * arguments: (value, key, object). Iteratee functions may exit iteration + * early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 0.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forOwnRight + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forOwn(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a' then 'b' (iteration order is not guaranteed). + */ - SplayTree.prototype.rotateLeft = function rotateLeft (x) { - var y = x.right; - if (y) { - x.right = y.left; - if (y.left) { y.left.parent = x; } - y.parent = x.parent; - } - if (!x.parent) { this._root = y; } - else if (x === x.parent.left) { x.parent.left = y; } - else { x.parent.right = y; } - if (y) { y.left = x; } - x.parent = y; - }; + function forOwn(object, iteratee) { + return object && baseForOwn(object, getIteratee(iteratee, 3)); + } + /** + * This method is like `_.forOwn` except that it iterates over properties of + * `object` in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forOwn + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forOwnRight(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'. + */ - SplayTree.prototype.rotateRight = function rotateRight (x) { - var y = x.left; - if (y) { - x.left = y.right; - if (y.right) { y.right.parent = x; } - y.parent = x.parent; - } + function forOwnRight(object, iteratee) { + return object && baseForOwnRight(object, getIteratee(iteratee, 3)); + } + /** + * Creates an array of function property names from own enumerable properties + * of `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to inspect. + * @returns {Array} Returns the function names. + * @see _.functionsIn + * @example + * + * function Foo() { + * this.a = _.constant('a'); + * this.b = _.constant('b'); + * } + * + * Foo.prototype.c = _.constant('c'); + * + * _.functions(new Foo); + * // => ['a', 'b'] + */ - if (!x.parent) { this._root = y; } - else if(x === x.parent.left) { x.parent.left = y; } - else { x.parent.right = y; } - if (y) { y.right = x; } - x.parent = y; - }; + + function functions(object) { + return object == null ? [] : baseFunctions(object, keys(object)); + } + /** + * Creates an array of function property names from own and inherited + * enumerable properties of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to inspect. + * @returns {Array} Returns the function names. + * @see _.functions + * @example + * + * function Foo() { + * this.a = _.constant('a'); + * this.b = _.constant('b'); + * } + * + * Foo.prototype.c = _.constant('c'); + * + * _.functionsIn(new Foo); + * // => ['a', 'b', 'c'] + */ - SplayTree.prototype._splay = function _splay (x) { - while (x.parent) { - var p = x.parent; - if (!p.parent) { - if (p.left === x) { this.rotateRight(p); } - else { this.rotateLeft(p); } - } else if (p.left === x && p.parent.left === p) { - this.rotateRight(p.parent); - this.rotateRight(p); - } else if (p.right === x && p.parent.right === p) { - this.rotateLeft(p.parent); - this.rotateLeft(p); - } else if (p.left === x && p.parent.right === p) { - this.rotateRight(p); - this.rotateLeft(p); - } else { - this.rotateLeft(p); - this.rotateRight(p); - } - } - }; + function functionsIn(object) { + return object == null ? [] : baseFunctions(object, keysIn(object)); + } + /** + * Gets the value at `path` of `object`. If the resolved value is + * `undefined`, the `defaultValue` is returned in its place. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ - SplayTree.prototype.splay = function splay (x) { - var p, gp, ggp, l, r; + function get(object, path, defaultValue) { + var result = object == null ? undefined$1 : baseGet(object, path); + return result === undefined$1 ? defaultValue : result; + } + /** + * Checks if `path` is a direct property of `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = { 'a': { 'b': 2 } }; + * var other = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.has(object, 'a'); + * // => true + * + * _.has(object, 'a.b'); + * // => true + * + * _.has(object, ['a', 'b']); + * // => true + * + * _.has(other, 'a'); + * // => false + */ - while (x.parent) { - p = x.parent; - gp = p.parent; - if (gp && gp.parent) { - ggp = gp.parent; - if (ggp.left === gp) { ggp.left= x; } - else { ggp.right = x; } - x.parent = ggp; - } else { - x.parent = null; - this._root = x; - } + function has(object, path) { + return object != null && hasPath(object, path, baseHas); + } + /** + * Checks if `path` is a direct or inherited property of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.hasIn(object, 'a'); + * // => true + * + * _.hasIn(object, 'a.b'); + * // => true + * + * _.hasIn(object, ['a', 'b']); + * // => true + * + * _.hasIn(object, 'b'); + * // => false + */ - l = x.left; r = x.right; - if (x === p.left) { // left - if (gp) { - if (gp.left === p) { - /* zig-zig */ - if (p.right) { - gp.left = p.right; - gp.left.parent = gp; - } else { gp.left = null; } + function hasIn(object, path) { + return object != null && hasPath(object, path, baseHasIn); + } + /** + * Creates an object composed of the inverted keys and values of `object`. + * If `object` contains duplicate values, subsequent values overwrite + * property assignments of previous values. + * + * @static + * @memberOf _ + * @since 0.7.0 + * @category Object + * @param {Object} object The object to invert. + * @returns {Object} Returns the new inverted object. + * @example + * + * var object = { 'a': 1, 'b': 2, 'c': 1 }; + * + * _.invert(object); + * // => { '1': 'c', '2': 'b' } + */ - p.right = gp; - gp.parent = p; - } else { - /* zig-zag */ - if (l) { - gp.right = l; - l.parent = gp; - } else { gp.right = null; } - - x.left = gp; - gp.parent = x; - } - } - if (r) { - p.left = r; - r.parent = p; - } else { p.left = null; } - - x.right= p; - p.parent = x; - } else { // right - if (gp) { - if (gp.right === p) { - /* zig-zig */ - if (p.left) { - gp.right = p.left; - gp.right.parent = gp; - } else { gp.right = null; } - - p.left = gp; - gp.parent = p; - } else { - /* zig-zag */ - if (r) { - gp.left = r; - r.parent = gp; - } else { gp.left = null; } - x.right = gp; - gp.parent = x; + var invert = createInverter(function (result, value, key) { + if (value != null && typeof value.toString != 'function') { + value = nativeObjectToString.call(value); + } + + result[value] = key; + }, constant(identity)); + /** + * This method is like `_.invert` except that the inverted object is generated + * from the results of running each element of `object` thru `iteratee`. The + * corresponding inverted value of each inverted key is an array of keys + * responsible for generating the inverted value. The iteratee is invoked + * with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.1.0 + * @category Object + * @param {Object} object The object to invert. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Object} Returns the new inverted object. + * @example + * + * var object = { 'a': 1, 'b': 2, 'c': 1 }; + * + * _.invertBy(object); + * // => { '1': ['a', 'c'], '2': ['b'] } + * + * _.invertBy(object, function(value) { + * return 'group' + value; + * }); + * // => { 'group1': ['a', 'c'], 'group2': ['b'] } + */ + + var invertBy = createInverter(function (result, value, key) { + if (value != null && typeof value.toString != 'function') { + value = nativeObjectToString.call(value); + } + + if (hasOwnProperty.call(result, value)) { + result[value].push(key); + } else { + result[value] = [key]; } + }, getIteratee); + /** + * Invokes the method at `path` of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the method to invoke. + * @param {...*} [args] The arguments to invoke the method with. + * @returns {*} Returns the result of the invoked method. + * @example + * + * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] }; + * + * _.invoke(object, 'a[0].b.c.slice', 1, 3); + * // => [2, 3] + */ + + var invoke = baseRest(baseInvoke); + /** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * for more details. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ + + function keys(object) { + return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); } - if (l) { - p.right = l; - l.parent = p; - } else { p.right = null; } + /** + * Creates an array of the own and inherited enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) + */ - x.left = p; - p.parent = x; - } - } - }; + function keysIn(object) { + return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); + } + /** + * The opposite of `_.mapValues`; this method creates an object with the + * same values as `object` and keys generated by running each own enumerable + * string keyed property of `object` thru `iteratee`. The iteratee is invoked + * with three arguments: (value, key, object). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns the new mapped object. + * @see _.mapValues + * @example + * + * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) { + * return key + value; + * }); + * // => { 'a1': 1, 'b2': 2 } + */ - SplayTree.prototype.replace = function replace (u, v) { - if (!u.parent) { this._root = v; } - else if (u === u.parent.left) { u.parent.left = v; } - else { u.parent.right = v; } - if (v) { v.parent = u.parent; } - }; + function mapKeys(object, iteratee) { + var result = {}; + iteratee = getIteratee(iteratee, 3); + baseForOwn(object, function (value, key, object) { + baseAssignValue(result, iteratee(value, key, object), value); + }); + return result; + } + /** + * Creates an object with the same keys as `object` and values generated + * by running each own enumerable string keyed property of `object` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, key, object). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns the new mapped object. + * @see _.mapKeys + * @example + * + * var users = { + * 'fred': { 'user': 'fred', 'age': 40 }, + * 'pebbles': { 'user': 'pebbles', 'age': 1 } + * }; + * + * _.mapValues(users, function(o) { return o.age; }); + * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) + * + * // The `_.property` iteratee shorthand. + * _.mapValues(users, 'age'); + * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) + */ - SplayTree.prototype.minNode = function minNode (u) { - if ( u === void 0 ) u = this._root; - if (u) { while (u.left) { u = u.left; } } - return u; - }; + function mapValues(object, iteratee) { + var result = {}; + iteratee = getIteratee(iteratee, 3); + baseForOwn(object, function (value, key, object) { + baseAssignValue(result, key, iteratee(value, key, object)); + }); + return result; + } + /** + * This method is like `_.assign` except that it recursively merges own and + * inherited enumerable string keyed properties of source objects into the + * destination object. Source properties that resolve to `undefined` are + * skipped if a destination value exists. Array and plain object properties + * are merged recursively. Other objects and value types are overridden by + * assignment. Source objects are applied from left to right. Subsequent + * sources overwrite property assignments of previous sources. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @example + * + * var object = { + * 'a': [{ 'b': 2 }, { 'd': 4 }] + * }; + * + * var other = { + * 'a': [{ 'c': 3 }, { 'e': 5 }] + * }; + * + * _.merge(object, other); + * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } + */ - SplayTree.prototype.maxNode = function maxNode (u) { - if ( u === void 0 ) u = this._root; + var merge = createAssigner(function (object, source, srcIndex) { + baseMerge(object, source, srcIndex); + }); + /** + * This method is like `_.merge` except that it accepts `customizer` which + * is invoked to produce the merged values of the destination and source + * properties. If `customizer` returns `undefined`, merging is handled by the + * method instead. The `customizer` is invoked with six arguments: + * (objValue, srcValue, key, object, source, stack). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} customizer The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * function customizer(objValue, srcValue) { + * if (_.isArray(objValue)) { + * return objValue.concat(srcValue); + * } + * } + * + * var object = { 'a': [1], 'b': [2] }; + * var other = { 'a': [3], 'b': [4] }; + * + * _.mergeWith(object, other, customizer); + * // => { 'a': [1, 3], 'b': [2, 4] } + */ - if (u) { while (u.right) { u = u.right; } } - return u; - }; + var mergeWith = createAssigner(function (object, source, srcIndex, customizer) { + baseMerge(object, source, srcIndex, customizer); + }); + /** + * The opposite of `_.pick`; this method creates an object composed of the + * own and inherited enumerable property paths of `object` that are not omitted. + * + * **Note:** This method is considerably slower than `_.pick`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The source object. + * @param {...(string|string[])} [paths] The property paths to omit. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.omit(object, ['a', 'c']); + * // => { 'b': '2' } + */ + var omit = flatRest(function (object, paths) { + var result = {}; - SplayTree.prototype.insert = function insert (key, data) { - var z = this._root; - var p = null; - var comp = this._compare; - var cmp; + if (object == null) { + return result; + } - if (this._noDuplicates) { - while (z) { - p = z; - cmp = comp(z.key, key); - if (cmp === 0) { return; } - else if (comp(z.key, key) < 0) { z = z.right; } - else { z = z.left; } - } - } else { - while (z) { - p = z; - if (comp(z.key, key) < 0) { z = z.right; } - else { z = z.left; } - } - } + var isDeep = false; + paths = arrayMap(paths, function (path) { + path = castPath(path, object); + isDeep || (isDeep = path.length > 1); + return path; + }); + copyObject(object, getAllKeysIn(object), result); - z = { key: key, data: data, left: null, right: null, parent: p }; + if (isDeep) { + result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone); + } - if (!p) { this._root = z; } - else if (comp(p.key, z.key) < 0) { p.right = z; } - else { p.left= z; } + var length = paths.length; - this.splay(z); - this._size++; - return z; - }; + while (length--) { + baseUnset(result, paths[length]); + } + return result; + }); + /** + * The opposite of `_.pickBy`; this method creates an object composed of + * the own and inherited enumerable string keyed properties of `object` that + * `predicate` doesn't return truthy for. The predicate is invoked with two + * arguments: (value, key). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The source object. + * @param {Function} [predicate=_.identity] The function invoked per property. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.omitBy(object, _.isNumber); + * // => { 'b': '2' } + */ - SplayTree.prototype.find = function find (key) { - var z = this._root; - var comp = this._compare; - while (z) { - var cmp = comp(z.key, key); - if (cmp < 0) { z = z.right; } - else if (cmp > 0) { z = z.left; } - else { return z; } - } - return null; - }; + function omitBy(object, predicate) { + return pickBy(object, negate(getIteratee(predicate))); + } + /** + * Creates an object composed of the picked `object` properties. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The source object. + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.pick(object, ['a', 'c']); + * // => { 'a': 1, 'c': 3 } + */ - /** - * Whether the tree contains a node with the given key - * @param{Key} key - * @return {boolean} true/false - */ - SplayTree.prototype.contains = function contains (key) { - var node = this._root; - var comparator = this._compare; - while (node){ - var cmp = comparator(key, node.key); - if (cmp === 0) { return true; } - else if (cmp < 0) { node = node.left; } - else { node = node.right; } - } - return false; - }; + var pick = flatRest(function (object, paths) { + return object == null ? {} : basePick(object, paths); + }); + /** + * Creates an object composed of the `object` properties `predicate` returns + * truthy for. The predicate is invoked with two arguments: (value, key). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The source object. + * @param {Function} [predicate=_.identity] The function invoked per property. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.pickBy(object, _.isNumber); + * // => { 'a': 1, 'c': 3 } + */ + function pickBy(object, predicate) { + if (object == null) { + return {}; + } - SplayTree.prototype.remove = function remove (key) { - var z = this.find(key); + var props = arrayMap(getAllKeysIn(object), function (prop) { + return [prop]; + }); + predicate = getIteratee(predicate); + return basePickBy(object, props, function (value, path) { + return predicate(value, path[0]); + }); + } + /** + * This method is like `_.get` except that if the resolved value is a + * function it's invoked with the `this` binding of its parent object and + * its result is returned. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to resolve. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] }; + * + * _.result(object, 'a[0].b.c1'); + * // => 3 + * + * _.result(object, 'a[0].b.c2'); + * // => 4 + * + * _.result(object, 'a[0].b.c3', 'default'); + * // => 'default' + * + * _.result(object, 'a[0].b.c3', _.constant('default')); + * // => 'default' + */ - if (!z) { return false; } - this.splay(z); + function result(object, path, defaultValue) { + path = castPath(path, object); + var index = -1, + length = path.length; // Ensure the loop is entered when path is empty. - if (!z.left) { this.replace(z, z.right); } - else if (!z.right) { this.replace(z, z.left); } - else { - var y = this.minNode(z.right); - if (y.parent !== z) { - this.replace(y, y.right); - y.right = z.right; - y.right.parent = y; - } - this.replace(z, y); - y.left = z.left; - y.left.parent = y; - } + if (!length) { + length = 1; + object = undefined$1; + } - this._size--; - return true; - }; + while (++index < length) { + var value = object == null ? undefined$1 : object[toKey(path[index])]; + if (value === undefined$1) { + index = length; + value = defaultValue; + } - SplayTree.prototype.removeNode = function removeNode (z) { - if (!z) { return false; } + object = isFunction(value) ? value.call(object) : value; + } - this.splay(z); + return object; + } + /** + * Sets the value at `path` of `object`. If a portion of `path` doesn't exist, + * it's created. Arrays are created for missing index properties while objects + * are created for all other missing properties. Use `_.setWith` to customize + * `path` creation. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @returns {Object} Returns `object`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.set(object, 'a[0].b.c', 4); + * console.log(object.a[0].b.c); + * // => 4 + * + * _.set(object, ['x', '0', 'y', 'z'], 5); + * console.log(object.x[0].y.z); + * // => 5 + */ - if (!z.left) { this.replace(z, z.right); } - else if (!z.right) { this.replace(z, z.left); } - else { - var y = this.minNode(z.right); - if (y.parent !== z) { - this.replace(y, y.right); - y.right = z.right; - y.right.parent = y; - } - this.replace(z, y); - y.left = z.left; - y.left.parent = y; - } - this._size--; - return true; - }; + function set(object, path, value) { + return object == null ? object : baseSet(object, path, value); + } + /** + * This method is like `_.set` except that it accepts `customizer` which is + * invoked to produce the objects of `path`. If `customizer` returns `undefined` + * path creation is handled by the method instead. The `customizer` is invoked + * with three arguments: (nsValue, key, nsObject). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * var object = {}; + * + * _.setWith(object, '[0][1]', 'a', Object); + * // => { '0': { '1': 'a' } } + */ + + function setWith(object, path, value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined$1; + return object == null ? object : baseSet(object, path, value, customizer); + } + /** + * Creates an array of own enumerable string keyed-value pairs for `object` + * which can be consumed by `_.fromPairs`. If `object` is a map or set, its + * entries are returned. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias entries + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the key-value pairs. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.toPairs(new Foo); + * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed) + */ - SplayTree.prototype.erase = function erase (key) { - var z = this.find(key); - if (!z) { return; } - this.splay(z); + var toPairs = createToPairs(keys); + /** + * Creates an array of own and inherited enumerable string keyed-value pairs + * for `object` which can be consumed by `_.fromPairs`. If `object` is a map + * or set, its entries are returned. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias entriesIn + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the key-value pairs. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.toPairsIn(new Foo); + * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed) + */ - var s = z.left; - var t = z.right; + var toPairsIn = createToPairs(keysIn); + /** + * An alternative to `_.reduce`; this method transforms `object` to a new + * `accumulator` object which is the result of running each of its own + * enumerable string keyed properties thru `iteratee`, with each invocation + * potentially mutating the `accumulator` object. If `accumulator` is not + * provided, a new object with the same `[[Prototype]]` will be used. The + * iteratee is invoked with four arguments: (accumulator, value, key, object). + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 1.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The custom accumulator value. + * @returns {*} Returns the accumulated value. + * @example + * + * _.transform([2, 3, 4], function(result, n) { + * result.push(n *= n); + * return n % 2 == 0; + * }, []); + * // => [4, 9] + * + * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { + * (result[value] || (result[value] = [])).push(key); + * }, {}); + * // => { '1': ['a', 'c'], '2': ['b'] } + */ - var sMax = null; - if (s) { - s.parent = null; - sMax = this.maxNode(s); - this.splay(sMax); - this._root = sMax; - } - if (t) { - if (s) { sMax.right = t; } - else { this._root = t; } - t.parent = sMax; - } + function transform(object, iteratee, accumulator) { + var isArr = isArray(object), + isArrLike = isArr || isBuffer(object) || isTypedArray(object); + iteratee = getIteratee(iteratee, 4); - this._size--; - }; + if (accumulator == null) { + var Ctor = object && object.constructor; - /** - * Removes and returns the node with smallest key - * @return {?Node} - */ - SplayTree.prototype.pop = function pop () { - var node = this._root, returnValue = null; - if (node) { - while (node.left) { node = node.left; } - returnValue = { key: node.key, data: node.data }; - this.remove(node.key); - } - return returnValue; - }; + if (isArrLike) { + accumulator = isArr ? new Ctor() : []; + } else if (isObject(object)) { + accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {}; + } else { + accumulator = {}; + } + } + (isArrLike ? arrayEach : baseForOwn)(object, function (value, index, object) { + return iteratee(accumulator, value, index, object); + }); + return accumulator; + } + /** + * Removes the property at `path` of `object`. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to unset. + * @returns {boolean} Returns `true` if the property is deleted, else `false`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 7 } }] }; + * _.unset(object, 'a[0].b.c'); + * // => true + * + * console.log(object); + * // => { 'a': [{ 'b': {} }] }; + * + * _.unset(object, ['a', '0', 'b', 'c']); + * // => true + * + * console.log(object); + * // => { 'a': [{ 'b': {} }] }; + */ - /* eslint-disable class-methods-use-this */ - /** - * Successor node - * @param{Node} node - * @return {?Node} - */ - SplayTree.prototype.next = function next (node) { - var successor = node; - if (successor) { - if (successor.right) { - successor = successor.right; - while (successor && successor.left) { successor = successor.left; } - } else { - successor = node.parent; - while (successor && successor.right === node) { - node = successor; successor = successor.parent; + function unset(object, path) { + return object == null ? true : baseUnset(object, path); } - } - } - return successor; - }; + /** + * This method is like `_.set` except that accepts `updater` to produce the + * value to set. Use `_.updateWith` to customize `path` creation. The `updater` + * is invoked with one argument: (value). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {Function} updater The function to produce the updated value. + * @returns {Object} Returns `object`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.update(object, 'a[0].b.c', function(n) { return n * n; }); + * console.log(object.a[0].b.c); + * // => 9 + * + * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; }); + * console.log(object.x[0].y.z); + * // => 0 + */ - /** - * Predecessor node - * @param{Node} node - * @return {?Node} - */ - SplayTree.prototype.prev = function prev (node) { - var predecessor = node; - if (predecessor) { - if (predecessor.left) { - predecessor = predecessor.left; - while (predecessor && predecessor.right) { predecessor = predecessor.right; } - } else { - predecessor = node.parent; - while (predecessor && predecessor.left === node) { - node = predecessor; - predecessor = predecessor.parent; + function update(object, path, updater) { + return object == null ? object : baseUpdate(object, path, castFunction(updater)); } - } - } - return predecessor; - }; - /* eslint-enable class-methods-use-this */ + /** + * This method is like `_.update` except that it accepts `customizer` which is + * invoked to produce the objects of `path`. If `customizer` returns `undefined` + * path creation is handled by the method instead. The `customizer` is invoked + * with three arguments: (nsValue, key, nsObject). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {Function} updater The function to produce the updated value. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * var object = {}; + * + * _.updateWith(object, '[0][1]', _.constant('a'), Object); + * // => { '0': { '1': 'a' } } + */ - /** - * @param{forEachCallback} callback - * @return {SplayTree} - */ - SplayTree.prototype.forEach = function forEach (callback) { - var current = this._root; - var s = [], done = false, i = 0; + function updateWith(object, path, updater, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined$1; + return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer); + } + /** + * Creates an array of the own enumerable string keyed property values of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property values. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.values(new Foo); + * // => [1, 2] (iteration order is not guaranteed) + * + * _.values('hi'); + * // => ['h', 'i'] + */ - while (!done) { - // Reach the left most Node of the current Node - if (current) { - // Place pointer to a tree node on the stack - // before traversing the node's left subtree - s.push(current); - current = current.left; - } else { - // BackTrack from the empty subtree and visit the Node - // at the top of the stack; however, if the stack is - // empty you are done - if (s.length > 0) { - current = s.pop(); - callback(current, i++); - - // We have visited the node and its left - // subtree. Now, it's right subtree's turn - current = current.right; - } else { done = true; } - } - } - return this; - }; + function values(object) { + return object == null ? [] : baseValues(object, keys(object)); + } + /** + * Creates an array of the own and inherited enumerable string keyed property + * values of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property values. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.valuesIn(new Foo); + * // => [1, 2, 3] (iteration order is not guaranteed) + */ - /** - * Walk key range from `low` to `high`. Stops if `fn` returns a value. - * @param{Key} low - * @param{Key} high - * @param{Function} fn - * @param{*?} ctx - * @return {SplayTree} - */ - SplayTree.prototype.range = function range (low, high, fn, ctx) { - var Q = []; - var compare = this._compare; - var node = this._root, cmp; - while (Q.length !== 0 || node) { - if (node) { - Q.push(node); - node = node.left; - } else { - node = Q.pop(); - cmp = compare(node.key, high); - if (cmp > 0) { - break; - } else if (compare(node.key, low) >= 0) { - if (fn.call(ctx, node)) { return this; } // stop if smth is returned + function valuesIn(object) { + return object == null ? [] : baseValues(object, keysIn(object)); } - node = node.right; - } - } - return this; - }; + /*------------------------------------------------------------------------*/ - /** - * Returns all keys in order - * @return {Array} - */ - SplayTree.prototype.keys = function keys () { - var current = this._root; - var s = [], r = [], done = false; + /** + * Clamps `number` within the inclusive `lower` and `upper` bounds. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Number + * @param {number} number The number to clamp. + * @param {number} [lower] The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the clamped number. + * @example + * + * _.clamp(-10, -5, 5); + * // => -5 + * + * _.clamp(10, -5, 5); + * // => 5 + */ - while (!done) { - if (current) { - s.push(current); - current = current.left; - } else { - if (s.length > 0) { - current = s.pop(); - r.push(current.key); - current = current.right; - } else { done = true; } - } - } - return r; - }; + function clamp(number, lower, upper) { + if (upper === undefined$1) { + upper = lower; + lower = undefined$1; + } - /** - * Returns `data` fields of all nodes in order. - * @return {Array} - */ - SplayTree.prototype.values = function values () { - var current = this._root; - var s = [], r = [], done = false; + if (upper !== undefined$1) { + upper = toNumber(upper); + upper = upper === upper ? upper : 0; + } - while (!done) { - if (current) { - s.push(current); - current = current.left; - } else { - if (s.length > 0) { - current = s.pop(); - r.push(current.data); - current = current.right; - } else { done = true; } - } - } - return r; - }; + if (lower !== undefined$1) { + lower = toNumber(lower); + lower = lower === lower ? lower : 0; + } + return baseClamp(toNumber(number), lower, upper); + } + /** + * Checks if `n` is between `start` and up to, but not including, `end`. If + * `end` is not specified, it's set to `start` with `start` then set to `0`. + * If `start` is greater than `end` the params are swapped to support + * negative ranges. + * + * @static + * @memberOf _ + * @since 3.3.0 + * @category Number + * @param {number} number The number to check. + * @param {number} [start=0] The start of the range. + * @param {number} end The end of the range. + * @returns {boolean} Returns `true` if `number` is in the range, else `false`. + * @see _.range, _.rangeRight + * @example + * + * _.inRange(3, 2, 4); + * // => true + * + * _.inRange(4, 8); + * // => true + * + * _.inRange(4, 2); + * // => false + * + * _.inRange(2, 2); + * // => false + * + * _.inRange(1.2, 2); + * // => true + * + * _.inRange(5.2, 4); + * // => false + * + * _.inRange(-3, -2, -6); + * // => true + */ - /** - * Returns node at given index - * @param{number} index - * @return {?Node} - */ - SplayTree.prototype.at = function at (index) { - // removed after a consideration, more misleading than useful - // index = index % this.size; - // if (index < 0) index = this.size - index; - var current = this._root; - var s = [], done = false, i = 0; + function inRange(number, start, end) { + start = toFinite(start); - while (!done) { - if (current) { - s.push(current); - current = current.left; - } else { - if (s.length > 0) { - current = s.pop(); - if (i === index) { return current; } - i++; - current = current.right; - } else { done = true; } - } - } - return null; - }; + if (end === undefined$1) { + end = start; + start = 0; + } else { + end = toFinite(end); + } - /** - * Bulk-load items. Both array have to be same size - * @param{Array} keys - * @param{Array}[values] - * @param{Boolean} [presort=false] Pre-sort keys and values, using - * tree's comparator. Sorting is done - * in-place - * @return {AVLTree} - */ - SplayTree.prototype.load = function load (keys, values, presort) { - if ( keys === void 0 ) keys = []; - if ( values === void 0 ) values = []; - if ( presort === void 0 ) presort = false; - - if (this._size !== 0) { throw new Error('bulk-load: tree is not empty'); } - var size = keys.length; - if (presort) { sort(keys, values, 0, size - 1, this._compare); } - this._root = loadRecursive(null, keys, values, 0, size); - this._size = size; - return this; - }; + number = toNumber(number); + return baseInRange(number, start, end); + } + /** + * Produces a random number between the inclusive `lower` and `upper` bounds. + * If only one argument is provided a number between `0` and the given number + * is returned. If `floating` is `true`, or either `lower` or `upper` are + * floats, a floating-point number is returned instead of an integer. + * + * **Note:** JavaScript follows the IEEE-754 standard for resolving + * floating-point values which can produce unexpected results. + * + * @static + * @memberOf _ + * @since 0.7.0 + * @category Number + * @param {number} [lower=0] The lower bound. + * @param {number} [upper=1] The upper bound. + * @param {boolean} [floating] Specify returning a floating-point number. + * @returns {number} Returns the random number. + * @example + * + * _.random(0, 5); + * // => an integer between 0 and 5 + * + * _.random(5); + * // => also an integer between 0 and 5 + * + * _.random(5, true); + * // => a floating-point number between 0 and 5 + * + * _.random(1.2, 5.2); + * // => a floating-point number between 1.2 and 5.2 + */ - SplayTree.prototype.min = function min () { - var node = this.minNode(this._root); - if (node) { return node.key; } - else { return null; } - }; + function random(lower, upper, floating) { + if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) { + upper = floating = undefined$1; + } + if (floating === undefined$1) { + if (typeof upper == 'boolean') { + floating = upper; + upper = undefined$1; + } else if (typeof lower == 'boolean') { + floating = lower; + lower = undefined$1; + } + } - SplayTree.prototype.max = function max () { - var node = this.maxNode(this._root); - if (node) { return node.key; } - else { return null; } - }; + if (lower === undefined$1 && upper === undefined$1) { + lower = 0; + upper = 1; + } else { + lower = toFinite(lower); - SplayTree.prototype.isEmpty = function isEmpty () { return this._root === null; }; - prototypeAccessors.size.get = function () { return this._size; }; + if (upper === undefined$1) { + upper = lower; + lower = 0; + } else { + upper = toFinite(upper); + } + } + if (lower > upper) { + var temp = lower; + lower = upper; + upper = temp; + } - /** - * Create a tree and load it with items - * @param{Array} keys - * @param{Array?} [values] - - * @param{Function?} [comparator] - * @param{Boolean?} [presort=false] Pre-sort keys and values, using - * tree's comparator. Sorting is done - * in-place - * @param{Boolean?} [noDuplicates=false] Allow duplicates - * @return {SplayTree} - */ - SplayTree.createTree = function createTree (keys, values, comparator, presort, noDuplicates) { - return new SplayTree(comparator, noDuplicates).load(keys, values, presort); - }; + if (floating || lower % 1 || upper % 1) { + var rand = nativeRandom(); + return nativeMin(lower + rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1))), upper); + } - Object.defineProperties( SplayTree.prototype, prototypeAccessors ); + return baseRandom(lower, upper); + } + /*------------------------------------------------------------------------*/ + /** + * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the camel cased string. + * @example + * + * _.camelCase('Foo Bar'); + * // => 'fooBar' + * + * _.camelCase('--foo-bar--'); + * // => 'fooBar' + * + * _.camelCase('__FOO_BAR__'); + * // => 'fooBar' + */ - function loadRecursive (parent, keys, values, start, end) { - var size = end - start; - if (size > 0) { - var middle = start + Math.floor(size / 2); - var key = keys[middle]; - var data = values[middle]; - var node = { key: key, data: data, parent: parent }; - node.left = loadRecursive(node, keys, values, start, middle); - node.right = loadRecursive(node, keys, values, middle + 1, end); - return node; - } - return null; - } + var camelCase = createCompounder(function (result, word, index) { + word = word.toLowerCase(); + return result + (index ? capitalize(word) : word); + }); + /** + * Converts the first character of `string` to upper case and the remaining + * to lower case. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to capitalize. + * @returns {string} Returns the capitalized string. + * @example + * + * _.capitalize('FRED'); + * // => 'Fred' + */ - function sort(keys, values, left, right, compare) { - if (left >= right) { return; } + function capitalize(string) { + return upperFirst(toString(string).toLowerCase()); + } + /** + * Deburrs `string` by converting + * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table) + * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A) + * letters to basic Latin letters and removing + * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to deburr. + * @returns {string} Returns the deburred string. + * @example + * + * _.deburr('déjà vu'); + * // => 'deja vu' + */ - var pivot = keys[(left + right) >> 1]; - var i = left - 1; - var j = right + 1; - while (true) { - do { i++; } while (compare(keys[i], pivot) < 0); - do { j--; } while (compare(keys[j], pivot) > 0); - if (i >= j) { break; } + function deburr(string) { + string = toString(string); + return string && string.replace(reLatin, deburrLetter).replace(reComboMark, ''); + } + /** + * Checks if `string` ends with the given target string. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to inspect. + * @param {string} [target] The string to search for. + * @param {number} [position=string.length] The position to search up to. + * @returns {boolean} Returns `true` if `string` ends with `target`, + * else `false`. + * @example + * + * _.endsWith('abc', 'c'); + * // => true + * + * _.endsWith('abc', 'b'); + * // => false + * + * _.endsWith('abc', 'b', 2); + * // => true + */ - var tmp = keys[i]; - keys[i] = keys[j]; - keys[j] = tmp; - tmp = values[i]; - values[i] = values[j]; - values[j] = tmp; - } + function endsWith(string, target, position) { + string = toString(string); + target = baseToString(target); + var length = string.length; + position = position === undefined$1 ? length : baseClamp(toInteger(position), 0, length); + var end = position; + position -= target.length; + return position >= 0 && string.slice(position, end) == target; + } + /** + * Converts the characters "&", "<", ">", '"', and "'" in `string` to their + * corresponding HTML entities. + * + * **Note:** No other characters are escaped. To escape additional + * characters use a third-party library like [_he_](https://mths.be/he). + * + * Though the ">" character is escaped for symmetry, characters like + * ">" and "/" don't need escaping in HTML and have no special meaning + * unless they're part of a tag or unquoted attribute value. See + * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands) + * (under "semi-related fun fact") for more details. + * + * When working with HTML you should always + * [quote attribute values](http://wonko.com/post/html-escaping) to reduce + * XSS vectors. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category String + * @param {string} [string=''] The string to escape. + * @returns {string} Returns the escaped string. + * @example + * + * _.escape('fred, barney, & pebbles'); + * // => 'fred, barney, & pebbles' + */ - sort(keys, values, left, j, compare); - sort(keys, values, j + 1, right, compare); - } - var NORMAL = 0; - var NON_CONTRIBUTING = 1; - var SAME_TRANSITION = 2; - var DIFFERENT_TRANSITION = 3; + function escape(string) { + string = toString(string); + return string && reHasUnescapedHtml.test(string) ? string.replace(reUnescapedHtml, escapeHtmlChar) : string; + } + /** + * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+", + * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to escape. + * @returns {string} Returns the escaped string. + * @example + * + * _.escapeRegExp('[lodash](https://lodash.com/)'); + * // => '\[lodash\]\(https://lodash\.com/\)' + */ - var INTERSECTION = 0; - var UNION = 1; - var DIFFERENCE = 2; - var XOR = 3; - /** - * @param {SweepEvent} event - * @param {SweepEvent} prev - * @param {Operation} operation - */ - function computeFields (event, prev, operation) { - // compute inOut and otherInOut fields - if (prev === null) { - event.inOut = false; - event.otherInOut = true; + function escapeRegExp(string) { + string = toString(string); + return string && reHasRegExpChar.test(string) ? string.replace(reRegExpChar, '\\$&') : string; + } + /** + * Converts `string` to + * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the kebab cased string. + * @example + * + * _.kebabCase('Foo Bar'); + * // => 'foo-bar' + * + * _.kebabCase('fooBar'); + * // => 'foo-bar' + * + * _.kebabCase('__FOO_BAR__'); + * // => 'foo-bar' + */ - // previous line segment in sweepline belongs to the same polygon - } else { - if (event.isSubject === prev.isSubject) { - event.inOut = !prev.inOut; - event.otherInOut = prev.otherInOut; - // previous line segment in sweepline belongs to the clipping polygon - } else { - event.inOut = !prev.otherInOut; - event.otherInOut = prev.isVertical() ? !prev.inOut : prev.inOut; - } + var kebabCase = createCompounder(function (result, word, index) { + return result + (index ? '-' : '') + word.toLowerCase(); + }); + /** + * Converts `string`, as space separated words, to lower case. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the lower cased string. + * @example + * + * _.lowerCase('--Foo-Bar--'); + * // => 'foo bar' + * + * _.lowerCase('fooBar'); + * // => 'foo bar' + * + * _.lowerCase('__FOO_BAR__'); + * // => 'foo bar' + */ - // compute prevInResult field - if (prev) { - event.prevInResult = (!inResult(prev, operation) || prev.isVertical()) - ? prev.prevInResult : prev; - } - } + var lowerCase = createCompounder(function (result, word, index) { + return result + (index ? ' ' : '') + word.toLowerCase(); + }); + /** + * Converts the first character of `string` to lower case. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.lowerFirst('Fred'); + * // => 'fred' + * + * _.lowerFirst('FRED'); + * // => 'fRED' + */ - // check if the line segment belongs to the Boolean operation - var isInResult = inResult(event, operation); - if (isInResult) { - event.resultTransition = determineResultTransition(event, operation); - } else { - event.resultTransition = 0; - } - } - - - /* eslint-disable indent */ - function inResult(event, operation) { - switch (event.type) { - case NORMAL: - switch (operation) { - case INTERSECTION: - return !event.otherInOut; - case UNION: - return event.otherInOut; - case DIFFERENCE: - // return (event.isSubject && !event.otherInOut) || - // (!event.isSubject && event.otherInOut); - return (event.isSubject && event.otherInOut) || - (!event.isSubject && !event.otherInOut); - case XOR: - return true; - } - break; - case SAME_TRANSITION: - return operation === INTERSECTION || operation === UNION; - case DIFFERENT_TRANSITION: - return operation === DIFFERENCE; - case NON_CONTRIBUTING: - return false; - } - return false; - } - /* eslint-enable indent */ + var lowerFirst = createCaseFirst('toLowerCase'); + /** + * Pads `string` on the left and right sides if it's shorter than `length`. + * Padding characters are truncated if they can't be evenly divided by `length`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.pad('abc', 8); + * // => ' abc ' + * + * _.pad('abc', 8, '_-'); + * // => '_-abc_-_' + * + * _.pad('abc', 3); + * // => 'abc' + */ + function pad(string, length, chars) { + string = toString(string); + length = toInteger(length); + var strLength = length ? stringSize(string) : 0; - function determineResultTransition(event, operation) { - var thisIn = !event.inOut; - var thatIn = !event.otherInOut; + if (!length || strLength >= length) { + return string; + } - var isIn; - switch (operation) { - case INTERSECTION: - isIn = thisIn && thatIn; break; - case UNION: - isIn = thisIn || thatIn; break; - case XOR: - isIn = thisIn ^ thatIn; break; - case DIFFERENCE: - if (event.isSubject) { - isIn = thisIn && !thatIn; - } else { - isIn = thatIn && !thisIn; + var mid = (length - strLength) / 2; + return createPadding(nativeFloor(mid), chars) + string + createPadding(nativeCeil(mid), chars); } - break; - } - return isIn ? +1 : -1; - } + /** + * Pads `string` on the right side if it's shorter than `length`. Padding + * characters are truncated if they exceed `length`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.padEnd('abc', 6); + * // => 'abc ' + * + * _.padEnd('abc', 6, '_-'); + * // => 'abc_-_' + * + * _.padEnd('abc', 3); + * // => 'abc' + */ - var SweepEvent = function SweepEvent (point, left, otherEvent, isSubject, edgeType) { - /** - * Is left endpoint? - * @type {Boolean} - */ - this.left = left; + function padEnd(string, length, chars) { + string = toString(string); + length = toInteger(length); + var strLength = length ? stringSize(string) : 0; + return length && strLength < length ? string + createPadding(length - strLength, chars) : string; + } + /** + * Pads `string` on the left side if it's shorter than `length`. Padding + * characters are truncated if they exceed `length`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.padStart('abc', 6); + * // => ' abc' + * + * _.padStart('abc', 6, '_-'); + * // => '_-_abc' + * + * _.padStart('abc', 3); + * // => 'abc' + */ - /** - * @type {Array.} - */ - this.point = point; - /** - * Other edge reference - * @type {SweepEvent} - */ - this.otherEvent = otherEvent; + function padStart(string, length, chars) { + string = toString(string); + length = toInteger(length); + var strLength = length ? stringSize(string) : 0; + return length && strLength < length ? createPadding(length - strLength, chars) + string : string; + } + /** + * Converts `string` to an integer of the specified radix. If `radix` is + * `undefined` or `0`, a `radix` of `10` is used unless `value` is a + * hexadecimal, in which case a `radix` of `16` is used. + * + * **Note:** This method aligns with the + * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category String + * @param {string} string The string to convert. + * @param {number} [radix=10] The radix to interpret `value` by. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {number} Returns the converted integer. + * @example + * + * _.parseInt('08'); + * // => 8 + * + * _.map(['6', '08', '10'], _.parseInt); + * // => [6, 8, 10] + */ - /** - * Belongs to source or clipping polygon - * @type {Boolean} - */ - this.isSubject = isSubject; - /** - * Edge contribution type - * @type {Number} - */ - this.type = edgeType || NORMAL; + function parseInt(string, radix, guard) { + if (guard || radix == null) { + radix = 0; + } else if (radix) { + radix = +radix; + } + + return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0); + } + /** + * Repeats the given string `n` times. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to repeat. + * @param {number} [n=1] The number of times to repeat the string. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {string} Returns the repeated string. + * @example + * + * _.repeat('*', 3); + * // => '***' + * + * _.repeat('abc', 2); + * // => 'abcabc' + * + * _.repeat('abc', 0); + * // => '' + */ - /** - * In-out transition for the sweepline crossing polygon - * @type {Boolean} - */ - this.inOut = false; + function repeat(string, n, guard) { + if (guard ? isIterateeCall(string, n, guard) : n === undefined$1) { + n = 1; + } else { + n = toInteger(n); + } + return baseRepeat(toString(string), n); + } + /** + * Replaces matches for `pattern` in `string` with `replacement`. + * + * **Note:** This method is based on + * [`String#replace`](https://mdn.io/String/replace). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to modify. + * @param {RegExp|string} pattern The pattern to replace. + * @param {Function|string} replacement The match replacement. + * @returns {string} Returns the modified string. + * @example + * + * _.replace('Hi Fred', 'Fred', 'Barney'); + * // => 'Hi Barney' + */ - /** - * @type {Boolean} - */ - this.otherInOut = false; - /** - * Previous event in result? - * @type {SweepEvent} - */ - this.prevInResult = null; + function replace() { + var args = arguments, + string = toString(args[0]); + return args.length < 3 ? string : string.replace(args[1], args[2]); + } + /** + * Converts `string` to + * [snake case](https://en.wikipedia.org/wiki/Snake_case). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the snake cased string. + * @example + * + * _.snakeCase('Foo Bar'); + * // => 'foo_bar' + * + * _.snakeCase('fooBar'); + * // => 'foo_bar' + * + * _.snakeCase('--FOO-BAR--'); + * // => 'foo_bar' + */ - /** - * Type of result transition (0 = not in result, +1 = out-in, -1, in-out) - * @type {Number} - */ - this.resultTransition = 0; - // connection step + var snakeCase = createCompounder(function (result, word, index) { + return result + (index ? '_' : '') + word.toLowerCase(); + }); + /** + * Splits `string` by `separator`. + * + * **Note:** This method is based on + * [`String#split`](https://mdn.io/String/split). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to split. + * @param {RegExp|string} separator The separator pattern to split by. + * @param {number} [limit] The length to truncate results to. + * @returns {Array} Returns the string segments. + * @example + * + * _.split('a-b-c', '-', 2); + * // => ['a', 'b'] + */ - /** - * @type {Number} - */ - this.otherPos = -1; + function split(string, separator, limit) { + if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) { + separator = limit = undefined$1; + } - /** - * @type {Number} - */ - this.outputContourId = -1; + limit = limit === undefined$1 ? MAX_ARRAY_LENGTH : limit >>> 0; - this.isExteriorRing = true; // TODO: Looks unused, remove? - }; + if (!limit) { + return []; + } - var prototypeAccessors$1 = { inResult: { configurable: true } }; + string = toString(string); + if (string && (typeof separator == 'string' || separator != null && !isRegExp(separator))) { + separator = baseToString(separator); - /** - * @param{Array.}p - * @return {Boolean} - */ - SweepEvent.prototype.isBelow = function isBelow (p) { - var p0 = this.point, p1 = this.otherEvent.point; - return this.left - ? (p0[0] - p[0]) * (p1[1] - p[1]) - (p1[0] - p[0]) * (p0[1] - p[1]) > 0 - // signedArea(this.point, this.otherEvent.point, p) > 0 : - : (p1[0] - p[0]) * (p0[1] - p[1]) - (p0[0] - p[0]) * (p1[1] - p[1]) > 0; - //signedArea(this.otherEvent.point, this.point, p) > 0; - }; + if (!separator && hasUnicode(string)) { + return castSlice(stringToArray(string), 0, limit); + } + } + return string.split(separator, limit); + } + /** + * Converts `string` to + * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage). + * + * @static + * @memberOf _ + * @since 3.1.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the start cased string. + * @example + * + * _.startCase('--foo-bar--'); + * // => 'Foo Bar' + * + * _.startCase('fooBar'); + * // => 'Foo Bar' + * + * _.startCase('__FOO_BAR__'); + * // => 'FOO BAR' + */ - /** - * @param{Array.}p - * @return {Boolean} - */ - SweepEvent.prototype.isAbove = function isAbove (p) { - return !this.isBelow(p); - }; + var startCase = createCompounder(function (result, word, index) { + return result + (index ? ' ' : '') + upperFirst(word); + }); + /** + * Checks if `string` starts with the given target string. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to inspect. + * @param {string} [target] The string to search for. + * @param {number} [position=0] The position to search from. + * @returns {boolean} Returns `true` if `string` starts with `target`, + * else `false`. + * @example + * + * _.startsWith('abc', 'a'); + * // => true + * + * _.startsWith('abc', 'b'); + * // => false + * + * _.startsWith('abc', 'b', 1); + * // => true + */ - /** - * @return {Boolean} - */ - SweepEvent.prototype.isVertical = function isVertical () { - return this.point[0] === this.otherEvent.point[0]; - }; + function startsWith(string, target, position) { + string = toString(string); + position = position == null ? 0 : baseClamp(toInteger(position), 0, string.length); + target = baseToString(target); + return string.slice(position, position + target.length) == target; + } + /** + * Creates a compiled template function that can interpolate data properties + * in "interpolate" delimiters, HTML-escape interpolated data properties in + * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data + * properties may be accessed as free variables in the template. If a setting + * object is given, it takes precedence over `_.templateSettings` values. + * + * **Note:** In the development build `_.template` utilizes + * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl) + * for easier debugging. + * + * For more information on precompiling templates see + * [lodash's custom builds documentation](https://lodash.com/custom-builds). + * + * For more information on Chrome extension sandboxes see + * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval). + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category String + * @param {string} [string=''] The template string. + * @param {Object} [options={}] The options object. + * @param {RegExp} [options.escape=_.templateSettings.escape] + * The HTML "escape" delimiter. + * @param {RegExp} [options.evaluate=_.templateSettings.evaluate] + * The "evaluate" delimiter. + * @param {Object} [options.imports=_.templateSettings.imports] + * An object to import into the template as free variables. + * @param {RegExp} [options.interpolate=_.templateSettings.interpolate] + * The "interpolate" delimiter. + * @param {string} [options.sourceURL='lodash.templateSources[n]'] + * The sourceURL of the compiled template. + * @param {string} [options.variable='obj'] + * The data object variable name. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the compiled template function. + * @example + * + * // Use the "interpolate" delimiter to create a compiled template. + * var compiled = _.template('hello <%= user %>!'); + * compiled({ 'user': 'fred' }); + * // => 'hello fred!' + * + * // Use the HTML "escape" delimiter to escape data property values. + * var compiled = _.template('<%- value %>'); + * compiled({ 'value': '