]> git.openstreetmap.org Git - rails.git/blobdiff - vendor/assets/iD/iD.js
Update to iD v2.18.4
[rails.git] / vendor / assets / iD / iD.js
index 337d13faeee6fac0b5b19e5de225941960f4696f..ba3246b5f48ac1bb3616031fa6be2bbb6407686c 100644 (file)
 
        var isImplemented = function () {
                var set, iterator, result;
-               if (typeof Set !== 'function') return false;
+               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;
+               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; }
 
                iterator = set.values();
                result = iterator.next();
-               if (result.done !== false) return false;
-               if (result.value !== 'raz') return false;
+               if (result.done !== false) { return false; }
+               if (result.value !== 'raz') { return false; }
 
                return true;
        };
@@ -50,7 +50,7 @@
        var isValue = function (val) { return val !== _undefined && val !== null; };
 
        var validValue = function (value) {
-               if (!isValue(value)) throw new TypeError("Cannot use null or undefined");
+               if (!isValue(value)) { throw new TypeError("Cannot use null or undefined"); }
                return value;
        };
 
@@ -61,7 +61,7 @@
 
        var isImplemented$1 = function () {
                var numberIsNaN = Number.isNaN;
-               if (typeof numberIsNaN !== "function") return false;
+               if (typeof numberIsNaN !== "function") { return false; }
                return !numberIsNaN({}) && numberIsNaN(NaN) && !numberIsNaN(34);
        };
 
 
        var isImplemented$2 = function () {
                var sign = Math.sign;
-               if (typeof sign !== "function") return false;
+               if (typeof sign !== "function") { return false; }
                return sign(10) === 1 && sign(-20) === -1;
        };
 
        var shim$1 = function (value) {
                value = Number(value);
-               if (isNaN(value) || value === 0) return value;
+               if (isNaN(value) || value === 0) { return value; }
                return value > 0 ? 1 : -1;
        };
 
@@ -90,9 +90,9 @@
          , floor = Math.floor;
 
        var toInteger = function (value) {
-               if (isNaN(value)) return 0;
+               if (isNaN(value)) { return 0; }
                value = Number(value);
-               if (value === 0 || !isFinite(value)) return value;
+               if (value === 0 || !isFinite(value)) { return value; }
                return sign(value) * floor(abs(value));
        };
 
 
        var eIndexOf = function (searchElement/*, fromIndex*/) {
                var i, length, fromIndex, val;
-               if (!isNan(searchElement)) return indexOf.apply(this, arguments);
+               if (!isNan(searchElement)) { return indexOf.apply(this, arguments); }
 
                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));
+               if (isNaN(fromIndex)) { fromIndex = 0; }
+               else if (fromIndex >= 0) { fromIndex = floor$1(fromIndex); }
+               else { fromIndex = toPosInteger(this.length) - floor$1(abs$1(fromIndex)); }
 
                for (i = fromIndex; i < length; ++i) {
                        if (objHasOwnProperty.call(this, i)) {
                                val = this[i];
-                               if (isNan(val)) return i; // Jslint: ignore
+                               if (isNan(val)) { return i; } // Jslint: ignore
                        }
                }
                return -1;
 
        var isImplemented$3 = function (/* CustomCreate*/) {
                var setPrototypeOf = Object.setPrototypeOf, customCreate = arguments[0] || create;
-               if (typeof setPrototypeOf !== "function") return false;
+               if (typeof setPrototypeOf !== "function") { return false; }
                return getPrototypeOf(setPrototypeOf(customCreate(null), plainObject)) === plainObject;
        };
 
 
        var create_1 = (function () {
                var nullObject, polyProps, desc;
-               if (!shim$2) return create$1;
-               if (shim$2.level !== 1) return create$1;
+               if (!shim$2) { return create$1; }
+               if (shim$2.level !== 1) { return create$1; }
 
                nullObject = {};
                polyProps = {};
 
        validate = function (obj, prototype) {
                validValue(obj);
-               if (prototype === null || isObject(prototype)) return obj;
+               if (prototype === null || isObject(prototype)) { return obj; }
                throw new TypeError("Prototype must be null or an object");
        };
 
        var shim$3 = (function (status) {
                var fn, set;
-               if (!status) return null;
+               if (!status) { return null; }
                if (status.level === 2) {
                        if (status.set) {
                                set = status.set;
                                var isNullBase;
                                validate(obj, prototype);
                                isNullBase = objIsPrototypeOf.call(self.nullPolyfill, obj);
-                               if (isNullBase) delete self.nullPolyfill.__proto__;
-                               if (prototype === null) prototype = self.nullPolyfill;
+                               if (isNullBase) { delete self.nullPolyfill.__proto__; }
+                               if (prototype === null) { prototype = self.nullPolyfill; }
                                obj.__proto__ = prototype;
-                               if (isNullBase) defineProperty(self.nullPolyfill, "__proto__", nullDesc);
+                               if (isNullBase) { defineProperty(self.nullPolyfill, "__proto__", nullDesc); }
                                return obj;
                        };
                }
                                        set = desc.set; // Opera crashes at this point
                                        set.call(tmpObj1, tmpObj2);
                                } catch (ignore) {}
-                               if (Object.getPrototypeOf(tmpObj1) === tmpObj2) return { set: set, level: 2 };
+                               if (Object.getPrototypeOf(tmpObj1) === tmpObj2) { return { set: set, level: 2 }; }
                        }
 
                        tmpObj1.__proto__ = tmpObj2;
-                       if (Object.getPrototypeOf(tmpObj1) === tmpObj2) return { level: 2 };
+                       if (Object.getPrototypeOf(tmpObj1) === tmpObj2) { return { level: 2 }; }
 
                        tmpObj1 = {};
                        tmpObj1.__proto__ = tmpObj2;
-                       if (Object.getPrototypeOf(tmpObj1) === tmpObj2) return { level: 1 };
+                       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");
+               if (typeof fn !== "function") { throw new TypeError(fn + " is not a function"); }
                return fn;
        };
 
        var possibleTypes = { "object": true, "function": true, "undefined": true /* document.all */ };
 
        var is$1 = function (value) {
-               if (!is(value)) return false;
+               if (!is(value)) { return false; }
                return hasOwnProperty.call(possibleTypes, typeof value);
        };
 
        var is$2 = function (value) {
-               if (!is$1(value)) return false;
+               if (!is$1(value)) { return false; }
                try {
-                       if (!value.constructor) return false;
+                       if (!value.constructor) { return false; }
                        return value.constructor.prototype === value;
                } catch (error) {
                        return false;
        };
 
        var is$3 = function (value) {
-               if (typeof value !== "function") return false;
+               if (typeof value !== "function") { return false; }
 
-               if (!hasOwnProperty.call(value, "length")) return false;
+               if (!hasOwnProperty.call(value, "length")) { return false; }
 
                try {
-                       if (typeof value.length !== "number") return false;
-                       if (typeof value.call !== "function") return false;
-                       if (typeof value.apply !== "function") return false;
+                       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;
                }
        var classRe = /^\s*class[\s{/}]/, functionToString = Function.prototype.toString;
 
        var is$4 = function (value) {
-               if (!is$3(value)) return false;
-               if (classRe.test(functionToString.call(value))) return false;
+               if (!is$3(value)) { return false; }
+               if (classRe.test(functionToString.call(value))) { return false; }
                return true;
        };
 
        var isImplemented$4 = function () {
                var assign = Object.assign, obj;
-               if (typeof assign !== "function") return false;
+               if (typeof assign !== "function") { return false; }
                obj = { foo: "raz" };
                assign(obj, { bar: "dwa" }, { trzy: "trzy" });
                return obj.foo + obj.bar + obj.trzy === "razdwatrzy";
        var max$1   = Math.max;
 
        var shim$5 = function (dest, src/*, …srcn*/) {
+               var arguments$1 = arguments;
+
                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;
+                               if (!error) { error = e; }
                        }
                };
                for (i = 1; i < length; ++i) {
-                       src = arguments[i];
+                       src = arguments$1[i];
                        keys$1(src).forEach(assign);
                }
-               if (error !== undefined) throw error;
+               if (error !== undefined) { throw error; }
                return dest;
        };
 
 
        var process$1 = function (src, obj) {
                var key;
-               for (key in src) obj[key] = src[key];
+               for (key in src) { obj[key] = src[key]; }
        };
 
        // 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;
+                       if (!isValue(options)) { return; }
                        process$1(Object(options), result);
                });
                return result;
        var str = "razdwatrzy";
 
        var isImplemented$6 = function () {
-               if (typeof str.contains !== "function") return false;
+               if (typeof str.contains !== "function") { return false; }
                return str.contains("dwa") === true && str.contains("foo") === false;
        };
 
                } 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];
+               if (!data[type]) { data[type] = listener; }
+               else if (typeof data[type] === 'object') { data[type].push(listener); }
+               else { data[type] = [data[type], listener]; }
 
                return this;
        };
 
                validCallable(listener);
 
-               if (!hasOwnProperty.call(this, '__ee__')) return this;
+               if (!hasOwnProperty.call(this, '__ee__')) { return this; }
                data = this.__ee__;
-               if (!data[type]) return this;
+               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);
+                                       if (listeners.length === 2) { data[type] = listeners[i ? 0 : 1]; }
+                                       else { listeners.splice(i, 1); }
                                }
                        }
                } else {
        };
 
        emit = function (type) {
+               var arguments$1 = arguments;
+
                var i, l, listener, listeners, args;
 
-               if (!hasOwnProperty.call(this, '__ee__')) return;
+               if (!hasOwnProperty.call(this, '__ee__')) { return; }
                listeners = this.__ee__[type];
-               if (!listeners) return;
+               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[i];
+                       for (i = 1; i < l; ++i) { args[i - 1] = arguments$1[i]; }
 
                        listeners = listeners.slice();
                        for (i = 0; (listener = listeners[i]); ++i) {
                                l = arguments.length;
                                args = new Array(l - 1);
                                for (i = 1; i < l; ++i) {
-                                       args[i - 1] = arguments[i];
+                                       args[i - 1] = arguments$1[i];
                                }
                                apply.call(listeners, this, args);
                        }
 
        var isImplemented$7 = function () {
                var symbol;
-               if (typeof Symbol !== 'function') return false;
+               if (typeof Symbol !== 'function') { return false; }
                symbol = Symbol('test symbol');
                try { String(symbol); } catch (e) { return false; }
 
                // 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;
+               if (!validTypes[typeof Symbol.iterator]) { return false; }
+               if (!validTypes[typeof Symbol.toPrimitive]) { return false; }
+               if (!validTypes[typeof Symbol.toStringTag]) { return false; }
 
                return true;
        };
 
        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;
+               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 validateSymbol = function (value) {
-               if (!isSymbol(value)) throw new TypeError(value + " is not a symbol");
+               if (!isSymbol(value)) { throw new TypeError(value + " is not a symbol"); }
                return value;
        };
 
                var created = create$3(null);
                return function (desc) {
                        var postfix = 0, name, ie11BugWorkaround;
-                       while (created[desc + (postfix || '')]) ++postfix;
+                       while (created[desc + (postfix || '')]) { ++postfix; }
                        desc += (postfix || '');
                        created[desc] = true;
                        name = '@@' + desc;
                                // 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;
+                               if (ie11BugWorkaround) { return; }
                                ie11BugWorkaround = true;
                                defineProperty$1(this, name, d_1(value));
                                ie11BugWorkaround = false;
        // 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');
+               if (this instanceof HiddenSymbol) { throw new TypeError('Symbol is not a constructor'); }
                return SymbolPolyfill(description);
        };
 
        // (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);
+               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, {
        };
        defineProperties(SymbolPolyfill, {
                for: d_1(function (key) {
-                       if (globalSymbols[key]) return globalSymbols[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;
+                       for (key in globalSymbols) { if (globalSymbols[key] === s) { return key; } }
                }),
 
                // To ensure proper interoperability with other native functions (e.g. Array.from)
        });
        defineProperty$1(SymbolPolyfill.prototype, SymbolPolyfill.toPrimitive, d_1('', function () {
                var symbol = validateSymbol(this);
-               if (typeof symbol === 'symbol') return symbol;
+               if (typeof symbol === 'symbol') { return symbol; }
                return symbol.toString();
        }));
        defineProperty$1(SymbolPolyfill.prototype, SymbolPolyfill.toStringTag, d_1('c', 'Symbol'));
        };
 
        var isImplemented$8 = function () {
-               if (typeof globalThis !== "object") return false;
-               if (!globalThis) return false;
+               if (typeof globalThis !== "object") { return false; }
+               if (!globalThis) { return false; }
                return globalThis.Array === Array;
        };
 
        var naiveFallback = function () {
-               if (typeof self === "object" && self) return self;
-               if (typeof window === "object" && window) return window;
+               if (typeof self === "object" && self) { return self; }
+               if (typeof window === "object" && window) { return window; }
                throw new Error("Unable to resolve global `this`");
        };
 
        var implementation = (function () {
-               if (this) return this;
+               if (this) { return this; }
 
                // Unexpected strict mode (may happen if e.g. bundled into ESM module)
 
                }
                try {
                        // Safari case (window.__global__ is resolved with global context, but __global__ does not)
-                       if (!__global__) return naiveFallback();
+                       if (!__global__) { return naiveFallback(); }
                        return __global__;
                } finally {
                        delete Object.prototype.__global__;
        var isImplemented$9 = function () {
                var Symbol = globalThis_1.Symbol;
                var symbol;
-               if (typeof Symbol !== "function") return false;
+               if (typeof Symbol !== "function") { return false; }
                symbol = Symbol("test symbol");
                try { String(symbol); }
                catch (e) { return false; }
 
                // 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;
+               if (!validTypes$1[typeof Symbol.iterator]) { return false; }
+               if (!validTypes$1[typeof Symbol.toPrimitive]) { return false; }
+               if (!validTypes$1[typeof Symbol.toStringTag]) { return false; }
 
                return true;
        };
 
        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;
+               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 validateSymbol$1 = function (value) {
-               if (!isSymbol$1(value)) throw new TypeError(value + " is not a symbol");
+               if (!isSymbol$1(value)) { throw new TypeError(value + " is not a symbol"); }
                return value;
        };
 
        var created = create$4(null);
        var generateName$1 = function (desc) {
                var postfix = 0, name, ie11BugWorkaround;
-               while (created[desc + (postfix || "")]) ++postfix;
+               while (created[desc + (postfix || "")]) { ++postfix; }
                desc += postfix || "";
                created[desc] = true;
                name = "@@" + desc;
                                // 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;
+                               if (ie11BugWorkaround) { return; }
                                ie11BugWorkaround = true;
                                defineProperty$2(this, name, d_1(value));
                                ie11BugWorkaround = false;
        var symbolRegistry = function (SymbolPolyfill) {
                return Object.defineProperties(SymbolPolyfill, {
                        for: d_1(function (key) {
-                               if (registry[key]) return registry[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;
+                                       if (registry[key] === symbol) { return key; }
                                }
                                return undefined;
                        })
        // 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");
+               if (this instanceof HiddenSymbol$1) { throw new TypeError("Symbol is not a constructor"); }
                return SymbolPolyfill$1(description);
        };
 
        // (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);
+               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, {
                SymbolPolyfill$1.toPrimitive,
                d_1("", function () {
                        var symbol = validateSymbol$1(this);
-                       if (typeof symbol === "symbol") return symbol;
+                       if (typeof symbol === "symbol") { return symbol; }
                        return symbol.toString();
                })
        );
          , 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;
+               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";
        };
 
        var validIterable = function (value) {
-               if (!isIterable(value)) throw new TypeError(value + " is not iterable");
+               if (!isIterable(value)) { throw new TypeError(value + " is not iterable"); }
                return value;
        };
 
        var objectToString = Object.prototype.toString;
 
        var coerce = function (value) {
-               if (!is(value)) return null;
+               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;
+                       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
                }
 
        var toShortString = function (value) {
                var string = safeToString(value);
-               if (string === null) return "<Non-coercible to string value>";
+               if (string === null) { return "<Non-coercible to string value>"; }
                // Trim if too long
-               if (string.length > 100) string = string.slice(0, 99) + "…";
+               if (string.length > 100) { string = string.slice(0, 99) + "…"; }
                // Replace eventual new lines
                string = string.replace(reNewLine, function (char) {
                        switch (char) {
        };
 
        var resolveException = function (value, defaultMessage, inputOptions) {
-               if (!is$1(inputOptions)) throw new TypeError(resolveMessage(defaultMessage, value));
+               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;
+                       if ("default" in inputOptions) { return inputOptions["default"]; }
+                       if (inputOptions.isOptional) { return null; }
                }
                var errorMessage = coerce(inputOptions.errorMessage);
-               if (!is(errorMessage)) errorMessage = defaultMessage;
+               if (!is(errorMessage)) { errorMessage = defaultMessage; }
                throw new TypeError(resolveMessage(errorMessage, value));
        };
 
        var ensure = function (value/*, options*/) {
-               if (is(value)) return value;
+               if (is(value)) { return value; }
                return resolveException(value, "Cannot use %v", arguments[1]);
        };
 
        var ensure$1 = function (value/*, options*/) {
-               if (is$4(value)) return value;
+               if (is$4(value)) { return value; }
                return resolveException(value, "%v is not a plain function", arguments[1]);
        };
 
        var isImplemented$a = function () {
                var from = Array.from, arr, result;
-               if (typeof from !== "function") return false;
+               if (typeof from !== "function") { return false; }
                arr = ["raz", "dwa"];
                result = from(arr);
                return Boolean(result && result !== arr && result[1] === "dwa");
 
                arrayLike = Object(validValue(arrayLike));
 
-               if (isValue(mapFn)) validCallable(mapFn);
+               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);
+                                       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];
+                                       for (i = 0; i < length; ++i) { arr[i] = arrayLike[i]; }
                                        return arr;
                                }
                        }
                        if ((getIterator = arrayLike[iteratorSymbol$1]) !== undefined) {
                                // Source: Iterator
                                iterator = validCallable(getIterator).call(arrayLike);
-                               if (Context) arr = new Context();
+                               if (Context) { arr = new Context(); }
                                result = iterator.next();
                                i = 0;
                                while (!result.done) {
                        } else if (isString(arrayLike)) {
                                // Source: String
                                length = arrayLike.length;
-                               if (Context) arr = new Context();
+                               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];
+                                               if (code >= 0xd800 && code <= 0xdbff) { value += arrayLike[++i]; }
                                        }
                                        value = mapFn ? call.call(mapFn, thisArg, value, j) : value;
                                        if (Context) {
                if (length === undefined) {
                        // Source: array or array-like
                        length = toPosInteger(arrayLike.length);
-                       if (Context) arr = new Context(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) {
 
        var copy = function (obj/*, propertyNames, options*/) {
                var copy = Object(validValue(obj)), propertyNames = arguments[1], options = Object(arguments[2]);
-               if (copy !== obj && !propertyNames) return copy;
+               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];
+                               if (options.ensure || propertyName in obj) { result[propertyName] = obj[propertyName]; }
                        });
                } else {
                        assign(result, obj);
                        if (compareFn) {
                                list.sort(typeof compareFn === "function" ? bind.call(compareFn, obj) : undefined);
                        }
-                       if (typeof method !== "function") method = list[method];
+                       if (typeof method !== "function") { method = list[method]; }
                        return call$1.call(method, list, function (key, index) {
-                               if (!objPropertyIsEnumerable.call(obj, key)) return defVal;
+                               if (!objPropertyIsEnumerable.call(obj, key)) { return defVal; }
                                return call$1.call(cb, thisArg, obj[key], key, obj, index);
                        });
                };
                delete dgs.writable;
                delete dgs.value;
                dgs.get = function () {
-                       if (!options.overwriteDefinition && hasOwnProperty$1.call(this, name)) return value;
+                       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];
 
        var autoBind = function (props/*, options*/) {
                var options = normalizeOptions(arguments[1]);
-               if (is(options.resolveContext)) ensure$1(options.resolveContext);
+               if (is(options.resolveContext)) { ensure$1(options.resolveContext); }
                return map$1(props, function (desc, name) { return define(name, desc, options); });
        };
 
        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'");
+               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;
+               if (!context) { return; }
                validCallable(context.on);
                context.on("_add", this._onAdd);
                context.on("_delete", this._onDelete);
                        {
                                _next: d_1(function () {
                                        var i;
-                                       if (!this.__list__) return undefined;
+                                       if (!this.__list__) { return undefined; }
                                        if (this.__redo__) {
                                                i = this.__redo__.shift();
-                                               if (i !== undefined) return i;
+                                               if (i !== undefined) { return i; }
                                        }
-                                       if (this.__nextIndex__ < this.__list__.length) return this.__nextIndex__++;
+                                       if (this.__nextIndex__ < this.__list__.length) { return this.__nextIndex__++; }
                                        this._unBind();
                                        return undefined;
                                }),
                                        return this._createResult(this._next());
                                }),
                                _createResult: d_1(function (i) {
-                                       if (i === undefined) return { done: true, value: undefined };
+                                       if (i === undefined) { return { done: true, value: undefined }; }
                                        return { done: false, value: this._resolve(i) };
                                }),
                                _resolve: d_1(function (i) {
                                _unBind: d_1(function () {
                                        this.__list__ = null;
                                        delete this.__redo__;
-                                       if (!this.__context__) return;
+                                       if (!this.__context__) { return; }
                                        this.__context__.off("_add", this._onAdd);
                                        this.__context__.off("_delete", this._onDelete);
                                        this.__context__.off("_clear", this._onClear);
                        },
                        autoBind({
                                _onAdd: d_1(function (index) {
-                                       if (index >= this.__nextIndex__) return;
+                                       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;
+                                               if (redo >= index) { this.__redo__[i] = ++redo; }
                                        }, this);
                                        this.__redo__.push(index);
                                }),
                                _onDelete: d_1(function (index) {
                                        var i;
-                                       if (index >= this.__nextIndex__) return;
+                                       if (index >= this.__nextIndex__) { return; }
                                        --this.__nextIndex__;
-                                       if (!this.__redo__) return;
+                                       if (!this.__redo__) { return; }
                                        i = this.__redo__.indexOf(index);
-                                       if (i !== -1) this.__redo__.splice(i, 1);
+                                       if (i !== -1) { this.__redo__.splice(i, 1); }
                                        this.__redo__.forEach(function (redo, j) {
-                                               if (redo > index) this.__redo__[j] = --redo;
+                                               if (redo > index) { this.__redo__[j] = --redo; }
                                        }, this);
                                }),
                                _onClear: d_1(function () {
-                                       if (this.__redo__) clear.call(this.__redo__);
+                                       if (this.__redo__) { clear.call(this.__redo__); }
                                        this.__nextIndex__ = 0;
                                })
                        })
        var defineProperty = Object.defineProperty, ArrayIterator;
 
        ArrayIterator = module.exports = function (arr, kind) {
-               if (!(this instanceof ArrayIterator)) throw new TypeError("Constructor requires 'new'");
+               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";
+               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));
        };
-       if (setPrototypeOf) setPrototypeOf(ArrayIterator, es6Iterator);
+       if (setPrototypeOf) { setPrototypeOf(ArrayIterator, es6Iterator); }
 
        // Internal %ArrayIteratorPrototype% doesn't expose its constructor
        delete ArrayIterator.prototype.constructor;
 
        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]];
+                       if (this.__kind__ === "value") { return this.__list__[i]; }
+                       if (this.__kind__ === "key+value") { return [i, this.__list__[i]]; }
                        return i;
                })
        });
        var defineProperty = Object.defineProperty, StringIterator;
 
        StringIterator = module.exports = function (str) {
-               if (!(this instanceof StringIterator)) throw new TypeError("Constructor requires 'new'");
+               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);
+       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__++;
+                       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;
+                       if (this.__nextIndex__ === this.__length__) { return char; }
                        code = char.charCodeAt(0);
-                       if (code >= 0xd800 && code <= 0xdbff) return char + this.__list__[this.__nextIndex__++];
+                       if (code >= 0xd800 && code <= 0xdbff) { return char + this.__list__[this.__nextIndex__++]; }
                        return char;
                })
        });
        var iteratorSymbol$2 = es6Symbol$1.iterator;
 
        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);
+               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);
        };
 
 
        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);
+               if (isArray$2(iterable) || isArguments(iterable)) { mode = "array"; }
+               else if (isString(iterable)) { mode = "string"; }
+               else { iterable = get(iterable); }
 
                validCallable(cb);
                doBreak = function () {
                                char = iterable[i];
                                if (i + 1 < length) {
                                        code = char.charCodeAt(0);
-                                       if (code >= 0xd800 && code <= 0xdbff) char += iterable[++i];
+                                       if (code >= 0xd800 && code <= 0xdbff) { char += iterable[++i]; }
                                }
                                call$3.call(cb, thisArg, char, doBreak);
-                               if (broken) break;
+                               if (broken) { break; }
                        }
                        return;
                }
 
                while (!result.done) {
                        call$3.call(cb, thisArg, result.value, doBreak);
-                       if (broken) return;
+                       if (broken) { return; }
                        result = iterable.next();
                }
        };
          , SetIterator;
 
        SetIterator = module.exports = function (set, kind) {
-               if (!(this instanceof SetIterator)) return new SetIterator(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';
+               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);
+       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];
+                       if (this.__kind__ === 'value') { return this.__list__[i]; }
                        return [this.__list__[i], this.__list__[i]];
                }),
                toString: d_1(function () { return '[object Set Iterator]'; })
        // Exports true if environment provides native `Set` implementation,
 
        var isNativeImplemented = (function () {
-               if (typeof Set === 'undefined') return false;
+               if (typeof Set === 'undefined') { return false; }
                return (Object.prototype.toString.call(Set.prototype) === '[object Set]');
        }());
 
          , defineProperty$7 = Object.defineProperty, getPrototypeOf$1 = Object.getPrototypeOf
          , SetPoly, getValues, NativeSet;
 
-       if (isNativeImplemented) NativeSet = Set;
+       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);
+               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;
+               if (!iterable) { return self; }
                forOf(iterable, function (value) {
-                       if (eIndexOf.call(this, value) !== -1) return;
+                       if (eIndexOf.call(this, value) !== -1) { return; }
                        this.push(value);
                }, self.__setData__);
                return self;
        };
 
        if (isNativeImplemented) {
-               if (setPrototypeOf) setPrototypeOf(SetPoly, NativeSet);
+               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;
+                       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;
+                       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;
+                       if (index === -1) { return false; }
                        this.__setData__.splice(index, 1);
                        this.emit('_delete', index, value);
                        return true;
 
        var isImplemented$b = function () {
                var map, iterator, result;
-               if (typeof Map !== 'function') return false;
+               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;
+               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;
+               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;
        };
          , MapIterator;
 
        MapIterator = module.exports = function (map, kind) {
-               if (!(this instanceof MapIterator)) return new MapIterator(map, kind);
+               if (!(this instanceof MapIterator)) { return new MapIterator(map, kind); }
                es6Iterator.call(this, map.__mapKeysData__, map);
-               if (!kind || !iteratorKinds[kind]) kind = 'key+value';
+               if (!kind || !iteratorKinds[kind]) { kind = 'key+value'; }
                defineProperties(this, {
                        __kind__: d_1('', kind),
                        __values__: d_1('w', map.__mapValuesData__)
                });
        };
-       if (setPrototypeOf) setPrototypeOf(MapIterator, es6Iterator);
+       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];
+                       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 () {
        // Exports true if environment provides native `Map` implementation,
 
        var isNativeImplemented$1 = (function () {
-               if (typeof Map === 'undefined') return false;
+               if (typeof Map === 'undefined') { return false; }
                return (Object.prototype.toString.call(new Map()) === '[object Map]');
        }());
 
 
        var polyfill$3 = MapPoly = function (/*iterable*/) {
                var iterable = arguments[0], keys, values, self;
-               if (!(this instanceof MapPoly)) throw new TypeError('Constructor requires \'new\'');
+               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);
+               if (iterable != null) { iterator$3(iterable); }
                defineProperties$3(self, {
                        __mapKeysData__: d_1('c', keys = []),
                        __mapValuesData__: d_1('c', values = [])
                });
-               if (!iterable) return self;
+               if (!iterable) { return self; }
                forOf(iterable, function (value) {
                        var key = validValue(value)[0];
                        value = value[1];
-                       if (eIndexOf.call(keys, key) !== -1) return;
+                       if (eIndexOf.call(keys, key) !== -1) { return; }
                        keys.push(key);
                        values.push(value);
                }, self);
        };
 
        if (isNativeImplemented$1) {
-               if (setPrototypeOf) setPrototypeOf(MapPoly, Map);
+               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;
+                       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;
+                       if (index === -1) { return false; }
                        this.__mapKeysData__.splice(index, 1);
                        this.__mapValuesData__.splice(index, 1);
                        this.emit('_delete', index, key);
                }),
                get: d_1(function (key) {
                        var index = eIndexOf.call(this.__mapKeysData__, key);
-                       if (index === -1) return;
+                       if (index === -1) { return; }
                        return this.__mapValuesData__[index];
                }),
                has: d_1(function (key) {
                                emit = true;
                        }
                        this.__mapValuesData__[index] = value;
-                       if (emit) this.emit('_add', index, key);
+                       if (emit) { this.emit('_add', index, key); }
                        return this;
                }),
                size: d_1.gs(function () { return this.__mapKeysData__.length; }),
                                                        return true;
                                                }
                                        }
-                               } catch (e) {
+                               } catch (e$1) {
                                        return true;
                                }
                        }
              return String(obj);
            }
 
-           if (!opts) opts = {};
+           if (!opts) { opts = {}; }
 
            var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth;
-           if (typeof depth === 'undefined') depth = 0;
+           if (typeof depth === 'undefined') { depth = 0; }
            if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') {
                return '[Object]';
            }
 
-           if (typeof seen === 'undefined') seen = [];
+           if (typeof seen === 'undefined') { seen = []; }
            else if (indexOf$2(seen, obj) >= 0) {
                return '[Circular]';
            }
                    s += ' ' + attrs[i].name + '="' + quote(attrs[i].value) + '"';
                }
                s += '>';
-               if (obj.childNodes && obj.childNodes.length) s += '...';
+               if (obj.childNodes && obj.childNodes.length) { s += '...'; }
                s += '</' + String(obj.nodeName).toLowerCase() + '>';
                return s;
            }
            if (isArray$3(obj)) {
-               if (obj.length === 0) return '[]';
+               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) + ']';
+               if (parts.length === 0) { return '[' + String(obj) + ']'; }
                return '{ [' + String(obj) + '] ' + parts.join(', ') + ' }';
            }
            if (typeof obj === 'object' && typeof obj.inspect === 'function') {
            }
            if (!isDate(obj) && !isRegExp(obj)) {
                var xs = arrObjKeys(obj, inspect);
-               if (xs.length === 0) return '{}';
+               if (xs.length === 0) { return '{}'; }
                return '{ ' + xs.join(', ') + ' }';
            }
            return String(obj);
        }
 
        function nameOf (f) {
-           if (f.name) return f.name;
+           if (f.name) { return f.name; }
            var m = String(f).match(/^function\s*([\w$]+)/);
-           if (m) return m[1];
+           if (m) { return m[1]; }
        }
 
        function indexOf$2 (xs, x) {
-           if (xs.indexOf) return xs.indexOf(x);
+           if (xs.indexOf) { return xs.indexOf(x); }
            for (var i = 0, l = xs.length; i < l; i++) {
-               if (xs[i] === x) return i;
+               if (xs[i] === x) { return i; }
            }
            return -1;
        }
        }
 
        function isElement (x) {
-           if (!x || typeof x !== 'object') return false;
+           if (!x || typeof x !== 'object') { return false; }
            if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) {
                return true;
            }
        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;
+           if (x) { return '\\' + x; }
            return '\\x' + (n < 0x10 ? '0' : '') + n.toString(16);
        }
 
                }
            }
            for (var key in obj) {
-               if (!has$1(obj, key)) continue;
-               if (isArr && String(Number(key)) === key && key < obj.length) continue;
+               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 {
                                }
                        }
                        return x instanceof $Map; // core-js workaround, pre-v2.5.0
-               } catch (e) {}
+               } catch (e$1) {}
                return false;
        };
 
                                }
                        }
                        return x instanceof $Set$1; // core-js workaround, pre-v2.5.0
-               } catch (e) {}
+               } catch (e$1) {}
                return false;
        };
 
        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[s]);
+                       source = toObject(arguments$1[s]);
                        props = objectKeys(source);
                        var getSymbols = hasSymbols$5 && (Object.getOwnPropertySymbols || originalGetSymbols);
                        if (getSymbols) {
         */
        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');
+           { 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} */
          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.');
+             { throw new TypeError('A promise cannot be resolved with itself.'); }
            if (
              newValue &&
              (typeof newValue === 'object' || typeof newValue === 'function')
          try {
            fn(
              function(value) {
-               if (done) return;
+               if (done) { return; }
                done = true;
                resolve(self, value);
              },
              function(reason) {
-               if (done) return;
+               if (done) { return; }
                done = true;
                reject(self, reason);
              }
            );
          } catch (ex) {
-           if (done) return;
+           if (done) { return; }
            done = true;
            reject(self, ex);
          }
            }
 
            var args = Array.prototype.slice.call(arr);
-           if (args.length === 0) return resolve([]);
+           if (args.length === 0) { return resolve([]); }
            var remaining = args.length;
 
            function res(i, val) {
        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 result = '';
                while (++index < length) {
-                       var codePoint = ToNumber$1(arguments[index]);
+                       var codePoint = ToNumber$1(arguments$1[index]);
                        if (
                                !IsInteger(codePoint) ||
                                codePoint < 0 || codePoint > 0x10FFFF // not a valid Unicode code point
              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;
          }
 
                configurable: true
              }
            });
-           if (superClass) _setPrototypeOf(subClass, superClass);
+           if (superClass) { _setPrototypeOf(subClass, superClass); }
          }
 
          function _getPrototypeOf(o) {
          function _superPropBase(object, property) {
            while (!Object.prototype.hasOwnProperty.call(object, property)) {
              object = _getPrototypeOf(object);
-             if (object === null) break;
+             if (object === null) { break; }
            }
 
            return object;
              _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) {
 
 
            function reverseValue(key, value, includeAbsolute) {
-               if (ignoreKey.test(key)) return value;
+               if (ignoreKey.test(key)) { return value; }
 
                // Turn lanes are left/right to key (not way) direction - #5674
                if (turn_lanes.test(key)) {
                    return onewayReplacements[value] || value;
 
                } else if (includeAbsolute && directionKey.test(key)) {
-                   if (compassReplacements[value]) return compassReplacements[value];
+                   if (compassReplacements[value]) { return compassReplacements[value]; }
 
                    var degrees = parseFloat(value);
                    if (typeof degrees === 'number' && !isNaN(degrees)) {
            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;
+                   if (!node || !Object.keys(node.tags).length) { continue; }
 
                    var tags = {};
                    for (var key in node.tags) {
 
            action.disabled = function(graph) {
                var entity = graph.hasEntity(entityID);
-               if (!entity || entity.type === 'way') return false;
+               if (!entity || entity.type === 'way') { return false; }
 
                for (var key in entity.tags) {
                    var value = entity.tags[key];
 
        // 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;
+           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
                    geometries.vertex = true;
                }
                // break early if both are already supported
-               if (geometries.point && geometries.vertex) break;
+               if (geometries.point && geometries.vertex) { break; }
            }
            return geometries;
        }
          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;
+           if (this.s) { this.t += temp.t; }
+           else { this.s = temp.t; }
          },
          valueOf: function() {
            return this.s;
          },
          FeatureCollection: function(object, stream) {
            var features = object.features, i = -1, n = features.length;
-           while (++i < n) streamGeometry(features[i].geometry, stream);
+           while (++i < n) { streamGeometry(features[i].geometry, stream); }
          }
        };
 
          },
          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]);
+           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);
+           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);
+           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);
+           while (++i < n) { streamGeometry(geometries[i], stream); }
          }
        };
 
        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]);
+         while (++i < n) { coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]); }
          stream.lineEnd();
        }
 
        function streamPolygon(coordinates, stream) {
          var i = -1, n = coordinates.length;
          stream.polygonStart();
-         while (++i < n) streamLine(coordinates[i], stream, 1);
+         while (++i < n) { streamLine(coordinates[i], stream, 1); }
          stream.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;
+           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() {
 
        function boundsPoint(lambda, phi) {
          ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
-         if (phi < phi0) phi0 = phi;
-         if (phi > phi1) phi1 = phi;
+         if (phi < phi0) { phi0 = phi; }
+         if (phi > phi1) { phi1 = phi; }
        }
 
        function linePoint(lambda, phi) {
                antimeridian = abs$2(delta) > 180;
            if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {
              phii = inflection[1] * degrees;
-             if (phii > phi1) phi1 = phii;
+             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;
+             if (phii < phi0) { phi0 = phii; }
            } else {
-             if (phi < phi0) phi0 = phi;
-             if (phi > phi1) phi1 = phi;
+             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;
+               if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) { lambda1 = lambda; }
              } else {
-               if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
+               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;
+               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;
+                 if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) { lambda1 = lambda; }
                } else {
-                 if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
+                 if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) { lambda0$1 = lambda; }
                }
              }
            }
          } else {
            ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
          }
-         if (phi < phi0) phi0 = phi;
-         if (phi > phi1) phi1 = phi;
+         if (phi < phi0) { phi0 = phi; }
+         if (phi > phi1) { phi1 = phi; }
          p0 = p, lambda2 = lambda;
        }
 
        function boundsRingEnd() {
          boundsRingPoint(lambda00$1, phi00$1);
          areaStream.lineEnd();
-         if (abs$2(deltaSum) > epsilon) lambda0$1 = -(lambda1 = 180);
+         if (abs$2(deltaSum) > epsilon) { lambda0$1 = -(lambda1 = 180); }
          range[0] = lambda0$1, range[1] = lambda1;
          p0 = null;
        }
            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];
+               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);
              }
            // 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];
+             if ((delta = angle(a[1], b[0])) > deltaMax) { deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1]; }
            }
          }
 
          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;
+           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];
+           if (m < epsilon2) { return [NaN, NaN]; }
          }
 
          return [atan2(y, x) * degrees, asin(z / sqrt(m)) * degrees];
            return x = a(x, y), b(x[0], x[1]);
          }
 
-         if (a.invert && b.invert) compose.invert = function(x, 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;
        }
 
        // Generates a circle centered at [0°, 0°], with a given radius and precision.
        function circleStream(stream, radius, delta, direction, t0, t1) {
-         if (!delta) return;
+         if (!delta) { return; }
          var cosRadius = cos(radius),
              sinRadius = sin(radius),
              step = direction * delta;
          } else {
            t0 = circleRadius(cosRadius, t0);
            t1 = circleRadius(cosRadius, t1);
-           if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau;
+           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)]);
            },
            lineEnd: noop$2,
            rejoin: function() {
-             if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
+             if (lines.length > 1) { lines.push(lines.pop().concat(lines.shift())); }
            },
            result: function() {
              var result = lines;
              n;
 
          segments.forEach(function(segment) {
-           if ((n = segment.length - 1) <= 0) return;
+           if ((n = segment.length - 1) <= 0) { return; }
            var n, p0 = segment[0], p1 = segment[n], x;
 
            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]);
+               for (i = 0; i < n; ++i) { stream.point((p0 = segment[i])[0], p0[1]); }
                stream.lineEnd();
                return;
              }
            clip.push(x.o = new Intersection(p1, null, x, true));
          });
 
-         if (!subject.length) return;
+         if (!subject.length) { return; }
 
          clip.sort(compareIntersection);
          link(subject);
            // Find first unvisited intersection.
            var current = start,
                isSubject = true;
-           while (current.v) if ((current = current.n) === start) return;
+           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]);
+                 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);
                }
              } else {
                if (isSubject) {
                  points = current.p.z;
-                 for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);
+                 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);
                }
        }
 
        function link(array) {
-         if (!(n = array.length)) return;
+         if (!(n = array.length)) { return; }
          var n,
              i = 0,
              a = array[0],
 
        function longitude(point) {
          if (abs$2(point[0]) <= pi)
-           return point[0];
+           { return point[0]; }
          else
-           return sign$2(point[0]) * ((abs$2(point[0]) + pi) % tau - pi);
+           { return sign$2(point[0]) * ((abs$2(point[0]) + pi) % tau - pi); }
        }
 
        function polygonContains(polygon, point) {
 
          sum.reset();
 
-         if (sinPhi === 1) phi = halfPi + epsilon;
-         else if (sinPhi === -1) phi = -halfPi - epsilon;
+         if (sinPhi === 1) { phi = halfPi + epsilon; }
+         else if (sinPhi === -1) { phi = -halfPi - epsilon; }
 
          for (var i = 0, n = polygon.length; i < n; ++i) {
-           if (!(m = (ring = polygon[i]).length)) continue;
+           if (!(m = (ring = polygon[i]).length)) { continue; }
            var ring,
                m,
                point0 = ring[m - 1],
        }
 
        function d3_bisector(compare) {
-         if (compare.length === 1) compare = ascendingComparator(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;
+             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;
+               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;
+             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;
+               if (compare(a[mid], x) > 0) { hi = mid; }
+               else { lo = mid + 1; }
              }
              return lo;
            }
              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;
+           while (++i < n) { ticks[i] = (start + 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;
+           while (++i < n) { ticks[i] = (start - i) / step; }
          }
 
-         if (reverse) ticks.reverse();
+         if (reverse) { ticks.reverse(); }
 
          return ticks;
        }
          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);
+         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),
              merged,
              array;
 
-         while (++i < n) j += arrays[i].length;
+         while (++i < n) { j += arrays[i].length; }
          merged = new Array(j);
 
          while (--n >= 0) {
                segments = merge(segments);
                var startInside = polygonContains(polygon, start);
                if (segments.length) {
-                 if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
+                 if (!polygonStarted) { sink.polygonStart(), polygonStarted = true; }
                  clipRejoin(segments, compareIntersection, startInside, interpolate, sink);
                } else if (startInside) {
-                 if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
+                 if (!polygonStarted) { sink.polygonStart(), polygonStarted = true; }
                  sink.lineStart();
                  interpolate(null, null, 1, sink);
                  sink.lineEnd();
                }
-               if (polygonStarted) sink.polygonEnd(), polygonStarted = false;
+               if (polygonStarted) { sink.polygonEnd(), polygonStarted = false; }
                segments = polygon = null;
              },
              sphere: function() {
            };
 
            function point(lambda, phi) {
-             if (pointVisible(lambda, phi)) sink.point(lambda, phi);
+             if (pointVisible(lambda, phi)) { sink.point(lambda, phi); }
            }
 
            function pointLine(lambda, phi) {
              polygon.push(ring);
              ring = null;
 
-             if (!n) return;
+             if (!n) { return; }
 
              // No intersections.
              if (clean & 1) {
                segment = ringSegments[0];
                if ((m = segment.length - 1) > 0) {
-                 if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
+                 if (!polygonStarted) { sink.polygonStart(), polygonStarted = true; }
                  sink.lineStart();
-                 for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);
+                 for (i = 0; i < m; ++i) { sink.point((point = segment[i])[0], point[1]); }
                  sink.lineEnd();
                }
                return;
 
              // Rejoin connected segments.
              // TODO reuse ringBuffer.rejoin()?
-             if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
+             if (n > 1 && clean & 2) { ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); }
 
              segments.push(ringSegments.filter(validSegment));
            }
                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;
+               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();
                    c = smallRadius
                      ? v ? 0 : code(lambda, phi)
                      : v ? code(lambda + (lambda < 0 ? pi : -pi), phi) : 0;
-               if (!point0 && (v00 = v0 = v)) stream.lineStart();
+               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;
+                   { point1[2] = 1; }
                }
                if (v !== v0) {
                  clean = 0;
                point0 = point1, v0 = v, c0 = c;
              },
              lineEnd: function() {
-               if (v0) stream.lineEnd();
+               if (v0) { stream.lineEnd(); }
                point0 = null;
              },
              // Rejoin first and last segments if there were intersections and the first
                determinant = n2n2 - n1n2 * n1n2;
 
            // Two polar points.
-           if (!determinant) return !two && a;
+           if (!determinant) { return !two && a; }
 
            var c1 =  cr * n2n2 / determinant,
                c2 = -cr * n1n2 / determinant,
                uu = cartesianDot(u, u),
                t2 = w * w - uu * (cartesianDot(A, A) - 1);
 
-           if (t2 < 0) return;
+           if (t2 < 0) { return; }
 
            var t = sqrt(t2),
                q = cartesianScale(u, (-w - t) / uu);
            cartesianAddInPlace(q, A);
            q = spherical(q);
 
-           if (!two) return q;
+           if (!two) { return q; }
 
            // Two intersection points.
            var lambda0 = a[0],
                phi1 = b[1],
                z;
 
-           if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;
+           if (lambda1 < lambda0) { z = lambda0, lambda0 = lambda1, lambda1 = z; }
 
            var delta = lambda1 - lambda0,
                polar = abs$2(delta - pi) < epsilon,
                meridian = polar || delta < epsilon;
 
-           if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;
+           if (!polar && phi1 < phi0) { z = phi0, phi0 = phi1, phi1 = z; }
 
            // Check that the first point is between a and b.
            if (meridian
          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
+           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;
          }
 
              r;
 
          r = x0 - ax;
-         if (!dx && r > 0) return;
+         if (!dx && r > 0) { return; }
          r /= dx;
          if (dx < 0) {
-           if (r < t0) return;
-           if (r < t1) t1 = r;
+           if (r < t0) { return; }
+           if (r < t1) { t1 = r; }
          } else if (dx > 0) {
-           if (r > t1) return;
-           if (r > t0) t0 = r;
+           if (r > t1) { return; }
+           if (r > t0) { t0 = r; }
          }
 
          r = x1 - ax;
-         if (!dx && r < 0) return;
+         if (!dx && r < 0) { return; }
          r /= dx;
          if (dx < 0) {
-           if (r > t1) return;
-           if (r > t0) t0 = r;
+           if (r > t1) { return; }
+           if (r > t0) { t0 = r; }
          } else if (dx > 0) {
-           if (r < t0) return;
-           if (r < t1) t1 = r;
+           if (r < t0) { return; }
+           if (r < t1) { t1 = r; }
          }
 
          r = y0 - ay;
-         if (!dy && r > 0) return;
+         if (!dy && r > 0) { return; }
          r /= dy;
          if (dy < 0) {
-           if (r < t0) return;
-           if (r < t1) t1 = r;
+           if (r < t0) { return; }
+           if (r < t1) { t1 = r; }
          } else if (dy > 0) {
-           if (r > t1) return;
-           if (r > t0) t0 = r;
+           if (r > t1) { return; }
+           if (r > t0) { t0 = r; }
          }
 
          r = y1 - ay;
-         if (!dy && r < 0) return;
+         if (!dy && r < 0) { return; }
          r /= dy;
          if (dy < 0) {
-           if (r > t1) return;
-           if (r > t0) t0 = r;
+           if (r > t1) { return; }
+           if (r > t0) { t0 = r; }
          } else if (dy > 0) {
-           if (r < t0) return;
-           if (r < t1) t1 = r;
+           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;
+         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;
        }
 
            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);
+             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]);
            };
 
            function point(x, y) {
-             if (visible(x, y)) activeStream.point(x, y);
+             if (visible(x, y)) { activeStream.point(x, y); }
            }
 
            function polygonInside() {
              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; }
+                 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 lineStart() {
              clipStream.point = linePoint;
-             if (polygon) polygon.push(ring = []);
+             if (polygon) { polygon.push(ring = []); }
              first = true;
              v_ = false;
              x_ = y_ = NaN;
            function lineEnd() {
              if (segments) {
                linePoint(x__, y__);
-               if (v__ && v_) bufferStream.rejoin();
+               if (v__ && v_) { bufferStream.rejoin(); }
                segments.push(bufferStream.result());
              }
              clipStream.point = point;
-             if (v_) activeStream.lineEnd();
+             if (v_) { activeStream.lineEnd(); }
            }
 
            function linePoint(x, y) {
              var v = visible(x, y);
-             if (polygon) ring.push([x, y]);
+             if (polygon) { ring.push([x, y]); }
              if (first) {
                x__ = x, y__ = y, v__ = v;
                first = false;
                  activeStream.point(x, y);
                }
              } else {
-               if (v && v_) activeStream.point(x, y);
+               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))];
                      activeStream.point(a[0], a[1]);
                    }
                    activeStream.point(b[0], b[1]);
-                   if (!v) activeStream.lineEnd();
+                   if (!v) { activeStream.lineEnd(); }
                    clean = false;
                  } else if (v) {
                    activeStream.lineStart();
        };
 
        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;
+         if (x < x0$2) { x0$2 = x; }
+         if (x > x1) { x1 = x; }
+         if (y < y0$2) { y0$2 = y; }
+         if (y > y1) { y1 = y; }
        }
 
        // TODO Enforce positive area for exterior, negative area for interior?
            this._point = 0;
          },
          lineEnd: function() {
-           if (this._line === 0) this._context.closePath();
+           if (this._line === 0) { this._context.closePath(); }
            this._point = NaN;
          },
          point: function(x, y) {
            lengthStream$1.point = lengthPointFirst$1;
          },
          lineEnd: function() {
-           if (lengthRing) lengthPoint$1(x00$2, y00$2);
+           if (lengthRing) { lengthPoint$1(x00$2, y00$2); }
            lengthStream$1.point = noop$2;
          },
          polygonStart: function() {
          _radius: 4.5,
          _circle: circle(4.5),
          pointRadius: function(_) {
-           if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;
+           if ((_ = +_) !== this._radius) { this._radius = _, this._circle = null; }
            return this;
          },
          polygonStart: function() {
            this._point = 0;
          },
          lineEnd: function() {
-           if (this._line === 0) this._string.push("Z");
+           if (this._line === 0) { this._string.push("Z"); }
            this._point = NaN;
          },
          point: function(x, y) {
                break;
              }
              default: {
-               if (this._circle == null) this._circle = circle(this._radius);
+               if (this._circle == null) { this._circle = circle(this._radius); }
                this._string.push("M", x, ",", y, this._circle);
                break;
              }
 
          function path(object) {
            if (object) {
-             if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
+             if (typeof pointRadius === "function") { contextStream.pointRadius(+pointRadius.apply(this, arguments)); }
              d3_geoStream(object, projectionStream(contextStream));
            }
            return contextStream.result();
          };
 
          path.context = function(_) {
-           if (!arguments.length) return context;
+           if (!arguments.length) { return context; }
            contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _);
-           if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius);
+           if (typeof pointRadius !== "function") { contextStream.pointRadius(pointRadius); }
            return path;
          };
 
          path.pointRadius = function(_) {
-           if (!arguments.length) return pointRadius;
+           if (!arguments.length) { return pointRadius; }
            pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
            return path;
          };
        function transformer(methods) {
          return function(stream) {
            var s = new TransformStream;
-           for (var key in methods) s[key] = methods[key];
+           for (var key in methods) { s[key] = methods[key]; }
            s.stream = stream;
            return s;
          };
        function fit(projection, fitBounds, object) {
          var clip = projection.clipExtent && projection.clipExtent();
          projection.scale(150).translate([0, 0]);
-         if (clip != null) projection.clipExtent(null);
+         if (clip != null) { projection.clipExtent(null); }
          d3_geoStream(object, projection.stream(boundsStream$1));
          fitBounds(boundsStream$1.result());
-         if (clip != null) projection.clipExtent(clip);
+         if (clip != null) { projection.clipExtent(clip); }
          return projection;
        }
 
 
 
            extend: function(obj) {
-               if (!(obj instanceof geoExtent)) obj = new geoExtent(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])]
 
 
            contains: function(obj) {
-               if (!(obj instanceof geoExtent)) obj = new geoExtent(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] &&
 
 
            intersects: function(obj) {
-               if (!(obj instanceof geoExtent)) obj = new geoExtent(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] &&
 
 
            intersection: function(obj) {
-               if (!this.intersects(obj)) return new geoExtent();
+               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(obj) {
-               if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
+               if (!(obj instanceof geoExtent)) { obj = new geoExtent(obj); }
                var a1 = this.intersection(obj).area();
                var a2 = this.area();
 
              size = 2;
 
          for (var i = 2; i < n; ++i) {
-           while (size > 1 && cross(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;
+           while (size > 1 && cross(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) { --size; }
            indexes[size++] = i;
          }
 
        }
 
        function d3_polygonHull(points) {
-         if ((n = points.length) < 3) return null;
+         if ((n = points.length) < 3) { return null; }
 
          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];
+         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]];
+         for (i = 0; i < n; ++i) { flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]]; }
 
          var upperIndexes = computeUpperHullIndexes(sortedPoints),
              lowerIndexes = computeUpperHullIndexes(flippedPoints);
 
          // 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]]);
+         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]]); }
 
          return hull;
        }
            var loc;
 
            for (var i = 0; i < points.length - 1; i++) {
-               if (ids[i] === activeID || ids[i + 1] === activeID) continue;
+               if (ids[i] === activeID || ids[i + 1] === activeID) { continue; }
 
                var o = points[i];
                var s = geoVecSubtract(points[i + 1], o);
 
                var intersect = ((yi > y) !== (yj > y)) &&
                    (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
-               if (intersect) inside = !inside;
+               if (intersect) { inside = !inside; }
            }
 
            return inside;
            var y = 0;
 
            if (point[0] > dimensions[0] - pad[1])
-               x = -10;
+               { x = -10; }
            if (point[0] < pad[3])
-               x = 10;
+               { x = 10; }
            if (point[1] > dimensions[1] - pad[2])
-               y = -10;
+               { y = -10; }
            if (point[1] < pad[0])
-               y = 10;
+               { y = 10; }
 
            if (x || y) {
                return [x, y];
        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[i] + "") || (t in _) || /[\s.]/.test(t)) throw new Error("illegal type: " + t);
+           if (!(t = arguments$1[i] + "") || (t in _) || /[\s.]/.test(t)) { throw new Error("illegal type: " + t); }
            _[t] = [];
          }
          return new Dispatch(_);
        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);
+           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};
          });
        }
 
            // 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;
+             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);
+           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);
+             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); } }
            }
 
            return this;
          },
          copy: function() {
            var copy = {}, _ = this._;
-           for (var t in _) copy[t] = _[t].slice();
+           for (var t in _) { copy[t] = _[t].slice(); }
            return new Dispatch(copy);
          },
          call: function(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 (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
+           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); }
          },
          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);
+           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); }
          }
        };
 
              break;
            }
          }
-         if (callback != null) type.push({name: name, value: callback});
+         if (callback != null) { type.push({name: name, value: callback}); }
          return type;
        }
 
 
        function namespace(name) {
          var prefix = name += "", i = prefix.indexOf(":");
-         if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);
+         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 selection_select(select) {
-         if (typeof select !== "function") select = selector(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__;
+               if ("__data__" in node) { subnode.__data__ = node.__data__; }
                subgroup[i] = subnode;
              }
            }
        }
 
        function selection_selectAll(select) {
-         if (typeof select !== "function") select = selectorAll(select);
+         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) {
        }
 
        function selection_filter(match) {
-         if (typeof match !== "function") match = matcher(match);
+         if (typeof match !== "function") { match = matcher(match); }
 
          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) {
              parents = this._parents,
              groups = this._groups;
 
-         if (typeof value !== "function") value = constant(value);
+         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],
            // 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);
+               if (i0 >= i1) { i1 = i0 + 1; }
+               while (!(next = updateGroup[i1]) && ++i1 < dataLength){ }
                previous._next = next || null;
              }
            }
        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);
+         if (onupdate != null) { update = onupdate(update); }
+         if (onexit == null) { exit.remove(); } else { onexit(exit); }
          return enter && update ? enter.merge(update).order() : update;
        }
 
          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);
+               if (next && node.compareDocumentPosition(next) ^ 4) { next.parentNode.insertBefore(node, next); }
                next = node;
              }
            }
        }
 
        function selection_sort(compare) {
-         if (!compare) compare = ascending;
+         if (!compare) { compare = ascending; }
 
          function compareNode(a, b) {
            return a && b ? compare(a.__data__, b.__data__) : !a - !b;
          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;
+             if (node) { return node; }
            }
          }
 
 
          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);
+             if (node = group[i]) { callback.call(node, node.__data__, i, group); }
            }
          }
 
        function attrFunction(name, value) {
          return function() {
            var v = value.apply(this, arguments);
-           if (v == null) this.removeAttribute(name);
-           else this.setAttribute(name, v);
+           if (v == null) { this.removeAttribute(name); }
+           else { this.setAttribute(name, v); }
          };
        }
 
        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);
+           if (v == null) { this.removeAttributeNS(fullname.space, fullname.local); }
+           else { this.setAttributeNS(fullname.space, fullname.local, v); }
          };
        }
 
        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);
+           if (v == null) { this.style.removeProperty(name); }
+           else { this.style.setProperty(name, v, priority); }
          };
        }
 
        function propertyFunction(name, value) {
          return function() {
            var v = value.apply(this, arguments);
-           if (v == null) delete this[name];
-           else this[name] = v;
+           if (v == null) { delete this[name]; }
+           else { this[name] = v; }
          };
        }
 
 
        function classedAdd(node, names) {
          var list = classList(node), i = -1, n = names.length;
-         while (++i < n) list.add(names[i]);
+         while (++i < n) { list.add(names[i]); }
        }
 
        function classedRemove(node, names) {
          var list = classList(node), i = -1, n = names.length;
-         while (++i < n) list.remove(names[i]);
+         while (++i < n) { list.remove(names[i]); }
        }
 
        function classedTrue(names) {
 
          if (arguments.length < 2) {
            var list = classList(this.node()), i = -1, n = names.length;
-           while (++i < n) if (!list.contains(names[i])) return false;
+           while (++i < n) { if (!list.contains(names[i])) { return false; } }
            return true;
          }
 
        }
 
        function raise() {
-         if (this.nextSibling) this.parentNode.appendChild(this);
+         if (this.nextSibling) { this.parentNode.appendChild(this); }
        }
 
        function selection_raise() {
        }
 
        function lower() {
-         if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
+         if (this.previousSibling) { this.parentNode.insertBefore(this, this.parentNode.firstChild); }
        }
 
        function selection_lower() {
 
        function remove() {
          var parent = this.parentNode;
-         if (parent) parent.removeChild(this);
+         if (parent) { parent.removeChild(this); }
        }
 
        function selection_remove() {
        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);
+           if (i >= 0) { name = t.slice(i + 1), t = t.slice(0, i); }
            return {type: t, name: name};
          });
        }
        function onRemove(typename) {
          return function() {
            var on = this.__on;
-           if (!on) return;
+           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);
                on[++i] = o;
              }
            }
-           if (++i) on.length = i;
-           else delete this.__on;
+           if (++i) { on.length = i; }
+           else { delete this.__on; }
          };
        }
 
          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 (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);
+           if (!on) { this.__on = [o]; }
+           else { on.push(o); }
          };
        }
 
 
          if (arguments.length < 2) {
            var on = this.node().__on;
-           if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
+           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;
          }
 
          on = value ? onAdd : onRemove;
-         if (capture == null) capture = false;
-         for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
+         if (capture == null) { capture = false; }
+         for (i = 0; i < n; ++i) { this.each(on(typenames[i], value, capture)); }
          return this;
        }
 
            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);
+           if (params) { event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail; }
+           else { event.initEvent(type, false, false); }
          }
 
          node.dispatchEvent(event);
 
        function sourceEvent() {
          var current = event, source;
-         while (source = current.sourceEvent) current = source;
+         while (source = current.sourceEvent) { current = source; }
          return current;
        }
 
 
        function mouse(node) {
          var event = sourceEvent();
-         if (event.changedTouches) event = event.changedTouches[0];
+         if (event.changedTouches) { event = event.changedTouches[0]; }
          return point(node, event);
        }
 
        }
 
        function touch(node, touches, identifier) {
-         if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;
+         if (arguments.length < 3) { identifier = touches, touches = sourceEvent().changedTouches; }
 
          for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {
            if ((touch = touches[i]).identifier === identifier) {
          }
 
          function mousedowned() {
-           if (touchending || !filter.apply(this, arguments)) return;
+           if (touchending || !filter.apply(this, arguments)) { return; }
            var gesture = beforestart("mouse", container.apply(this, arguments), mouse, this, arguments);
-           if (!gesture) return;
+           if (!gesture) { return; }
            select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
            dragDisable(event.view);
            nopropagation();
          }
 
          function touchstarted() {
-           if (!filter.apply(this, arguments)) return;
+           var arguments$1 = arguments;
+
+           if (!filter.apply(this, arguments)) { return; }
            var touches = event.changedTouches,
                c = container.apply(this, arguments),
                n = touches.length, i, gesture;
 
            for (i = 0; i < n; ++i) {
-             if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {
+             if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments$1)) {
                nopropagation();
                gesture("start");
              }
            var touches = event.changedTouches,
                n = touches.length, i, gesture;
 
-           if (touchending) clearTimeout(touchending);
+           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]) {
                sublisteners = listeners.copy();
 
            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;
+             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;
+           })) { return; }
 
            return function gesture(type) {
              var p0 = p, n;
 
        function extend(parent, definition) {
          var prototype = Object.create(parent.prototype);
-         for (var key in definition) prototype[key] = definition[key];
+         for (var key in definition) { prototype[key] = definition[key]; }
          return prototype;
        }
 
        }
 
        function rgba(r, g, b, a) {
-         if (a <= 0) r = g = b = NaN;
+         if (a <= 0) { r = g = b = NaN; }
          return new Rgb(r, g, b, a);
        }
 
        function rgbConvert(o) {
-         if (!(o instanceof Color)) o = color(o);
-         if (!o) return new Rgb;
+         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 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;
+         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 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;
+         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,
              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;
+           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 {
        })(1);
 
        function numberArray(a, b) {
-         if (!b) 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;
+           for (i = 0; i < n; ++i) { c[i] = a[i] * (1 - t) + b[i] * t; }
            return c;
          };
        }
              c = new Array(nb),
              i;
 
-         for (i = 0; i < na; ++i) x[i] = interpolate(a[i], b[i]);
-         for (; i < nb; ++i) c[i] = b[i];
+         for (i = 0; i < na; ++i) { x[i] = interpolate(a[i], b[i]); }
+         for (; i < nb; ++i) { c[i] = b[i]; }
 
          return function(t) {
-           for (i = 0; i < na; ++i) c[i] = x[i](t);
+           for (i = 0; i < na; ++i) { c[i] = x[i](t); }
            return c;
          };
        }
              c = {},
              k;
 
-         if (a === null || typeof a !== "object") a = {};
-         if (b === null || typeof b !== "object") b = {};
+         if (a === null || typeof a !== "object") { a = {}; }
+         if (b === null || typeof b !== "object") { b = {}; }
 
          for (k in b) {
            if (k in a) {
          }
 
          return function(t) {
-           for (k in i) c[k] = i[k](t);
+           for (k in i) { c[k] = i[k](t); }
            return c;
          };
        }
              && (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 (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;
+             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)});
          // 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 (s[i]) { s[i] += bs; } // coalesce with previous string
+           else { s[++i] = bs; }
          }
 
          // Special optimization for only a single match.
              ? 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);
+                 for (var i = 0, o; i < b; ++i) { s[(o = q[i]).i] = o.x(t); }
                  return s.join("");
                });
        }
 
        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;
+         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,
            svgNode;
 
        function parseCss(value) {
-         if (value === "none") return identity$1;
-         if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView;
+         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);
        }
 
        function parseSvg(value) {
-         if (value == null) return identity$1;
-         if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
+         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;
+         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 rotate(a, b, s, q) {
            if (a !== b) {
-             if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path
+             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);
            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);
+             while (++i < n) { s[(o = q[i]).i] = o.x(t); }
              return s.join("");
            };
          };
 
        function d3_quantize(interpolator, n) {
          var samples = new Array(n);
-         for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));
+         for (var i = 0; i < n; ++i) { samples[i] = interpolator(i / (n - 1)); }
          return samples;
        }
 
        Timer.prototype = timer.prototype = {
          constructor: Timer,
          restart: function(callback, delay, time) {
-           if (typeof callback !== "function") throw new TypeError("callback is not a function");
+           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;
+             if (taskTail) { taskTail._next = this; }
+             else { taskHead = this; }
              taskTail = this;
            }
            this._call = callback;
          ++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);
+           if ((e = clockNow - t._time) >= 0) { t._call.call(null, e); }
            t = t._next;
          }
          --frame;
 
        function poke() {
          var now = clock.now(), delay = now - clockLast;
-         if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
+         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;
+             if (time > t1._time) { time = t1._time; }
              t0 = t1, t1 = t1._next;
            } else {
              t2 = t1._next, t1._next = null;
        }
 
        function sleep(time) {
-         if (frame) return; // Soonest alarm already set, or will be.
-         if (timeout) timeout = clearTimeout(timeout);
+         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);
+           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);
+           if (!interval) { clockLast = clock.now(), interval = setInterval(poke, pokeDelay); }
            frame = 1, setFrame(wake);
          }
        }
 
        function schedule(node, name, id, index, group, timing) {
          var schedules = node.__transition;
-         if (!schedules) node.__transition = {};
-         else if (id in schedules) return;
+         if (!schedules) { node.__transition = {}; }
+         else if (id in schedules) { return; }
          create$7(node, id, {
            name: name,
            index: index, // For context during callback.
 
        function init(node, id) {
          var schedule = get$2(node, id);
-         if (schedule.state > CREATED) throw new Error("too late; already scheduled");
+         if (schedule.state > CREATED) { throw new Error("too late; already scheduled"); }
          return schedule;
        }
 
        function set$1(node, id) {
          var schedule = get$2(node, id);
-         if (schedule.state > STARTED) throw new Error("too late; already running");
+         if (schedule.state > STARTED) { throw new Error("too late; already running"); }
          return schedule;
        }
 
        function get$2(node, id) {
          var schedule = node.__transition;
-         if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found");
+         if (!schedule || !(schedule = schedule[id])) { throw new Error("transition not found"); }
          return schedule;
        }
 
            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);
+           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();
+           if (self.state !== SCHEDULED) { return stop(); }
 
            for (i in schedules) {
              o = schedules[i];
-             if (o.name !== self.name) continue;
+             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);
+             if (o.state === STARTED) { return d3_timeout(start); }
 
              // Interrupt the active transition, if any.
              if (o.state === RUNNING) {
            // 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
+           if (self.state !== STARTING) { return; } // interrupted
            self.state = STARTED;
 
            // Initialize the tween, deleting null tween.
            self.state = ENDED;
            self.timer.stop();
            delete schedules[id];
-           for (var i in schedules) return; // eslint-disable-line no-unused-vars
+           for (var i in schedules) { return; } // eslint-disable-line no-unused-vars
            delete node.__transition;
          }
        }
              empty = true,
              i;
 
-         if (!schedules) return;
+         if (!schedules) { return; }
 
          name = name == null ? null : name + "";
 
            delete schedules[i];
          }
 
-         if (empty) delete node.__transition;
+         if (empty) { delete node.__transition; }
        }
 
        function selection_interrupt(name) {
 
        function tweenFunction(id, name, value) {
          var tween0, tween1;
-         if (typeof value !== "function") throw new Error;
+         if (typeof value !== "function") { throw new Error; }
          return function() {
            var schedule = set$1(this, id),
                tween = schedule.tween;
                  break;
                }
              }
-             if (i === n) tween1.push(t);
+             if (i === n) { tween1.push(t); }
            }
 
            schedule.tween = tween1;
              interpolate0;
          return function() {
            var string0, value1 = value(this), string1;
-           if (value1 == null) return void this.removeAttribute(name);
+           if (value1 == null) { return void this.removeAttribute(name); }
            string0 = this.getAttribute(name);
            string1 = value1 + "";
            return string0 === string1 ? null
              interpolate0;
          return function() {
            var string0, value1 = value(this), string1;
-           if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);
+           if (value1 == null) { return void this.removeAttributeNS(fullname.space, fullname.local); }
            string0 = this.getAttributeNS(fullname.space, fullname.local);
            string1 = value1 + "";
            return string0 === string1 ? null
          var t0, i0;
          function tween() {
            var i = value.apply(this, arguments);
-           if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);
+           if (i !== i0) { t0 = (i0 = i) && attrInterpolateNS(fullname, i); }
            return t0;
          }
          tween._value = value;
          var t0, i0;
          function tween() {
            var i = value.apply(this, arguments);
-           if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);
+           if (i !== i0) { t0 = (i0 = i) && attrInterpolate(name, i); }
            return t0;
          }
          tween._value = value;
 
        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;
+         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));
        }
        }
 
        function easeConstant(id, value) {
-         if (typeof value !== "function") throw new Error;
+         if (typeof value !== "function") { throw new Error; }
          return function() {
            set$1(this, id).ease = value;
          };
        }
 
        function transition_filter(match) {
-         if (typeof match !== "function") match = matcher(match);
+         if (typeof match !== "function") { match = matcher(match); }
 
          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) {
        }
 
        function transition_merge(transition) {
-         if (transition._id !== this._id) throw new Error;
+         if (transition._id !== this._id) { throw new Error; }
 
          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) {
        function start(name) {
          return (name + "").trim().split(/^|\s+/).every(function(t) {
            var i = t.indexOf(".");
-           if (i >= 0) t = t.slice(0, i);
+           if (i >= 0) { t = t.slice(0, i); }
            return !t || t === "start";
          });
        }
            // 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);
+           if (on !== on0) { (on1 = (on0 = on).copy()).on(name, listener); }
 
            schedule.on = on1;
          };
        function removeFunction(id) {
          return function() {
            var parent = this.parentNode;
-           for (var i in this.__transition) if (+i !== id) return;
-           if (parent) parent.removeChild(this);
+           for (var i in this.__transition) { if (+i !== id) { return; } }
+           if (parent) { parent.removeChild(this); }
          };
        }
 
          var name = this._name,
              id = this._id;
 
-         if (typeof select !== "function") select = selector(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__;
+               if ("__data__" in node) { subnode.__data__ = node.__data__; }
                subgroup[i] = subnode;
                schedule(subgroup[i], name, id, i, subgroup, get$2(node, id));
              }
          var name = this._name,
              id = this._id;
 
-         if (typeof select !== "function") select = selectorAll(select);
+         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) {
            var string0 = styleValue(this, name),
                value1 = value(this),
                string1 = value1 + "";
-           if (value1 == null) string1 = value1 = (this.style.removeProperty(name), styleValue(this, name));
+           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 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);
+           if (on !== on0 || listener0 !== listener) { (on1 = (on0 = on).copy()).on(event, listener0 = listener); }
 
            schedule.on = on1;
          };
          var t, i0;
          function tween() {
            var i = value.apply(this, arguments);
-           if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);
+           if (i !== i0) { t = (i0 = i) && styleInterpolate(name, i, priority); }
            return t;
          }
          tween._value = value;
 
        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;
+         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));
        }
 
          var t0, i0;
          function tween() {
            var i = value.apply(this, arguments);
-           if (i !== i0) t0 = (i0 = i) && textInterpolate(i);
+           if (i !== i0) { t0 = (i0 = i) && textInterpolate(i); }
            return t0;
          }
          tween._value = value;
 
        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;
+         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 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(); }};
+               end = {value: function() { if (--size === 0) { resolve(); } }};
 
            that.each(function() {
              var schedule = set$1(this, id),
                      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.
+                   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);
                  };
              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]);
+             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;
          };
 
          function wheeled() {
-           if (!filter.apply(this, arguments)) return;
+           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)))),
            }
 
            // If this wheel event won’t trigger a transform change, ignore it.
-           else if (t.k === k) return;
+           else if (t.k === k) { return; }
 
            // Otherwise, capture the mouse point and location at the start.
            else {
          }
 
          function mousedowned() {
-           if (touchending || !filter.apply(this, arguments)) return;
+           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),
          }
 
          function dblclicked() {
-           if (!filter.apply(this, arguments)) return;
+           if (!filter.apply(this, arguments)) { return; }
            var t0 = this.__zoom,
                p0 = mouse(this),
                p1 = t0.invert(p0),
                t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent);
 
            noevent$1();
-           if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0);
-           else select(this).call(zoom.transform, t1);
+           if (duration > 0) { select(this).transition().duration(duration).call(schedule, t1, p0); }
+           else { select(this).call(zoom.transform, t1); }
          }
 
          function touchstarted() {
-           if (!filter.apply(this, arguments)) return;
+           if (!filter.apply(this, arguments)) { return; }
            var touches = event.touches,
                n = touches.length,
                g = gesture(this, arguments, event.changedTouches.length === n),
            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;
+             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; }
            }
 
-           if (touchstarting) touchstarting = clearTimeout(touchstarting);
+           if (touchstarting) { touchstarting = clearTimeout(touchstarting); }
 
            if (started) {
-             if (g.taps < 2) touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
+             if (g.taps < 2) { touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay); }
              interrupt(this);
              g.start();
            }
          }
 
          function touchmoved() {
-           if (!this.__zooming) return;
+           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);
+           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;
+             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) {
              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;
+           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));
          }
 
          function touchended() {
-           if (!this.__zooming) return;
+           if (!this.__zooming) { return; }
            var g = gesture(this, arguments),
                touches = event.changedTouches,
                n = touches.length, i, t;
 
            nopropagation$1();
-           if (touchending) clearTimeout(touchending);
+           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.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]);
+           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);
+               if (p) { p.apply(this, arguments); }
              }
            }
          }
 
 
            projection.scale = function(_) {
-               if (!arguments.length) return k;
+               if (!arguments.length) { return k; }
                k = +_;
                return projection;
            };
 
 
            projection.translate = function(_) {
-               if (!arguments.length) return [x, y];
+               if (!arguments.length) { return [x, y]; }
                x = +_[0];
                y = +_[1];
                return projection;
 
 
            projection.clipExtent = function(_) {
-               if (!arguments.length) return clipExtent;
+               if (!arguments.length) { return clipExtent; }
                clipExtent = _;
                return projection;
            };
 
 
            projection.transform = function(obj) {
-               if (!arguments.length) return identity$2.translate(x, y).scale(k);
+               if (!arguments.length) { return identity$2.translate(x, y).scale(k); }
                x = +obj.x;
                y = +obj.y;
                k = +obj.k;
                var b = coords[(i + 1) % coords.length];
 
                var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon, lowerThreshold, upperThreshold);
-               if (dotp === null) continue;    // ignore vertex
+               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)));
            }
 
 
                var angle = Math.acos(Math.abs(normalizedDotP)) * 180 / Math.PI;
 
-               if (angle > 45) angle = 90 - angle;
+               if (angle > 45) { angle = 90 - angle; }
 
-               if (angle >= lessThan) continue;
+               if (angle >= lessThan) { continue; }
 
-               if (angle > max) max = angle;
+               if (angle > max) { max = angle; }
            }
 
-           if (max === -Infinity) return null;
+           if (max === -Infinity) { return null; }
 
            return max;
        }
                var b = coords[(i + 1) % coords.length];
 
                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
+               if (dotp === null) { continue; }        // ignore vertex
+               if (Math.abs(dotp) > 0) { return 1; }   // something to do
                score = 0;                          // already square
            }
 
        // 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;
+           if (a === b) { return true; }
 
            var i = a.length;
-           if (i !== b.length) return false;
+           if (i !== b.length) { return false; }
            while (i--) {
-               if (a[i] !== b[i]) return false;
+               if (a[i] !== b[i]) { return false; }
            }
            return true;
        }
        // utilArrayChunk(a, 3);
        //   [[1,2,3],[4,5,6],[7]];
        function utilArrayChunk(a, chunkSize) {
-           if (!chunkSize || chunkSize < 0) return [a.slice()];
+           if (!chunkSize || chunkSize < 0) { return [a.slice()]; }
 
            var result = new Array(Math.ceil(a.length / chunkSize));
            return Array.from(result, function(item, i) {
 
        var isArabic_1 = createCommonjsModule(function (module, exports) {
        Object.defineProperty(exports, "__esModule", { value: true });
-       const arabicBlocks = [
+       var arabicBlocks = [
            [0x0600, 0x06FF],
            [0x0750, 0x077F],
            [0x08A0, 0x08FF],
                // allow the newer chars?
                throw new Error('isArabic works on only one-character strings');
            }
-           let code = char.charCodeAt(0);
-           for (let i = 0; i < arabicBlocks.length; i++) {
-               let block = arabicBlocks[i];
+           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;
                }
                // allow the newer chars?
                throw new Error('isMath works on only one-character strings');
            }
-           let code = char.charCodeAt(0);
+           var code = char.charCodeAt(0);
            return ((code >= 0x660 && code <= 0x66C) || (code >= 0x6F0 && code <= 0x6F9));
        }
        exports.isMath = isMath;
 
        var unicodeArabic = createCommonjsModule(function (module, exports) {
        Object.defineProperty(exports, "__esModule", { value: true });
-       const arabicReference = {
+       var arabicReference = {
            "alef": {
                "normal": [
                    "\u0627"
 
        var unicodeLigatures = createCommonjsModule(function (module, exports) {
        Object.defineProperty(exports, "__esModule", { value: true });
-       const ligatureReference = {
+       var ligatureReference = {
            "\u0626\u0627": {
                "isolated": "\uFBEA",
                "final": "\uFBEB"
        Object.defineProperty(exports, "__esModule", { value: true });
 
 
-       const letterList = Object.keys(unicodeArabic.default);
+       var letterList = Object.keys(unicodeArabic.default);
        exports.letterList = letterList;
-       const ligatureList = Object.keys(unicodeLigatures.default);
+       var ligatureList = Object.keys(unicodeLigatures.default);
        exports.ligatureList = ligatureList;
-       const ligatureWordList = Object.keys(unicodeLigatures.default.words);
+       var ligatureWordList = Object.keys(unicodeLigatures.default.words);
        exports.ligatureWordList = ligatureWordList;
-       const lams = '\u0644\u06B5\u06B6\u06B7\u06B8';
+       var lams = '\u0644\u06B5\u06B6\u06B7\u06B8';
        exports.lams = lams;
-       const alefs = '\u0627\u0622\u0623\u0625\u0671\u0672\u0673\u0675\u0773\u0774';
+       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('-');
        //     console.log(a + ': ' + lams[l] + alefs[a]);
        //   }
        // }
-       let tashkeel = '\u0605\u0640\u0670\u0674\u06DF\u06E7\u06E8';
+       var tashkeel = '\u0605\u0640\u0670\u0674\u06DF\u06E7\u06E8';
        exports.tashkeel = tashkeel;
        function addToTashkeel(start, finish) {
            for (var i = start; i <= finish; i++) {
        addToTashkeel(0x08D3, 0x08E1);
        addToTashkeel(0x08E3, 0x08FF);
        addToTashkeel(0xFE70, 0xFE7F);
-       let lineBreakers = '\u0627\u0629\u0648\u06C0\u06CF\u06FD\u06FE\u076B\u076C\u0771\u0773\u0774\u0778\u0779\u08E2\u08B1\u08B2\u08B9';
+       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++) {
 
 
        function GlyphSplitter(word) {
-           let letters = [];
-           let lastLetter = '';
-           word.split('').forEach((letter) => {
+           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;
 
 
        function BaselineSplitter(word) {
-           let letters = [];
-           let lastLetter = '';
-           word.split('').forEach((letter) => {
+           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;
            if (typeof breakPresentationForm === 'undefined') {
                breakPresentationForm = true;
            }
-           let returnable = '';
-           word.split('').forEach((letter) => {
+           var returnable = '';
+           word.split('').forEach(function (letter) {
                if (!isArabic_1.isArabic(letter)) {
                    returnable += letter;
                    return;
                }
-               for (let w = 0; w < reference.letterList.length; w++) {
+               for (var w = 0; w < reference.letterList.length; w++) {
                    // ok so we are checking this potential lettertron
-                   let letterForms = unicodeArabic.default[reference.letterList[w]];
-                   let versions = Object.keys(letterForms);
-                   for (let v = 0; v < versions.length; v++) {
-                       let localVersion = letterForms[versions[v]];
+                   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
-                           let embeddedForms = Object.keys(localVersion);
-                           for (let ef = 0; ef < embeddedForms.length; ef++) {
-                               let form = localVersion[embeddedForms[ef]];
+                           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');
                    }
                }
                // try ligatures
-               for (let v2 = 0; v2 < reference.ligatureList.length; v2++) {
-                   let normalForm = reference.ligatureList[v2];
+               for (var v2 = 0; v2 < reference.ligatureList.length; v2++) {
+                   var normalForm = reference.ligatureList[v2];
                    if (normalForm !== 'words') {
-                       let ligForms = Object.keys(unicodeLigatures.default[normalForm]);
-                       for (let f = 0; f < ligForms.length; f++) {
+                       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 (let v3 = 0; v3 < reference.ligatureWordList.length; v3++) {
-                   let normalForm = reference.ligatureWordList[v3];
-                   if (unicodeLigatures.default.words[normalForm] === letter) {
-                       returnable += normalForm;
+               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;
                    }
                }
                // hamza alone
                return "\u0621";
            }
-           for (let w = 0; w < reference.letterList.length; w++) {
+           for (var w = 0; w < reference.letterList.length; w++) {
                // ok so we are checking this potential lettertron
-               let letterForms = unicodeArabic.default[reference.letterList[w]];
-               let versions = Object.keys(letterForms);
-               for (let v = 0; v < versions.length; v++) {
-                   let localVersion = letterForms[versions[v]];
+               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) {
                    }
                    else if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') {
                        // check embedded
-                       let embeddedVersions = Object.keys(localVersion);
-                       for (let ev = 0; ev < embeddedVersions.length; ev++) {
+                       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) {
 
 
        function WordShaper(word) {
-           let state = 'initial';
-           let output = '';
-           for (let w = 0; w < word.length; w++) {
-               let nextLetter = ' ';
-               for (let nxw = w + 1; nxw < word.length; nxw++) {
+           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 (!isArabic_1.isArabic(letter)) {
                throw new Error('Not an Arabic letter');
            }
-           for (let w = 0; w < reference.letterList.length; w++) {
+           for (var w = 0; w < reference.letterList.length; w++) {
                // ok so we are checking this potential lettertron
-               let letterForms = unicodeArabic.default[reference.letterList[w]];
-               let versions = Object.keys(letterForms);
-               for (let v = 0; v < versions.length; v++) {
-                   let localVersion = letterForms[versions[v]];
+               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
-                       let embeddedForms = Object.keys(localVersion);
-                       for (let ef = 0; ef < embeddedForms.length; ef++) {
-                           let form = localVersion[embeddedForms[ef]];
+                       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;
            if (!isArabic_1.isArabic(letter)) {
                throw new Error('Not an Arabic letter');
            }
-           for (let w = 0; w < reference.letterList.length; w++) {
+           for (var w = 0; w < reference.letterList.length; w++) {
                // ok so we are checking this potential lettertron
-               let letterForms = unicodeArabic.default[reference.letterList[w]];
-               let versions = Object.keys(letterForms);
-               for (let v = 0; v < versions.length; v++) {
-                   let localVersion = letterForms[versions[v]];
+               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
-                       let embeddedForms = Object.keys(localVersion);
-                       for (let ef = 0; ef < embeddedForms.length; ef++) {
-                           let form = localVersion[embeddedForms[ef]];
+                       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;
 
        // https://github.com/openstreetmap/iD/issues/772
        // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
-       let _storage;
+       var _storage;
        try { _storage = localStorage; } catch (e) {}  // eslint-disable-line no-empty
-       _storage = _storage || (() => {
-         let s = {};
+       _storage = _storage || (function () {
+         var s = {};
          return {
-           getItem: (k) => s[k],
-           setItem: (k, v) => s[k] = v,
-           removeItem: (k) => delete s[k]
+           getItem: function (k) { return s[k]; },
+           setItem: function (k, v) { return s[k] = v; },
+           removeItem: function (k) { return delete s[k]; }
          };
        })();
 
        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);
+           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') {
        }
 
        function responseText(response) {
-         if (!response.ok) throw new Error(response.status + " " + response.statusText);
+         if (!response.ok) { throw new Error(response.status + " " + response.statusText); }
          return response.text();
        }
 
        }
 
        function responseJson(response) {
-         if (!response.ok) throw new Error(response.status + " " + response.statusText);
-         if (response.status === 204 || response.status === 205) return;
+         if (!response.ok) { throw new Error(response.status + " " + response.statusText); }
+         if (response.status === 204 || response.status === 205) { return; }
          return response.json();
        }
 
 
        var svg = parser("image/svg+xml");
 
-       let _mainFileFetcher = coreFileFetcher(); // singleton
+       var _mainFileFetcher = coreFileFetcher(); // singleton
 
        //
        // coreFileFetcher asynchronously fetches data from JSON files
        //
        function coreFileFetcher() {
-         let _this = {};
-         let _inflight = {};
-         let _fileMap = {
+         var _this = {};
+         var _inflight = {};
+         var _fileMap = {
            'address_formats': 'data/address_formats.min.json',
            'deprecated': 'data/deprecated.min.json',
            'discarded': 'data/discarded.min.json',
            'wmf_sitematrix': 'https://cdn.jsdelivr.net/npm/wmf-sitematrix@0.1/wikipedia.min.json'
          };
 
-         let _cachedData = {};
+         var _cachedData = {};
          // expose the cache; useful for tests
-         _this.cache = () => _cachedData;
+         _this.cache = function () { return _cachedData; };
 
 
          // Returns a Promise to fetch data
          // (resolved with the data if we have it already)
-         _this.get = (which) => {
+         _this.get = function (which) {
            if (_cachedData[which]) {
              return Promise.resolve(_cachedData[which]);
            }
 
-           const file = _fileMap[which];
-           const url = file && _this.asset(file);
+           var file = _fileMap[which];
+           var url = file && _this.asset(file);
            if (!url) {
-             return Promise.reject(`Unknown data file for "${which}"`);
+             return Promise.reject(("Unknown data file for \"" + which + "\""));
            }
 
-           let prom = _inflight[url];
+           var prom = _inflight[url];
            if (!prom) {
              _inflight[url] = prom = d3_json(url)
-               .then(result => {
+               .then(function (result) {
                  delete _inflight[url];
                  if (!result) {
-                   throw new Error(`No data loaded for "${which}"`);
+                   throw new Error(("No data loaded for \"" + which + "\""));
                  }
                  _cachedData[which] = result;
                  return result;
                })
-               .catch(err => {
+               .catch(function (err) {
                  delete _inflight[url];
                  throw err;
                });
 
          // Accessor for the file map
          _this.fileMap = function(val) {
-           if (!arguments.length) return _fileMap;
+           if (!arguments.length) { return _fileMap; }
            _fileMap = val;
            return _this;
          };
 
-         let _assetPath = '';
+         var _assetPath = '';
          _this.assetPath = function(val) {
-           if (!arguments.length) return _assetPath;
+           if (!arguments.length) { return _assetPath; }
            _assetPath = val;
            return _this;
          };
 
-         let _assetMap = {};
+         var _assetMap = {};
          _this.assetMap = function(val) {
-           if (!arguments.length) return _assetMap;
+           if (!arguments.length) { return _assetMap; }
            _assetMap = val;
            return _this;
          };
 
-         _this.asset = (val) => {
-           if (/^http(s)?:\/\//i.test(val)) return val;
-           const filename = _assetPath + val;
+         _this.asset = function (val) {
+           if (/^http(s)?:\/\//i.test(val)) { return val; }
+           var filename = _assetPath + val;
            return _assetMap[filename] || filename;
          };
 
          return _this;
        }
 
-       let _detected;
+       var _detected;
 
        function utilDetect(refresh) {
-         if (_detected && !refresh) return _detected;
+         if (_detected && !refresh) { return _detected; }
          _detected = {};
 
-         const ua = navigator.userAgent;
-         let m = null;
+         var ua = navigator.userAgent;
+         var m = null;
 
          /* Browser */
          m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i);   // Edge
              _detected.browser = m[1];
              _detected.version = m[2];
              m = ua.match(/version\/([\.\d]+)/i);
-             if (m !== null) _detected.version = m[1];
+             if (m !== null) { _detected.version = m[1]; }
            }
          }
          if (!_detected.browser) {
 
 
          /* Host */
-         const loc = window.top.location;
-         let origin = loc.origin;
+         var loc = window.top.location;
+         var origin = loc.origin;
          if (!origin) {  // for unpatched IE11
            origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port: '');
          }
        // 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.
-       const DEFAULT_128 = [250, 157, 60, 79, 142, 134, 229, 129, 138, 126, 210, 129, 29, 71, 160, 208];
+       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;
-         const textBytes = aesJs.utils.utf8.toBytes(text);
-         const aesCtr = new aesJs.ModeOfOperation.ctr(key);
-         const encryptedBytes = aesCtr.encrypt(textBytes);
-         const encryptedHex = aesJs.utils.hex.fromBytes(encryptedBytes);
+         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;
-         const encryptedBytes = aesJs.utils.hex.toBytes(encryptedHex);
-         const aesCtr = new aesJs.ModeOfOperation.ctr(key);
-         const decryptedBytes = aesCtr.decrypt(encryptedBytes);
-         const text = aesJs.utils.utf8.fromBytes(decryptedBytes);
+         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;
+               if (!k) { continue; }
                var v = tags[k];
                if (v !== undefined) {
                    out[k] = cleanValue(k, v);
                    return /^(description|note|fixme)$/.test(k);
                }
 
-               if (skip(k)) return v;
+               if (skip(k)) { return v; }
 
                var cleaned = v
                    .split(';')
                // 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 (!binding.event.modifiers.shiftKey) { continue; }  // no shift
+                   if (!!binding.capture !== isCapturing) { continue; }
                    if (matches(binding, true)) {
                        binding.callback();
                        didMatch = true;
                }
 
                // then unshifted keybindings
-               if (didMatch) return;
+               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 (binding.event.modifiers.shiftKey) { continue; }   // shift
+                   if (!!binding.capture !== isCapturing) { continue; }
                    if (matches(binding, false)) {
                        binding.callback();
                    }
                            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;
+                               { isMatch = false; }
                        } else {
                            if (event$1.key.toLowerCase() !== binding.event.key.toLowerCase())
-                               isMatch = false;
+                               { isMatch = false; }
                        }
                    }
 
                        isMatch = (event$1.keyCode === binding.event.keyCode);
                    }
 
-                   if (!isMatch) return false;
+                   if (!isMatch) { return false; }
 
                    // 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.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;
+                   if (event$1.metaKey !== binding.event.modifiers.metaKey) { return false; }
+                   if (testShift && event$1.shiftKey !== binding.event.modifiers.shiftKey) { return false; }
 
                    return true;
                }
                    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] === '++') { matches[j] = '+'; }
 
                        if (matches[j] in utilKeybinding.modifierCodes) {
                            var prop = utilKeybinding.modifierProperties[utilKeybinding.modifierCodes[matches[j]]];
 
        // Copies a variable number of methods from source to target.
        function utilRebind(target, source) {
+           var arguments$1 = arguments;
+
            var i = 1, n = arguments.length, method;
            while (++i < n) {
-               target[method = arguments[i]] = d3_rebind(target, source, source[method]);
+               target[method = arguments$1[i]] = d3_rebind(target, source, source[method]);
            }
            return target;
        }
            }
 
            mutex.lock = function () {
-               if (intervalID) return true;
+               if (intervalID) { return true; }
                var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
-               if (cookie) return false;
+               if (cookie) { return false; }
                renew();
                intervalID = window.setInterval(renew, 4000);
                return true;
            };
 
            mutex.unlock = function () {
-               if (!intervalID) return;
+               if (!intervalID) { return; }
                document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT; sameSite=strict';
                clearInterval(intervalID);
                intervalID = null;
 
 
            tiler.tileSize = function(val) {
-               if (!arguments.length) return _tileSize;
+               if (!arguments.length) { return _tileSize; }
                _tileSize = val;
                return tiler;
            };
 
 
            tiler.zoomExtent = function(val) {
-               if (!arguments.length) return _zoomExtent;
+               if (!arguments.length) { return _zoomExtent; }
                _zoomExtent = val;
                return tiler;
            };
 
 
            tiler.size = function(val) {
-               if (!arguments.length) return _size;
+               if (!arguments.length) { return _size; }
                _size = val;
                return tiler;
            };
 
 
            tiler.scale = function(val) {
-               if (!arguments.length) return _scale;
+               if (!arguments.length) { return _scale; }
                _scale = val;
                return tiler;
            };
 
 
            tiler.translate = function(val) {
-               if (!arguments.length) return _translate;
+               if (!arguments.length) { return _translate; }
                _translate = val;
                return tiler;
            };
 
            // number to extend the rows/columns beyond those covering the viewport
            tiler.margin = function(val) {
-               if (!arguments.length) return _margin;
+               if (!arguments.length) { return _margin; }
                _margin = +val;
                return tiler;
            };
 
 
            tiler.skipNullIsland = function(val) {
-               if (!arguments.length) return _skipNullIsland;
+               if (!arguments.length) { return _skipNullIsland; }
                _skipNullIsland = val;
                return tiler;
            };
            });
        }
 
-       let _mainLocalizer = coreLocalizer(); // singleton
-       let _t = _mainLocalizer.t;
+       var _mainLocalizer = coreLocalizer(); // singleton
+       var _t = _mainLocalizer.t;
 
        //
        // coreLocalizer manages language and locale parameters including translated strings
        //
        function coreLocalizer() {
 
-           let localizer = {};
+           var localizer = {};
 
-           let _dataLanguages = {};
+           var _dataLanguages = {};
 
            // `localeData` is an object containing all _supported_ locale codes -> language info.
            // {
            // de: { rtl: false, languageNames: {…}, scriptNames: {…} },
            // …
            // }
-           let _dataLocales = {};
+           var _dataLocales = {};
 
            // `localeStrings` is an object containing all _loaded_ locale codes -> string data.
            // {
            // de: { icons: {…}, toolbar: {…}, modes: {…}, operations: {…}, … },
            // …
            // }
-           let _localeStrings = {};
+           var _localeStrings = {};
 
            // the current locale parameters
-           let _localeCode = 'en-US';
-           let _languageCode = 'en';
-           let _textDirection = 'ltr';
-           let _usesMetric = false;
-           let _languageNames = {};
-           let _scriptNames = {};
+           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 = () => _localeCode;
-           localizer.languageCode = () => _languageCode;
-           localizer.textDirection = () => _textDirection;
-           localizer.usesMetric = () => _usesMetric;
-           localizer.languageNames = () => _languageNames;
-           localizer.scriptNames = () => _scriptNames;
+           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;
+           };
 
 
            var _loadPromise;
 
-           localizer.ensureLoaded = () => {
+           localizer.ensureLoaded = function () {
 
-               if (_loadPromise) return _loadPromise;
+               if (_loadPromise) { return _loadPromise; }
 
                return _loadPromise = Promise.all([
                        // load the list of langauges
                        // load the list of supported locales
                        _mainFileFetcher.get('locales')
                    ])
-                   .then(results => {
+                   .then(function (results) {
                        _dataLanguages = results[0];
                        _dataLocales = results[1];
                    })
-                   .then(() => {
-                       const hash = utilStringQs(window.location.hash);
-
-                       if (hash.locale && _dataLocales[hash.locale]) {
-                           // the locale can be manually set in the URL hash
-                           _localeCode = hash.locale;
-                       } else {
-                           // otherwise use the locale specified by the browser
-                           _localeCode = supportedBrowserLocale();
-                       }
+                   .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(_localeCode)
                        ]);
                    })
-                   .then(() => {
+                   .then(function () {
                        updateForCurrentLocale();
                    })
-                   .catch(err => console.error(err));  // eslint-disable-line
+                   .catch(function (err) { return console.error(err); });  // eslint-disable-line
            };
 
-           // Returns the best locale requested by the browser supported by iD, if any
-           function supportedBrowserLocale() {
-               // list of locales preferred by the browser in priority order
-               let browserLocales = utilDetect().browserLocales;
-               let supportedLocales = _dataLocales;
+           // Returns the best locale from `locales` supported by iD, if any
+           function bestSupportedLocale(locales) {
+               var supportedLocales = _dataLocales;
 
-               for (let i in browserLocales) {
-                   let browserLocale = browserLocales[i];
-                   if (browserLocale.includes('-')) { // full locale ('es-ES')
+               var loop = function ( i ) {
+                   var locale = locales[i];
+                   if (locale.includes('-')) { // full locale ('es-ES')
 
-                       if (supportedLocales[browserLocale]) return browserLocale;
+                       if (supportedLocales[locale]) { return { v: locale }; }
 
                        // If full locale not supported ('es-FAKE'), fallback to the base ('es')
-                       let langPart = browserLocale.split('-')[0];
-                       if (supportedLocales[langPart]) return langPart;
+                       var langPart = locale.split('-')[0];
+                       if (supportedLocales[langPart]) { return { v: langPart }; }
 
                    } else { // base locale ('es')
 
                        // prefer a lower-priority full locale with this base ('es' < 'es-ES')
-                       let fullLocale = browserLocales.find((locale, index) => {
+                       var fullLocale = locales.find(function (locale2, index) {
                            return index > i &&
-                               locale !== browserLocale &&
-                               locale.split('-')[0] === browserLocale &&
-                               supportedLocales[locale];
+                               locale2 !== locale &&
+                               locale2.split('-')[0] === locale &&
+                               supportedLocales[locale2];
                        });
-                       if (fullLocale) return fullLocale;
+                       if (fullLocale) { return { v: fullLocale }; }
 
-                       if (supportedLocales[browserLocale]) return browserLocale;
+                       if (supportedLocales[locale]) { return { v: locale }; }
                    }
+               };
+
+               for (var i in locales) {
+                   var returned = loop( i );
+
+                   if ( returned ) return returned.v;
                }
 
                return null;
            }
 
            function updateForCurrentLocale() {
-               if (!_localeCode) return;
+               if (!_localeCode) { return; }
 
                _languageCode = _localeCode.split('-')[0];
 
-               const currentData = _dataLocales[_localeCode] || _dataLocales[_languageCode];
+               var currentData = _dataLocales[_localeCode] || _dataLocales[_languageCode];
 
-               const hash = utilStringQs(window.location.hash);
+               var hash = utilStringQs(window.location.hash);
 
                if (hash.rtl === 'true') {
                    _textDirection = 'rtl';
 
            /* Locales */
            // Returns a Promise to load the strings for the requested locale
-           localizer.loadLocale = (requested) => {
+           localizer.loadLocale = function (requested) {
 
                if (!_dataLocales) {
                    return Promise.reject('loadLocale called before init');
                }
 
-               let locale = requested;
+               var locale = requested;
 
                // US English is the default
-               if (locale.toLowerCase() === 'en-us') locale = 'en';
+               if (locale.toLowerCase() === 'en-us') { locale = 'en'; }
 
                if (!_dataLocales[locale]) {
-                   return Promise.reject(`Unsupported locale: ${requested}`);
+                   return Promise.reject(("Unsupported locale: " + requested));
                }
 
                if (_localeStrings[locale]) {    // already loaded
                    return Promise.resolve(locale);
                }
 
-               let fileMap = _mainFileFetcher.fileMap();
-               const key = `locale_${locale}`;
-               fileMap[key] = `locales/${locale}.json`;
+               var fileMap = _mainFileFetcher.fileMap();
+               var key = "locale_" + locale;
+               fileMap[key] = "locales/" + locale + ".json";
 
                return _mainFileFetcher.get(key)
-                   .then(d => {
+                   .then(function (d) {
                        _localeStrings[locale] = d[locale];
                        return locale;
                    });
                locale = locale || _localeCode;
 
                // US English is the default
-               if (locale.toLowerCase() === 'en-us') locale = 'en';
+               if (locale.toLowerCase() === 'en-us') { locale = 'en'; }
 
-               let path = s
+               var path = s
                  .split('.')
-                 .map(s => s.replace(/<TX_DOT>/g, '.'))
+                 .map(function (s) { return s.replace(/<TX_DOT>/g, '.'); })
                  .reverse();
 
-               let result = _localeStrings[locale];
+               var result = _localeStrings[locale];
 
                while (result !== undefined && path.length) {
                  result = result[path.pop()];
 
                if (result !== undefined) {
                  if (replacements) {
-                   for (let k in replacements) {
-                     const token = `{${k}}`;
-                     const regex = new RegExp(token, 'g');
+                   for (var k in replacements) {
+                     var token = "{" + k + "}";
+                     var regex = new RegExp(token, 'g');
                      result = result.replace(regex, replacements[k]);
                    }
                  }
                  return replacements.default;      // fallback - replacements.default
                }
 
-               const missing = `Missing ${locale} translation: ${s}`;
-               if (typeof console !== 'undefined') console.error(missing);  // eslint-disable-line
+               var missing = "Missing " + locale + " translation: " + s;
+               if (typeof console !== 'undefined') { console.error(missing); }  // eslint-disable-line
 
                return missing;
            };
 
-           localizer.languageName = (code, options) => {
+           localizer.languageName = function (code, options) {
 
                if (_languageNames[code]) {  // name in locale langauge
                  // e.g. "German"
                }
 
                // sometimes we only want the local name
-               if (options && options.localOnly) return null;
+               if (options && options.localOnly) { return null; }
 
-               const langInfo = _dataLanguages[code];
+               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 });
 
                  } else if (langInfo.base && langInfo.script) {
-                   const base = langInfo.base;   // the code of the langauge this is based on
+                   var base = langInfo.base;   // the code of the langauge this is based on
 
                    if (_languageNames[base]) {   // base language name in locale langauge
-                     const scriptCode = langInfo.script;
-                     const script = _scriptNames[scriptCode] || scriptCode;
+                     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 });
 
        // and decorated with some extra methods for searching and matching geometry
        //
        function presetCollection(collection) {
-         const MAXRESULTS = 50;
-         let _this = {};
-         let _memo = {};
+         var MAXRESULTS = 50;
+         var _this = {};
+         var _memo = {};
 
          _this.collection = collection;
 
-         _this.item = (id) => {
-           if (_memo[id]) return _memo[id];
-           const found = _this.collection.find(d => d.id === id);
-           if (found) _memo[id] = found;
+         _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 = (id) => _this.collection.findIndex(d => d.id === id);
+         _this.index = function (id) { return _this.collection.findIndex(function (d) { return d.id === id; }); };
 
-         _this.matchGeometry = (geometry) => {
+         _this.matchGeometry = function (geometry) {
            return presetCollection(
-             _this.collection.filter(d => d.matchGeometry(geometry))
+             _this.collection.filter(function (d) { return d.matchGeometry(geometry); })
            );
          };
 
-         _this.matchAllGeometry = (geometries) => {
+         _this.matchAllGeometry = function (geometries) {
            return presetCollection(
-             _this.collection.filter(d => d && d.matchAllGeometry(geometries))
+             _this.collection.filter(function (d) { return d && d.matchAllGeometry(geometries); })
            );
          };
 
-         _this.matchAnyGeometry = (geometries) => {
+         _this.matchAnyGeometry = function (geometries) {
            return presetCollection(
-             _this.collection.filter(d => geometries.some(geom => d.matchGeometry(geom)))
+             _this.collection.filter(function (d) { return geometries.some(function (geom) { return d.matchGeometry(geom); }); })
            );
          };
 
-         _this.fallback = (geometry) => {
-           let id = geometry;
-           if (id === 'vertex') id = 'point';
+         _this.fallback = function (geometry) {
+           var id = geometry;
+           if (id === 'vertex') { id = 'point'; }
            return _this.item(id);
          };
 
-         _this.search = (value, geometry, countryCode) => {
-           if (!value) return _this;
+         _this.search = function (value, geometry, countryCode) {
+           if (!value) { return _this; }
 
            value = value.toLowerCase().trim();
 
            // match at name beginning or just after a space (e.g. "office" -> match "Law Office")
            function leading(a) {
-             const index = a.indexOf(value);
+             var index = a.indexOf(value);
              return index === 0 || a[index - 1] === ' ';
            }
 
            // match at name beginning only
            function leadingStrict(a) {
-             const index = a.indexOf(value);
+             var index = a.indexOf(value);
              return index === 0;
            }
 
            function sortNames(a, b) {
-             let aCompare = (a.suggestion ? a.originalName : a.name()).toLowerCase();
-             let bCompare = (b.suggestion ? b.originalName : b.name()).toLowerCase();
+             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;
+             if (value === aCompare) { return -1; }
+             if (value === bCompare) { return 1; }
 
              // priority for higher matchScore
-             let i = b.originalScore - a.originalScore;
-             if (i !== 0) return i;
+             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;
+             if (i !== 0) { return i; }
 
              // priority for shorter preset names
              return aCompare.length - bCompare.length;
            }
 
-           let pool = _this.collection;
+           var pool = _this.collection;
            if (countryCode) {
-             pool = pool.filter(a => {
-               if (a.countryCodes && a.countryCodes.indexOf(countryCode) === -1) return false;
-               if (a.notCountryCodes && a.notCountryCodes.indexOf(countryCode) !== -1) return false;
+             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;
              });
            }
-           const searchable = pool.filter(a => a.searchable !== false && a.suggestion !== true);
-           const suggestions = pool.filter(a => a.suggestion === 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
-           const leading_name = searchable
-             .filter(a => leading(a.name().toLowerCase()))
+           var leading_name = searchable
+             .filter(function (a) { return leading(a.name().toLowerCase()); })
              .sort(sortNames);
 
            // matches value to preset suggestion name (original name is unhyphenated)
-           const leading_suggestions = suggestions
-             .filter(a => leadingStrict(a.originalName.toLowerCase()))
+           var leading_suggestions = suggestions
+             .filter(function (a) { return leadingStrict(a.originalName.toLowerCase()); })
              .sort(sortNames);
 
            // matches value to preset.terms values
-           const leading_terms = searchable
-             .filter(a => (a.terms() || []).some(leading));
+           var leading_terms = searchable
+             .filter(function (a) { return (a.terms() || []).some(leading); });
 
            // matches value to preset.tags values
-           const leading_tag_values = searchable
-             .filter(a => Object.values(a.tags || {}).filter(val => val !== '*').some(leading));
+           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
-           const similar_name = searchable
-             .map(a => ({ preset: a, dist: utilEditDistance(value, a.name()) }))
-             .filter(a => a.dist + Math.min(value.length - a.preset.name().length, 0) < 3)
-             .sort((a, b) => a.dist - b.dist)
-             .map(a => a.preset);
+           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)
-           const similar_suggestions = suggestions
-             .map(a => ({ preset: a, dist: utilEditDistance(value, a.originalName.toLowerCase()) }))
-             .filter(a => a.dist + Math.min(value.length - a.preset.originalName.length, 0) < 1)
-             .sort((a, b) => a.dist - b.dist)
-             .map(a => a.preset);
+           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
-           const similar_terms = searchable
-             .filter(a => {
-               return (a.terms() || []).some(b => {
+           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;
                });
              });
 
-           let results = leading_name.concat(
+           var results = leading_name.concat(
              leading_suggestions,
              leading_terms,
              leading_tag_values,
              if (typeof geometry === 'string') {
                results.push(_this.fallback(geometry));
              } else {
-               geometry.forEach(geom => results.push(_this.fallback(geom)));
+               geometry.forEach(function (geom) { return results.push(_this.fallback(geom)); });
              }
            }
 
        // decorated with some extra methods for searching and matching geometry
        //
        function presetCategory(categoryID, category, all) {
-         let _this = Object.assign({}, category);   // shallow copy
+         var _this = Object.assign({}, category);   // shallow copy
 
          _this.id = categoryID;
 
          _this.members = presetCollection(
-           category.members.map(presetID => all.item(presetID)).filter(Boolean)
+           category.members.map(function (presetID) { return all.item(presetID); }).filter(Boolean)
          );
 
          _this.geometry = _this.members.collection
-           .reduce((acc, preset) => {
-             for (let i in preset.geometry) {
-               const geometry = preset.geometry[i];
+           .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 = (geom) => _this.geometry.indexOf(geom) >= 0;
+         _this.matchGeometry = function (geom) { return _this.geometry.indexOf(geom) >= 0; };
 
-         _this.matchAllGeometry = (geometries) => _this.members.collection
-           .some(preset => preset.matchAllGeometry(geometries));
+         _this.matchAllGeometry = function (geometries) { return _this.members.collection
+           .some(function (preset) { return preset.matchAllGeometry(geometries); }); };
 
-         _this.matchScore = () => -1;
+         _this.matchScore = function () { return -1; };
 
-         _this.name = () => _t(`presets.categories.${categoryID}.name`, { 'default': categoryID });
+         _this.name = function () { return _t(("presets.categories." + categoryID + ".name"), { 'default': categoryID }); };
 
-         _this.terms = () => [];
+         _this.terms = function () { return []; };
 
 
          return _this;
        // with some extra methods for searching and matching geometry
        //
        function presetField(fieldID, field) {
-         let _this = Object.assign({}, field);   // shallow copy
+         var _this = Object.assign({}, field);   // shallow copy
 
          _this.id = fieldID;
 
          // for use in classes, element ids, css selectors
          _this.safeid = utilSafeClassName(fieldID);
 
-         _this.matchGeometry = (geom) => !_this.geometry || _this.geometry.indexOf(geom) !== -1;
+         _this.matchGeometry = function (geom) { return !_this.geometry || _this.geometry.indexOf(geom) !== -1; };
 
-         _this.matchAllGeometry = (geometries) => {
-           return !_this.geometry || geometries.every(geom => _this.geometry.indexOf(geom) !== -1);
+         _this.matchAllGeometry = function (geometries) {
+           return !_this.geometry || geometries.every(function (geom) { return _this.geometry.indexOf(geom) !== -1; });
          };
 
-         _this.t = (scope, options) => _t(`presets.fields.${fieldID}.${scope}`, options);
+         _this.t = function (scope, options) { return _t(("presets.fields." + fieldID + "." + scope), options); };
 
-         _this.label = () => _this.overrideLabel || _this.t('label', { 'default': fieldID });
+         _this.label = function () { return _this.overrideLabel || _this.t('label', { 'default': fieldID }); };
 
-         const _placeholder = _this.placeholder;
-         _this.placeholder = () => _this.t('placeholder', { 'default': _placeholder });
+         var _placeholder = _this.placeholder;
+         _this.placeholder = function () { return _this.t('placeholder', { 'default': _placeholder }); };
 
          _this.originalTerms = (_this.terms || []).join();
 
-         _this.terms = () => _this.t('terms', { 'default': _this.originalTerms })
-           .toLowerCase().trim().split(/\s*,+\s*/);
+         _this.terms = function () { return _this.t('terms', { 'default': _this.originalTerms })
+           .toLowerCase().trim().split(/\s*,+\s*/); };
 
 
          return _this;
        function presetPreset(presetID, preset, addable, allFields, allPresets) {
          allFields = allFields || {};
          allPresets = allPresets || {};
-         let _this = Object.assign({}, preset);   // shallow copy
-         let _addable = addable || false;
-         let _resolvedFields;      // cache
-         let _resolvedMoreFields;  // cache
+         var _this = Object.assign({}, preset);   // shallow copy
+         var _addable = addable || false;
+         var _resolvedFields;      // cache
+         var _resolvedMoreFields;  // cache
 
          _this.id = presetID;
 
 
          _this.originalMoreFields = (_this.moreFields || []);
 
-         _this.fields = () => _resolvedFields || (_resolvedFields = resolve('fields'));
+         _this.fields = function () { return _resolvedFields || (_resolvedFields = resolve('fields')); };
 
-         _this.moreFields = () => _resolvedMoreFields || (_resolvedMoreFields = resolve('moreFields'));
+         _this.moreFields = function () { return _resolvedMoreFields || (_resolvedMoreFields = resolve('moreFields')); };
 
-         _this.resetFields = () => _resolvedFields = _resolvedMoreFields = null;
+         _this.resetFields = function () { return _resolvedFields = _resolvedMoreFields = null; };
 
          _this.tags = _this.tags || {};
 
 
          _this.geometry = (_this.geometry || []);
 
-         _this.matchGeometry = (geom) => _this.geometry.indexOf(geom) >= 0;
+         _this.matchGeometry = function (geom) { return _this.geometry.indexOf(geom) >= 0; };
 
-         _this.matchAllGeometry = (geoms) => geoms.every(_this.matchGeometry);
+         _this.matchAllGeometry = function (geoms) { return geoms.every(_this.matchGeometry); };
 
-         _this.matchScore = (entityTags) => {
-           const tags = _this.tags;
-           let seen = {};
-           let score = 0;
+         _this.matchScore = function (entityTags) {
+           var tags = _this.tags;
+           var seen = {};
+           var score = 0;
 
            // match on tags
-           for (let k in tags) {
+           for (var k in tags) {
              seen[k] = true;
              if (entityTags[k] === tags[k]) {
                score += _this.originalScore;
            }
 
            // boost score for additional matches in addTags - #6802
-           const addTags = _this.addTags;
-           for (let k in addTags) {
-             if (!seen[k] && entityTags[k] === addTags[k]) {
+           var addTags = _this.addTags;
+           for (var k$1 in addTags) {
+             if (!seen[k$1] && entityTags[k$1] === addTags[k$1]) {
                score += _this.originalScore;
              }
            }
          };
 
 
-         let _textCache = {};
-         _this.t = (scope, options) => {
-           const textID = `presets.presets.${presetID}.${scope}`;
-           if (_textCache[textID]) return _textCache[textID];
+         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.name = () => {
+         _this.name = function () {
            if (_this.suggestion) {
-             let path = presetID.split('/');
+             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');
          };
 
 
-         _this.terms = () => _this.t('terms', { 'default': _this.originalTerms })
-           .toLowerCase().trim().split(/\s*,+\s*/);
+         _this.terms = function () { return _this.t('terms', { 'default': _this.originalTerms })
+           .toLowerCase().trim().split(/\s*,+\s*/); };
 
 
-         _this.isFallback = () => {
-           const tagCount = Object.keys(_this.tags).length;
+         _this.isFallback = function () {
+           var tagCount = Object.keys(_this.tags).length;
            return tagCount === 0 || (tagCount === 1 && _this.tags.hasOwnProperty('area'));
          };
 
 
          _this.addable = function(val) {
-           if (!arguments.length) return _addable;
+           if (!arguments.length) { return _addable; }
            _addable = val;
            return _this;
          };
 
 
-         _this.reference = (geom) => {
+         _this.reference = function (geom) {
            // Lookup documentation on Wikidata...
-           const qid = _this.tags.wikidata || _this.tags['brand:wikidata'] || _this.tags['operator:wikidata'];
+           var qid = _this.tags.wikidata || _this.tags['brand:wikidata'] || _this.tags['operator:wikidata'];
            if (qid) {
              return { qid: qid };
            }
 
            // Lookup documentation on OSM Wikibase...
-           let key = _this.originalReference.key || Object.keys(utilObjectOmit(_this.tags, 'name'))[0];
-           let value = _this.originalReference.value || _this.tags[key];
+           var key = _this.originalReference.key || Object.keys(utilObjectOmit(_this.tags, 'name'))[0];
+           var value = _this.originalReference.value || _this.tags[key];
 
            if (geom === 'relation' && key === 'type') {
              if (value in _this.tags) {
          };
 
 
-         _this.unsetTags = (tags, geometry, skipFieldDefaults) => {
+         _this.unsetTags = function (tags, geometry, skipFieldDefaults) {
            tags = utilObjectOmit(tags, Object.keys(_this.removeTags));
 
            if (geometry && !skipFieldDefaults) {
-             _this.fields().forEach(field => {
+             _this.fields().forEach(function (field) {
                if (field.matchGeometry(geometry) && field.key && field.default === tags[field.key]) {
                  delete tags[field.key];
                }
          };
 
 
-         _this.setTags = (tags, geometry, skipFieldDefaults) => {
-           const addTags = _this.addTags;
+         _this.setTags = function (tags, geometry, skipFieldDefaults) {
+           var addTags = _this.addTags;
            tags = Object.assign({}, tags);   // shallow copy
 
-           for (let k in addTags) {
+           for (var k in addTags) {
              if (addTags[k] === '*') {
                tags[k] = 'yes';
              } else {
            if (!addTags.hasOwnProperty('area')) {
              delete tags.area;
              if (geometry === 'area') {
-               let needsAreaTag = true;
+               var needsAreaTag = true;
                if (_this.geometry.indexOf('line') === -1) {
-                 for (let k in addTags) {
-                   if (k in osmAreaKeys) {
+                 for (var k$1 in addTags) {
+                   if (k$1 in osmAreaKeys) {
                      needsAreaTag = false;
                      break;
                    }
            }
 
            if (geometry && !skipFieldDefaults) {
-             _this.fields().forEach(field => {
+             _this.fields().forEach(function (field) {
                if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
                  tags[field.key] = field.default;
                }
          // 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) {
-           const fieldIDs = (which === 'fields' ? _this.originalFields : _this.originalMoreFields);
-           let resolved = [];
+           var fieldIDs = (which === 'fields' ? _this.originalFields : _this.originalMoreFields);
+           var resolved = [];
 
-           fieldIDs.forEach(fieldID => {
-             const match = fieldID.match(/\{(.*)\}/);
+           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
+               console.log(("Cannot resolve \"" + fieldID + "\" found in " + (_this.id) + "." + which));  // eslint-disable-line no-console
              }
            });
 
            // no fields resolved, so use the parent's if possible
            if (!resolved.length) {
-             const endIndex = _this.id.lastIndexOf('/');
-             const parentID = endIndex && _this.id.substring(0, endIndex);
+             var endIndex = _this.id.lastIndexOf('/');
+             var parentID = endIndex && _this.id.substring(0, endIndex);
              if (parentID) {
                resolved = inheritFields(parentID, which);
              }
 
            // returns an array of fields to inherit from the given presetID, if found
            function inheritFields(presetID, which) {
-             const parent = allPresets[presetID];
-             if (!parent) return [];
+             var parent = allPresets[presetID];
+             if (!parent) { return []; }
 
              if (which === 'fields') {
                return parent.fields().filter(shouldInherit);
              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;
+             ) { return false; }
 
              return true;
            }
          return _this;
        }
 
-       let _mainPresetIndex = presetIndex(); // singleton
+       var _mainPresetIndex = presetIndex(); // singleton
 
        //
        // `presetIndex` wraps a `presetCollection`
        // with methods for loading new data and returning defaults
        //
        function presetIndex() {
-         const dispatch$1 = dispatch('favoritePreset', 'recentsChange');
-         const MAXRECENTS = 30;
+         var dispatch$1 = dispatch('favoritePreset', 'recentsChange');
+         var MAXRECENTS = 30;
 
          // seed the preset lists with geometry fallbacks
-         const POINT = presetPreset('point', { name: 'Point', tags: {}, geometry: ['point', 'vertex'], matchScore: 0.1 } );
-         const LINE = presetPreset('line', { name: 'Line', tags: {}, geometry: ['line'], matchScore: 0.1 } );
-         const AREA = presetPreset('area', { name: 'Area', tags: { area: 'yes' }, geometry: ['area'], matchScore: 0.1 } );
-         const RELATION = presetPreset('relation', { name: 'Relation', tags: {}, geometry: ['relation'], matchScore: 0.1 } );
+         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 } );
 
-         let _this = presetCollection([POINT, LINE, AREA, RELATION]);
-         let _presets = { point: POINT, line: LINE, area: AREA, relation: RELATION };
+         var _this = presetCollection([POINT, LINE, AREA, RELATION]);
+         var _presets = { point: POINT, line: LINE, area: AREA, relation: RELATION };
 
-         let _defaults = {
+         var _defaults = {
            point: presetCollection([POINT]),
            vertex: presetCollection([POINT]),
            line: presetCollection([LINE]),
            relation: presetCollection([RELATION])
          };
 
-         let _fields = {};
-         let _categories = {};
-         let _universal = [];
-         let _addablePresetIDs = null;   // Set of preset IDs that the user can add
-         let _recents;
-         let _favorites;
+         var _fields = {};
+         var _categories = {};
+         var _universal = [];
+         var _addablePresetIDs = null;   // Set of preset IDs that the user can add
+         var _recents;
+         var _favorites;
 
          // Index of presets by (geometry, tag key).
-         let _geometryIndex = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
+         var _geometryIndex = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
 
-         let _loadPromise;
+         var _loadPromise;
 
-         _this.ensureLoaded = () => {
-           if (_loadPromise) return _loadPromise;
+         _this.ensureLoaded = function () {
+           if (_loadPromise) { return _loadPromise; }
 
            return _loadPromise = Promise.all([
                _mainFileFetcher.get('preset_categories'),
                _mainFileFetcher.get('preset_presets'),
                _mainFileFetcher.get('preset_fields')
              ])
-             .then(vals => {
+             .then(function (vals) {
                _this.merge({
                  categories: vals[0],
                  defaults: vals[1],
          };
 
 
-         _this.merge = (d) => {
+         _this.merge = function (d) {
            // Merge Fields
            if (d.fields) {
-             Object.keys(d.fields).forEach(fieldID => {
-               const f = d.fields[fieldID];
+             Object.keys(d.fields).forEach(function (fieldID) {
+               var f = d.fields[fieldID];
                if (f) {   // add or replace
                  _fields[fieldID] = presetField(fieldID, f);
                } else {   // remove
 
            // Merge Presets
            if (d.presets) {
-             Object.keys(d.presets).forEach(presetID => {
-               const p = d.presets[presetID];
+             Object.keys(d.presets).forEach(function (presetID) {
+               var p = d.presets[presetID];
                if (p) {   // add or replace
-                 const isAddable = !_addablePresetIDs || _addablePresetIDs.has(presetID);
+                 var isAddable = !_addablePresetIDs || _addablePresetIDs.has(presetID);
                  _presets[presetID] = presetPreset(presetID, p, isAddable, _fields, _presets);
                } else {   // remove (but not if it's a fallback)
-                 const existing = _presets[presetID];
+                 var existing = _presets[presetID];
                  if (existing && !existing.isFallback()) {
                    delete _presets[presetID];
                  }
 
            // Merge Categories
            if (d.categories) {
-             Object.keys(d.categories).forEach(categoryID => {
-               const c = d.categories[categoryID];
+             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
 
            // Merge Defaults
            if (d.defaults) {
-             Object.keys(d.defaults).forEach(geometry => {
-               const def = d.defaults[geometry];
+             Object.keys(d.defaults).forEach(function (geometry) {
+               var def = d.defaults[geometry];
                if (Array.isArray(def)) {   // add or replace
                  _defaults[geometry] = presetCollection(
-                   def.map(id => _presets[id] || _categories[id]).filter(Boolean)
+                   def.map(function (id) { return _presets[id] || _categories[id]; }).filter(Boolean)
                  );
                } else {   // remove
                  delete _defaults[geometry];
            }
 
            // Rebuild universal fields array
-           _universal = Object.values(_fields).filter(field => field.universal);
+           _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(preset => preset.resetFields());
+           Object.values(_presets).forEach(function (preset) { return preset.resetFields(); });
 
            // Rebuild geometry index
            _geometryIndex = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
-           _this.collection.forEach(preset => {
-             (preset.geometry || []).forEach(geometry => {
-               let g = _geometryIndex[geometry];
-               for (let key in preset.tags) {
+           _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);
                }
              });
          };
 
 
-         _this.match = (entity, resolver) => {
-           return resolver.transient(entity, 'presetMatch', () => {
-             let geometry = entity.geometry(resolver);
+         _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';
          };
 
 
-         _this.matchTags = (tags, geometry) => {
-           const geometryMatches = _geometryIndex[geometry];
-           let address;
-           let best = -1;
-           let match;
+         _this.matchTags = function (tags, geometry) {
+           var geometryMatches = _geometryIndex[geometry];
+           var address;
+           var best = -1;
+           var match;
 
-           for (let k in tags) {
+           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];
              }
 
-             const keyMatches = geometryMatches[k];
-             if (!keyMatches) continue;
+             var keyMatches = geometryMatches[k];
+             if (!keyMatches) { continue; }
 
-             for (let i = 0; i < keyMatches.length; i++) {
-               const score = keyMatches[i].matchScore(tags);
+             for (var i = 0; i < keyMatches.length; i++) {
+               var score = keyMatches[i].matchScore(tags);
                if (score > best) {
                  best = score;
                  match = keyMatches[i];
          };
 
 
-         _this.allowsVertex = (entity, resolver) => {
-           if (entity.type !== 'node') return false;
-           if (Object.keys(entity.tags).length === 0) return true;
+         _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', () => {
+           return resolver.transient(entity, 'vertexMatch', function () {
              // address lines allow vertices to act as standalone points
-             if (entity.isOnAddressLine(resolver)) return true;
+             if (entity.isOnAddressLine(resolver)) { return true; }
 
-             const geometries = osmNodeGeometriesForTags(entity.tags);
-             if (geometries.vertex) return true;
-             if (geometries.point) return false;
+             var geometries = osmNodeGeometriesForTags(entity.tags);
+             if (geometries.vertex) { return true; }
+             if (geometries.point) { return false; }
              // allow vertices for unspecified points
              return true;
            });
          // 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 = () => {
+         _this.areaKeys = function () {
            // The ignore list is for keys that imply lines. (We always add `area=yes` for exceptions)
-           const ignore = ['barrier', 'highway', 'footway', 'railway', 'junction', 'type'];
-           let areaKeys = {};
+           var ignore = ['barrier', 'highway', 'footway', 'railway', 'junction', 'type'];
+           var areaKeys = {};
 
            // ignore name-suggestion-index and deprecated presets
-           const presets = _this.collection.filter(p => !p.suggestion && !p.replacement);
+           var presets = _this.collection.filter(function (p) { return !p.suggestion && !p.replacement; });
 
            // keeplist
-           presets.forEach(p => {
-             let key;
-             for (key in p.tags) break;  // pick the first tag
-             if (!key) return;
-             if (ignore.indexOf(key) !== -1) return;
+           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; }
 
              if (p.geometry.indexOf('area') !== -1) {    // probably an area..
                areaKeys[key] = areaKeys[key] || {};
            });
 
            // discardlist
-           presets.forEach(p => {
-             let key;
+           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
-               const value = p.addTags[key];
+               var value = p.addTags[key];
                if (key in areaKeys &&                    // probably an area...
                  p.geometry.indexOf('line') !== -1 &&    // but sometimes a line
                  value !== '*') {
          };
 
 
-         _this.pointTags = () => {
-           return _this.collection.reduce((pointTags, d) => {
+         _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;
+             if (d.suggestion || d.replacement || d.searchable === false) { return pointTags; }
 
              // only care about the primary tag
-             let key;
-             for (key in d.tags) break;  // pick the first tag
-             if (!key) return pointTags;
+             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) {
          };
 
 
-         _this.vertexTags = () => {
-           return _this.collection.reduce((vertexTags, d) => {
+         _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;
+             if (d.suggestion || d.replacement || d.searchable === false) { return vertexTags; }
 
              // only care about the primary tag
-             let key;
-             for (key in d.tags) break;   // pick the first tag
-             if (!key) return vertexTags;
+             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) {
          };
 
 
-         _this.field = (id) => _fields[id];
+         _this.field = function (id) { return _fields[id]; };
 
-         _this.universal = () => _universal;
+         _this.universal = function () { return _universal; };
 
 
-         _this.defaults = (geometry, n, startWithRecents) => {
-           let recents = [];
+         _this.defaults = function (geometry, n, startWithRecents) {
+           var recents = [];
            if (startWithRecents) {
              recents = _this.recent().matchGeometry(geometry).collection.slice(0, 4);
            }
-           let defaults;
+           var defaults;
            if (_addablePresetIDs) {
              defaults = Array.from(_addablePresetIDs).map(function(id) {
                var preset = _this.item(id);
-               if (preset && preset.matchGeometry(geometry)) return preset;
+               if (preset && preset.matchGeometry(geometry)) { return preset; }
                return null;
              }).filter(Boolean);
            } else {
 
          // pass a Set of addable preset ids
          _this.addablePresetIDs = function(val) {
-           if (!arguments.length) return _addablePresetIDs;
+           if (!arguments.length) { return _addablePresetIDs; }
 
            // accept and convert arrays
-           if (Array.isArray(val)) val = new Set(val);
+           if (Array.isArray(val)) { val = new Set(val); }
 
            _addablePresetIDs = val;
            if (_addablePresetIDs) {   // reset all presets
-             _this.collection.forEach(p => {
+             _this.collection.forEach(function (p) {
                // categories aren't addable
-               if (p.addable) p.addable(_addablePresetIDs.has(p.id));
+               if (p.addable) { p.addable(_addablePresetIDs.has(p.id)); }
              });
            } else {
-             _this.collection.forEach(p => {
-               if (p.addable) p.addable(true);
+             _this.collection.forEach(function (p) {
+               if (p.addable) { p.addable(true); }
              });
            }
 
          };
 
 
-         _this.recent = () => {
+         _this.recent = function () {
            return presetCollection(
-             utilArrayUniq(_this.getRecents().map(d => d.preset))
+             utilArrayUniq(_this.getRecents().map(function (d) { return d.preset; }))
            );
          };
 
 
          function RibbonItem(preset, source) {
-           let item = {};
+           var item = {};
            item.preset = preset;
            item.source = source;
 
-           item.isFavorite = () => item.source === 'favorite';
-           item.isRecent = () => item.source === 'recent';
-           item.matches = (preset) => item.preset.id === preset.id;
-           item.minified = () => ({ pID: item.preset.id });
+           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 ribbonItemForMinified(d, source) {
            if (d && d.pID) {
-             const preset = _this.item(d.pID);
-             if (!preset) return null;
+             var preset = _this.item(d.pID);
+             if (!preset) { return null; }
              return RibbonItem(preset, source);
            }
            return null;
          }
 
 
-         _this.getGenericRibbonItems = () => {
-           return ['point', 'line', 'area'].map(id => RibbonItem(_this.item(id), 'generic'));
+         _this.getGenericRibbonItems = function () {
+           return ['point', 'line', 'area'].map(function (id) { return RibbonItem(_this.item(id), 'generic'); });
          };
 
 
-         _this.getAddable = () => {
-             if (!_addablePresetIDs) return [];
+         _this.getAddable = function () {
+             if (!_addablePresetIDs) { return []; }
 
-             return _addablePresetIDs.map((id) => {
-               const preset = _this.item(id);
+             return _addablePresetIDs.map(function (id) {
+               var preset = _this.item(id);
                if (preset) {
                  return RibbonItem(preset, 'addable');
                }
 
          function setRecents(items) {
            _recents = items;
-           const minifiedItems = items.map(d => d.minified());
+           var minifiedItems = items.map(function (d) { return d.minified(); });
            corePreferences('preset_recents', JSON.stringify(minifiedItems));
            dispatch$1.call('recentsChange');
          }
 
 
-         _this.getRecents = () => {
+         _this.getRecents = function () {
            if (!_recents) {
              // fetch from local storage
              _recents = (JSON.parse(corePreferences('preset_recents')) || [])
-               .reduce((acc, d) => {
-                 let item = ribbonItemForMinified(d, 'recent');
-                 if (item && item.preset.addable()) acc.push(item);
+               .reduce(function (acc, d) {
+                 var item = ribbonItemForMinified(d, 'recent');
+                 if (item && item.preset.addable()) { acc.push(item); }
                  return acc;
                }, []);
            }
          };
 
 
-         _this.addRecent = (preset, besidePreset, after) => {
-           const recents = _this.getRecents();
+         _this.addRecent = function (preset, besidePreset, after) {
+           var recents = _this.getRecents();
 
-           const beforeItem = _this.recentMatching(besidePreset);
-           let toIndex = recents.indexOf(beforeItem);
-           if (after) toIndex += 1;
+           var beforeItem = _this.recentMatching(besidePreset);
+           var toIndex = recents.indexOf(beforeItem);
+           if (after) { toIndex += 1; }
 
-           const newItem = RibbonItem(preset, 'recent');
+           var newItem = RibbonItem(preset, 'recent');
            recents.splice(toIndex, 0, newItem);
            setRecents(recents);
          };
 
 
-         _this.removeRecent = (preset) => {
-           const item = _this.recentMatching(preset);
+         _this.removeRecent = function (preset) {
+           var item = _this.recentMatching(preset);
            if (item) {
-             let items = _this.getRecents();
+             var items = _this.getRecents();
              items.splice(items.indexOf(item), 1);
              setRecents(items);
            }
          };
 
 
-         _this.recentMatching = (preset) => {
-           const items = _this.getRecents();
-           for (let i in items) {
+         _this.recentMatching = function (preset) {
+           var items = _this.getRecents();
+           for (var i in items) {
              if (items[i].matches(preset)) {
                return items[i];
              }
          };
 
 
-         _this.moveItem = (items, fromIndex, toIndex) => {
+         _this.moveItem = function (items, fromIndex, toIndex) {
            if (fromIndex === toIndex ||
              fromIndex < 0 || toIndex < 0 ||
              fromIndex >= items.length || toIndex >= items.length
-           ) return null;
+           ) { return null; }
 
            items.splice(toIndex, 0, items.splice(fromIndex, 1)[0]);
            return items;
          };
 
 
-         _this.moveRecent = (item, beforeItem) => {
-           const recents = _this.getRecents();
-           const fromIndex = recents.indexOf(item);
-           const toIndex = recents.indexOf(beforeItem);
-           const items = _this.moveItem(recents, fromIndex, toIndex);
-           if (items) setRecents(items);
+         _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); }
          };
 
 
-         _this.setMostRecent = (preset) => {
-           if (preset.searchable === false) return;
+         _this.setMostRecent = function (preset) {
+           if (preset.searchable === false) { return; }
 
-           let items = _this.getRecents();
-           let item = _this.recentMatching(preset);
+           var items = _this.getRecents();
+           var item = _this.recentMatching(preset);
            if (item) {
              items.splice(items.indexOf(item), 1);
            } else {
 
          function setFavorites(items) {
            _favorites = items;
-           const minifiedItems = items.map(d => d.minified());
+           var minifiedItems = items.map(function (d) { return d.minified(); });
            corePreferences('preset_favorites', JSON.stringify(minifiedItems));
 
            // call update
            dispatch$1.call('favoritePreset');
          }
 
-         _this.addFavorite = (preset, besidePreset, after) => {
-             const favorites = _this.getFavorites();
+         _this.addFavorite = function (preset, besidePreset, after) {
+             var favorites = _this.getFavorites();
 
-             const beforeItem = _this.favoriteMatching(besidePreset);
-             let toIndex = favorites.indexOf(beforeItem);
-             if (after) toIndex += 1;
+             var beforeItem = _this.favoriteMatching(besidePreset);
+             var toIndex = favorites.indexOf(beforeItem);
+             if (after) { toIndex += 1; }
 
-             const newItem = RibbonItem(preset, 'favorite');
+             var newItem = RibbonItem(preset, 'favorite');
              favorites.splice(toIndex, 0, newItem);
              setFavorites(favorites);
          };
 
-         _this.toggleFavorite = (preset) => {
-           const favs = _this.getFavorites();
-           const favorite = _this.favoriteMatching(preset);
+         _this.toggleFavorite = function (preset) {
+           var favs = _this.getFavorites();
+           var favorite = _this.favoriteMatching(preset);
            if (favorite) {
              favs.splice(favs.indexOf(favorite), 1);
            } else {
          };
 
 
-         _this.removeFavorite = (preset) => {
-           const item = _this.favoriteMatching(preset);
+         _this.removeFavorite = function (preset) {
+           var item = _this.favoriteMatching(preset);
            if (item) {
-             const items = _this.getFavorites();
+             var items = _this.getFavorites();
              items.splice(items.indexOf(item), 1);
              setFavorites(items);
            }
          };
 
 
-         _this.getFavorites = () => {
+         _this.getFavorites = function () {
            if (!_favorites) {
 
              // fetch from local storage
-             let rawFavorites = JSON.parse(corePreferences('preset_favorites'));
+             var rawFavorites = JSON.parse(corePreferences('preset_favorites'));
 
              if (!rawFavorites) {
                rawFavorites = [];
                corePreferences('preset_favorites', JSON.stringify(rawFavorites));
              }
 
-             _favorites = rawFavorites.reduce((output, d) => {
-               const item = ribbonItemForMinified(d, 'favorite');
-               if (item && item.preset.addable()) output.push(item);
+             _favorites = rawFavorites.reduce(function (output, d) {
+               var item = ribbonItemForMinified(d, 'favorite');
+               if (item && item.preset.addable()) { output.push(item); }
                return output;
              }, []);
            }
          };
 
 
-         _this.favoriteMatching = (preset) => {
-           const favs = _this.getFavorites();
-           for (let index in favs) {
+         _this.favoriteMatching = function (preset) {
+           var favs = _this.getFavorites();
+           for (var index in favs) {
              if (favs[index].matches(preset)) {
                return favs[index];
              }
 
            function collectShallowDescendants(id) {
                var entity = graph.hasEntity(id);
-               if (!entity || entity.type !== 'relation') return;
+               if (!entity || entity.type !== 'relation') { return; }
 
                entity.members
                    .map(function(member) { return member.id; })
            return Array.from(seen);
 
            function collectDeepDescendants(id) {
-               if (seen.has(id)) return;
+               if (seen.has(id)) { return; }
                seen.add(id);
 
                var entity = graph.hasEntity(id);
-               if (!entity || entity.type !== 'relation') return;
+               if (!entity || entity.type !== 'relation') { return; }
 
                entity.members
                    .map(function(member) { return member.id; })
            return utilEntitySelector(Array.from(returners));
 
            function collectDeepDescendants(id) {
-               if (seen.has(id)) return;
+               if (seen.has(id)) { return; }
                seen.add(id);
 
                if (!idsSet.has(id)) {
                }
 
                var entity = graph.hasEntity(id);
-               if (!entity || entity.type !== 'relation') return;
-               if (skipMultipolgonMembers && entity.isMultipolygon()) return;
+               if (!entity || entity.type !== 'relation') { return; }
+               if (skipMultipolgonMembers && entity.isMultipolygon()) { return; }
                entity.members
                    .map(function(member) { return member.id; })
                    .forEach(collectDeepDescendants);   // recurse
            return Array.from(nodes);
 
            function collectNodes(id) {
-               if (seen.has(id)) return;
+               if (seen.has(id)) { return; }
                seen.add(id);
 
                var entity = graph.hasEntity(id);
-               if (!entity) return;
+               if (!entity) { return; }
 
                if (entity.type === 'node') {
                    nodes.add(entity);
                    }
 
                    var tagHash = key + '=' + value;
-                   if (!tagCounts[tagHash]) tagCounts[tagHash] = 0;
+                   if (!tagCounts[tagHash]) { tagCounts[tagHash] = 0; }
                    tagCounts[tagHash] += 1;
                });
            });
 
            for (var key in tags) {
-               if (!Array.isArray(tags[key])) continue;
+               if (!Array.isArray(tags[key])) { continue; }
 
                // sort values by frequency then alphabetically
                tags[key] = tags[key].sort(function(val1, val2) {
 
        function utilStringQs(str) {
            var i = 0;  // advance past any leading '?' or '#' characters
-           while (i < str.length && (str[i] === '?' || str[i] === '#')) i++;
+           while (i < str.length && (str[i] === '?' || str[i] === '#')) { i++; }
            str = str.slice(i);
 
            return str.split('&').reduce(function(obj, pair){
            var s = document.body;
 
            if (property in s)
-               return property;
+               { return property; }
 
            property = property.substr(0, 1).toUpperCase() + property.substr(1);
 
        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;
+           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; }
                    errors[i] = err;
                    results[i] = data;
                    remaining--;
-                   if (!remaining) callback(errors, results);
+                   if (!remaining) { callback(errors, results); }
                });
            });
        }
         * @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;
+           if (typeof value === 'function') { return value; }
            return function() {
                return value;
            };
 
        function osmEntity(attrs) {
            // For prototypal inheritance.
-           if (this instanceof osmEntity) return;
+           if (this instanceof osmEntity) { return; }
 
            // Create the appropriate subtype.
            if (attrs && attrs.type) {
 
            copy: function(resolver, copies) {
                if (copies[this.id])
-                   return copies[this.id];
+                   { return copies[this.id]; }
 
                var copy = osmEntity(this, { id: undefined, user: undefined, version: undefined });
                copies[this.id] = copy;
                var tags = this.tags;
 
                // if there are no tags, none can be deprecated
-               if (Object.keys(tags).length === 0) return [];
+               if (Object.keys(tags).length === 0) { return []; }
 
                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;
+                       if (!tags[oldKey]) { return false; }
+                       if (d.old[oldKey] === '*') { return true; }
 
                        var vals = tags[oldKey].split(';').filter(Boolean);
                        if (vals.length === 0) {
        };
 
        function osmLanes(entity) {
-           if (entity.type !== 'way') return null;
-           if (!entity.tags.highway) return null;
+           if (entity.type !== 'way') { return null; }
+           if (!entity.tags.highway) { return null; }
 
            var tags = entity.tags;
            var isOneWay = entity.isOneWay();
 
        function parseMaxspeed(tags) {
            var maxspeed = tags.maxspeed;
-           if (!maxspeed) return;
+           if (!maxspeed) { return; }
 
            var maxspeedRegex = /^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/;
-           if (!maxspeedRegex.test(maxspeed)) return;
+           if (!maxspeedRegex.test(maxspeed)) { return; }
 
            return parseInt(maxspeed, 10);
        }
 
 
        function parseTurnLanes(tag){
-           if (!tag) return;
+           if (!tag) { return; }
 
            var validValues = [
                'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right',
 
            return tag.split('|')
                .map(function (s) {
-                   if (s === '') s = 'none';
+                   if (s === '') { s = 'none'; }
                    return s.split(';')
                        .map(function (d) {
                            return validValues.indexOf(d) === -1 ? 'unknown': d;
 
 
        function parseMaxspeedLanes(tag, maxspeed) {
-           if (!tag) return;
+           if (!tag) { return; }
 
            return tag.split('|')
                .map(function (s) {
-                   if (s === 'none') return s;
+                   if (s === 'none') { return s; }
                    var m = parseInt(s, 10);
-                   if (s === '' || m === maxspeed) return null;
+                   if (s === '' || m === maxspeed) { return null; }
                    return isNaN(m) ? 'unknown': m;
                });
        }
 
 
        function parseMiscLanes(tag) {
-           if (!tag) return;
+           if (!tag) { return; }
 
            var validValues = [
                'yes', 'no', 'designated'
 
            return tag.split('|')
                .map(function (s) {
-                   if (s === '') s = 'no';
+                   if (s === '') { s = 'no'; }
                    return validValues.indexOf(s) === -1 ? 'unknown': s;
                });
        }
 
 
        function parseBicycleWay(tag) {
-           if (!tag) return;
+           if (!tag) { return; }
 
            var validValues = [
                'yes', 'no', 'designated', 'lane'
 
            return tag.split('|')
                .map(function (s) {
-                   if (s === '') s = 'no';
+                   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] = {};
+           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] = {};
+           }); }
+           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] = {};
+           }); }
+           if (data.unspecified) data.unspecified.forEach(function(l, i) {
+               if (!lanesObj.unspecified[i]) { lanesObj.unspecified[i] = {}; }
                lanesObj.unspecified[i][key] = l;
-           });
+           }); }
        }
 
        function osmWay() {
 
 
            copy: function(resolver, copies) {
-               if (copies[this.id]) return copies[this.id];
+               if (copies[this.id]) { return copies[this.id]; }
 
                var copy = osmEntity.prototype.copy.call(this, resolver, copies);
 
 
 
            affix: function(node) {
-               if (this.nodes[0] === node) return 'prefix';
-               if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
+               if (this.nodes[0] === node) { return 'prefix'; }
+               if (this.nodes[this.nodes.length - 1] === node) { return 'suffix'; }
            },
 
 
                }
 
                // 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;
+               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;
            },
 
                        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;
+                           if (!laneCount) { laneCount = this.isOneWay() ? 1 : 2; }
 
                            return width * laneCount;
                        }
                // implied oneway tag..
                for (var key in this.tags) {
                    if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
-                       return true;
+                       { return true; }
                }
                return false;
            },
 
 
            isConvex: function(resolver) {
-               if (!this.isClosed() || this.isDegenerate()) return null;
+               if (!this.isClosed() || this.isDegenerate()) { return null; }
 
                var nodes = utilArrayUniq(resolver.childNodes(this));
                var coords = nodes.map(function(n) { return n.loc; });
 
            isArea: function() {
                if (this.tags.area === 'yes')
-                   return true;
+                   { return true; }
                if (!this.isClosed() || this.tags.area === 'no')
-                   return false;
+                   { return false; }
                return this.tagSuggestingArea() !== null;
            },
 
            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;
+                       if (this.nodes[i - 1] === n2) { return true; }
+                       if (this.nodes[i + 1] === n2) { return true; }
                    }
                }
                return false;
 
            // 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;
+               if (this.isClosed() || !this.nodes.length) { return this; }
 
                var nodes = this.nodes.slice();
                nodes = nodes.filter(noRepeatNodes);
 
            // 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;
+               if (!this.isClosed()) { return this; }
 
                var nodes = this.nodes.slice();
                var connector = this.first();
                    var i = 1;
                    while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
                        nodes.splice(i, 1);
-                       if (index > i) index--;
+                       if (index > i) { index--; }
                    }
 
                    // trailing connectors..
                    i = nodes.length - 1;
                    while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
                        nodes.splice(i, 1);
-                       if (index > i) index--;
+                       if (index > i) { index--; }
                        i = nodes.length - 1;
                    }
                }
                    var i = 1;
                    while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
                        nodes.splice(i, 1);
-                       if (index > i) index--;
+                       if (index > i) { index--; }
                    }
 
                    // 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
+                       if (index === i) { index = 0; }  // update leading connector instead
                        i = nodes.length - 1;
                    }
                }
            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;
+                   if (outerMember) { return false; }
+                   if (member.type !== 'way') { return false; }
+                   if (!graph.hasEntity(member.id)) { return false; }
 
                    outerMember = graph.entity(member.id);
 
        // 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;
+               { return false; }
 
            var parents = graph.parentRelations(entity);
            if (parents.length !== 1)
-               return false;
+               { return false; }
 
            var parent = parents[0];
            if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
-               return false;
+               { return false; }
 
            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
+                   { return false; } // Not outer member
                if (member.id !== entity.id && (!member.role || member.role === 'outer'))
-                   return false; // Not a simple multipolygon
+                   { return false; } // Not a simple multipolygon
            }
 
            return parent;
 
        function osmOldMultipolygonOuterMember(entity, graph) {
            if (entity.type !== 'way')
-               return false;
+               { return false; }
 
            var parents = graph.parentRelations(entity);
            if (parents.length !== 1)
-               return false;
+               { return false; }
 
            var parent = parents[0];
            if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
-               return false;
+               { return false; }
 
            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
+                       { return false; } // Not a simple multipolygon
                    outerMember = member;
                }
            }
 
            if (!outerMember)
-               return false;
+               { return false; }
 
            var outerEntity = graph.hasEntity(outerMember.id);
            if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
-               return false;
+               { return false; }
 
            return outerEntity;
        }
                var wayMembers = [];
                for (i = 0; i < members.length; i++) {
                    item = members[i];
-                   if (item.index === -1) continue;
+                   if (item.index === -1) { continue; }
 
                    if (item.pair) {
                        wayMembers.push(item.pair[0]);
                var geometry = entity.geometry(graph);
                var tags = entity.tags;
 
-               if (oldPreset) tags = oldPreset.unsetTags(tags, geometry);
-               if (newPreset) tags = newPreset.setTags(tags, geometry, skipFieldDefaults);
+               if (oldPreset) { tags = oldPreset.unsetTags(tags, geometry); }
+               if (newPreset) { tags = newPreset.setTags(tags, geometry, skipFieldDefaults); }
 
                return graph.replace(entity.update({tags: tags}));
            };
                    }
                }
 
-               if (val === '') return [];
+               if (val === '') { return []; }
 
                var cardinal = {
                    north: 0,               n: 0,
                    var lookForward =
                        (this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all');
 
-                   if (!lookForward && !lookBackward) return;
+                   if (!lookForward && !lookBackward) { return; }
 
                    var nodeIds = {};
                    resolver.parentWays(this).forEach(function(parent) {
                        // vertex is connected to multiple parent ways
                        for (var i in parents) {
                            if (parents[i].geometry(resolver) === 'line' &&
-                               parents[i].hasInterestingTags()) return true;
+                               parents[i].hasInterestingTags()) { return true; }
                        }
                    } else if (parents.length === 1) {
                        var way = parents[0];
                        }, this)
                    }
                };
-               if (changeset_id) r.node['@changeset'] = changeset_id;
+               if (changeset_id) { r.node['@changeset'] = changeset_id; }
                return r;
            },
 
 
 
            var action = function(graph, t) {
-               if (t === null || !isFinite(t)) t = 1;
+               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;
+                   if (!origNodes[node.id]) { origNodes[node.id] = node; }
                });
 
                if (!way.isConvex(graph)) {
                        var parentWays = graph.parentWays(keyNodes[i]);
                        for (j = 0; j < parentWays.length; j++) {
                            var sharedWay = parentWays[j];
-                           if (sharedWay === way) continue;
+                           if (sharedWay === way) { continue; }
 
                            if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
                                var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id);
            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;
+                   graph.parentRelations(node).length) { return false; }
 
                var geometries = osmNodeGeometriesForTags(node.tags);
                // don't delete if this node can be a standalone point
-               if (geometries.point) return false;
+               if (geometries.point) { return false; }
                // delete if this node only be a vertex
-               if (geometries.vertex) return true;
+               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
                // 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
+                   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;
+                   if (node.id === survivor.id) { continue; }
 
                    parents = graph.parentWays(node);
                    for (j = 0; j < parents.length; 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
+                   if (survivor.version) { break; }  // found one
                }
 
                // 1. disable if the nodes being connected have conflicting relation roles
                restrictionIDs = utilArrayUniq(restrictionIDs);
                for (i = 0; i < restrictionIDs.length; i++) {
                    relation = graph.entity(restrictionIDs[i]);
-                   if (!relation.isComplete(graph)) continue;
+                   if (!relation.isComplete(graph)) { continue; }
 
                    var memberWays = relation.members
                        .filter(function(m) { return m.type === 'way'; })
                    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;
+                           if (nodeIDs[k] === survivor.id) { continue; }
 
                            if (way.areAdjacent(nodeIDs[k], survivor.id)) {
                                way = way.removeNode(nodeIDs[k]);
 
                function collectNodes(member, collection) {
                    var entity = graph.hasEntity(member.id);
-                   if (!entity) return;
+                   if (!entity) { return; }
 
                    var role = member.role || '';
                    if (!collection[role]) {
                graph = graph.replace(relation);
 
                if (relation.isDegenerate())
-                   graph = actionDeleteRelation(relation.id)(graph);
+                   { graph = actionDeleteRelation(relation.id)(graph); }
 
                return graph;
            };
        function actionDiscardTags(difference, discardTags) {
          discardTags = discardTags || {};
 
-         return (graph) => {
+         return function (graph) {
            difference.modified().forEach(checkTags);
            difference.created().forEach(checkTags);
            return graph;
 
            function checkTags(entity) {
-             const keys = Object.keys(entity.tags);
-             let didDiscard = false;
-             let tags = {};
+             var keys = Object.keys(entity.tags);
+             var didDiscard = false;
+             var tags = {};
 
-             for (let i = 0; i < keys.length; i++) {
-               const k = keys[i];
+             for (var i = 0; i < keys.length; i++) {
+               var k = keys[i];
                if (discardTags[k] || !entity.tags[k]) {
                  didDiscard = true;
                } else {
            action.disabled = function(graph) {
                var connections = action.connections(graph);
                if (connections.length === 0)
-                   return 'not_connected';
+                   { return 'not_connected'; }
 
                var parentWays = graph.parentWays(graph.entity(nodeId));
                var seenRelationIds = {};
                });
 
                if (sharedRelation)
-                   return 'relation';
+                   { return 'relation'; }
            };
 
 
            action.limitWays = function(val) {
-               if (!arguments.length) return wayIds;
+               if (!arguments.length) { return wayIds; }
                wayIds = val;
                return action;
            };
                        // don't transfer building-related tags
                        if (buildingKeysToRetain.indexOf(key) !== -1 ||
                            key.match(/^building:.{1,}/) ||
-                           key.match(/^roof:.{1,}/)) continue;
+                           key.match(/^roof:.{1,}/)) { continue; }
                    }
 
                    // copy the tag from the entity to the point
                graph = graph.replace(survivor);
 
                joined.forEach(function(way) {
-                   if (way.id === survivorID) return;
+                   if (way.id === survivorID) { return; }
 
                    graph.parentRelations(way).forEach(function(parent) {
                        graph = graph.replace(parent.replaceMember(way, survivor));
                // 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;
+                   if (!survivor.isClosed()) { return; }
 
                    var multipolygons = graph.parentMultipolygons(survivor).filter(function(multipolygon) {
                        // find multipolygons where the survivor is the only member
                    });
 
                    // skip if this is the single member of multiple multipolygons
-                   if (multipolygons.length !== 1) return;
+                   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;
+                           multipolygon.tags[key] !== survivor.tags[key]) { return; }
                    }
 
                    survivor = survivor.mergeTags(multipolygon.tags);
            // 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;
+               if (!nodeIDs.length) { return null; }
                var sum = [0,0];
                var interestingCount = 0;
                var interestingLoc;
 
 
            var action = function(graph) {
-               if (nodeIDs.length < 2) return graph;
+               if (nodeIDs.length < 2) { return graph; }
                var toLoc = loc;
                if (!toLoc) {
                    toLoc = chooseLoc(graph);
 
 
            action.disabled = function(graph) {
-               if (nodeIDs.length < 2) return 'not_eligible';
+               if (nodeIDs.length < 2) { return 'not_eligible'; }
 
                for (var i = 0; i < nodeIDs.length; i++) {
                    var entity = graph.entity(nodeIDs[i]);
-                   if (entity.type !== 'node') return 'not_eligible';
+                   if (entity.type !== 'node') { return 'not_eligible'; }
                }
 
                return actionConnect(nodeIDs).disabled(graph);
                    var groups = {};
                    for (var i = 0; i < x.length; i++) {
                        var tagName = Object.keys(x[i])[0];
-                       if (!groups[tagName]) groups[tagName] = [];
+                       if (!groups[tagName]) { groups[tagName] = []; }
                        groups[tagName].push(x[i][tagName]);
                    }
                    var ordered = {};
                    order.forEach(function(o) {
-                       if (groups[o]) ordered[o] = groups[o];
+                       if (groups[o]) { ordered[o] = groups[o]; }
                    });
                    return ordered;
                }
                    var sorted = {};
                    var relations = changes.relation;
 
-                   if (!relations) return changes;
+                   if (!relations) { return changes; }
 
                    for (var i = 0; i < relations.length; i++) {
                        var relation = relations[i];
            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;
+           if (aId < 0 || bId < 0) { return aId - bId; }
            return bId - aId;
        };
 
 
 
            copy: function(resolver, copies) {
-               if (copies[this.id]) return copies[this.id];
+               if (copies[this.id]) { return copies[this.id]; }
 
                var copy = osmEntity.prototype.copy.call(this, resolver, copies);
 
 
            extent: function(resolver, memo) {
                return resolver.transient(this, 'extent', function() {
-                   if (memo && memo[this.id]) return geoExtent();
+                   if (memo && memo[this.id]) { return geoExtent(); }
                    memo = memo || {};
                    memo[this.id] = true;
 
            // 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;
+               if (!this.memberById(needle.id)) { return this; }
 
                var members = [];
 
 
 
            isValidRestriction: function() {
-               if (!this.isRestriction()) return false;
+               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 (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 (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;
+               if (vias.length === 0) { return false; }
+               if (vias.length > 1 && vias.some(function(m) { return m.type !== 'way'; })) { return false; }
 
                return true;
            },
                    for (o = 0; o < outers.length; o++) {
                        outer = outers[o];
                        if (geoPolygonContainsPolygon(outer, inner))
-                           return o;
+                           { return o; }
                    }
 
                    for (o = 0; o < outers.length; o++) {
                        outer = outers[o];
                        if (geoPolygonIntersectsPolygon(outer, inner, false))
-                           return o;
+                           { return o; }
                    }
                }
 
            }
        });
 
-       class QAItem {
-         constructor(loc, service, itemType, id, props) {
-           // Store required properties
-           this.loc = loc;
-           this.service = service.title;
-           this.itemType = itemType;
+       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()}`;
+         // All issues must have an ID for selection, use generic if none specified
+         this.id = id ? id : ("" + (QAItem.id()));
 
-           this.update(props);
+         this.update(props);
 
-           // Some QA services have marker icons to differentiate issues
-           if (service && typeof service.getIcon === 'function') {
-             this.icon = service.getIcon(itemType);
-           }
-
-           return this;
+         // Some QA services have marker icons to differentiate issues
+         if (service && typeof service.getIcon === 'function') {
+           this.icon = service.getIcon(itemType);
          }
 
-         update(props) {
-           // You can't override this inital information
-           const { loc, service, itemType, id } = this;
+         return this;
+       };
+
+       QAItem.prototype.update = function update (props) {
+           var this$1 = this;
 
-           Object.keys(props).forEach(prop => this[prop] = props[prop]);
+         // 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;
 
-           this.loc = loc;
-           this.service = service;
-           this.itemType = itemType;
-           this.id = id;
+         Object.keys(props).forEach(function (prop) { return this$1[prop] = props[prop]; });
 
-           return this;
-         }
+         this.loc = loc;
+         this.service = service;
+         this.itemType = itemType;
+         this.id = id;
 
-         // Generic handling for newly created QAItems
-         static id() {
-           return this.nextId--;
-         }
-       }
+         return this;
+       };
+
+       // Generic handling for newly created QAItems
+       QAItem.id = function id () {
+         return this.nextId--;
+       };
        QAItem.nextId = -1;
 
        // Split a way at the given node.
 
                return parents.filter(function(parent) {
                    if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
-                       return false;
+                       { return false; }
 
                    if (!_wayIDs && hasLines && parent.geometry(graph) !== 'line')
-                       return false;
+                       { return false; }
 
                    if (parent.isClosed()) {
                        return true;
 
 
            action.limitWays = function(val) {
-               if (!arguments.length) return _wayIDs;
+               if (!arguments.length) { return _wayIDs; }
                _wayIDs = val;
                return action;
            };
        }
 
        function coreGraph(other, mutable) {
-           if (!(this instanceof coreGraph)) return new coreGraph(other, mutable);
+           if (!(this instanceof coreGraph)) { return new coreGraph(other, mutable); }
 
            if (other instanceof coreGraph) {
                var base = other.base();
 
 
            childNodes: function(entity) {
-               if (this._childNodes[entity.id]) return this._childNodes[entity.id];
-               if (!entity.nodes) return [];
+               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++) {
                    var entity = entities[i];
 
                    if (!entity.visible || (!force && base.entities[entity.id]))
-                       continue;
+                       { continue; }
 
                    // Merging data into the base graph
                    base.entities[entity.id] = entity;
 
 
            replace: function(entity) {
-               if (this.entities[entity.id] === entity) return this;
+               if (this.entities[entity.id] === entity) { return this; }
 
                return this.update(function() {
                    this._updateCalculated(this.entities[entity.id], entity);
            revert: function(id) {
                var baseEntity = this.base().entities[id];
                var headEntity = this.entities[id];
-               if (headEntity === baseEntity) return this;
+               if (headEntity === baseEntity) { return this; }
 
                return this.update(function() {
                    this._updateCalculated(headEntity, baseEntity);
 
 
            update: function() {
+               var arguments$1 = arguments;
+
                var graph = this.frozen ? coreGraph(this, true) : this;
                for (var i = 0; i < arguments.length; i++) {
-                   arguments[i].call(graph, graph);
+                   arguments$1[i].call(graph, graph);
                }
 
-               if (this.frozen) graph.frozen = true;
+               if (this.frozen) { graph.frozen = true; }
 
                return graph;
            },
            }
 
            function isRoad(way) {
-               if (way.isArea() || way.isDegenerate()) return false;
+               if (way.isArea() || way.isDegenerate()) { return false; }
                var roads = {
                    'motorway': true,
                    'motorway_link': true,
                var hasWays = false;
                for (i = 0; i < checkWays.length; i++) {
                    way = checkWays[i];
-                   if (!isRoad(way) && !memberOfRestriction(way)) continue;
+                   if (!isRoad(way) && !memberOfRestriction(way)) { continue; }
 
                    ways.push(way);   // it's a road, or it's already in a turn restriction
                    hasWays = true;
                    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
+                       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
+                           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;
                        }
            // For each path found, generate and return a `osmTurn` datastructure.
            //
            intersection.turns = function(fromWayId, maxViaWay) {
-               if (!fromWayId) return [];
-               if (!maxViaWay) maxViaWay = 0;
+               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 [];
+               if (!start || !(start.__from || start.__via)) { return []; }
 
                // maxViaWay=0   from-*-to              (0 vias)
                // maxViaWay=1   from-*-via-*-to        (1 via max)
                // 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;
+                   if (currPath.length >= maxPathLength) { return; }
                    currPath.push(entity.id);
                    currRestrictions = (currRestrictions || []).slice();  // shallow copy
                    var i, j;
                            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 (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;
+                           if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) { continue; }
 
                            // Check all "current" restrictions (where we've already walked the `FROM`)
                            var restrict = undefined;
 
                                // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
                                if (restrict && restrict.direct)
-                                   break;
+                                   { break; }
                            }
 
                            nextWays.push({ way: way, restrict: restrict });
                                turns.push(osmTurn(turn));
                            }
 
-                           if (currPath[0] === currPath[2]) return;   // if we made a u-turn - stop here
+                           if (currPath[0] === currPath[2]) { return; }   // if we made a u-turn - stop here
                        }
 
-                       if (matchedRestriction && matchedRestriction.end) return;  // don't advance any further
+                       if (matchedRestriction && matchedRestriction.end) { return; }  // don't advance any further
 
                        // which nodes can we step into?
                        var n1 = vgraph.entity(entity.first());
                        var nextNodes = [];
 
                        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
+                           if (dist > maxDistance) { return; }   // the next node is too far
+                           if (!entity.__via) { return; }        // this way is a leaf / can't be a via
                        }
 
                        if (!entity.__oneWay &&                     // bidirectional..
                        nextNodes.forEach(function(nextNode) {
                            // gather restrictions FROM this way
                            var fromRestrictions = vgraph.parentRelations(entity).filter(function(r) {
-                               if (!r.isRestriction()) return false;
+                               if (!r.isRestriction()) { return false; }
 
                                var f = r.memberByRole('from');
-                               if (!f || f.id !== entity.id) return false;
+                               if (!f || f.id !== entity.id) { return false; }
 
                                var isOnly = /^only_/.test(r.tags.restriction);
-                               if (!isOnly) return true;
+                               if (!isOnly) { return true; }
 
                                // `only_` restrictions only matter along the direction of the VIA - #4849
                                var isOnlyVia = false;
                                    isOnlyVia = (v[0].id === nextNode.id);
                                } else {                                        // via way(s)
                                    for (var i = 0; i < v.length; i++) {
-                                       if (v[i].type !== 'way') continue;
+                                       if (v[i].type !== 'way') { continue; }
                                        var viaWay = vgraph.entity(v[i].id);
                                        if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) {
                                            isOnlyVia = true;
 
                // assumes path is alternating way-node-way of odd length
                function pathToTurn(path) {
-                   if (path.length < 3) return;
+                   if (path.length < 3) { return; }
                    var fromWayId, fromNodeId, fromVertexId;
                    var toWayId, toNodeId, toVertexId;
                    var viaWayIds, viaNodeId, isUturn;
 
                    if (path.length === 3 && fromWayId === toWayId) {  // u turn
                        var way = vgraph.entity(fromWayId);
-                       if (way.__oneWay) return null;
+                       if (way.__oneWay) { return null; }
 
                        isUturn = true;
                        viaNodeId = fromVertexId = toVertexId = path[1];
                        geoAngle(toVertex, toNode, projection)) * 180 / Math.PI;
 
            while (angle < 0)
-               angle += 360;
+               { angle += 360; }
 
            if (fromNode === toNode)
-               return 'no_u_turn';
+               { 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
+               { 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)
+               { 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';
+               { return 'no_right_turn'; }
            if (angle > 202)
-               return 'no_left_turn';
+               { return 'no_left_turn'; }
 
            return 'no_straight_on';
        }
                // contained by the kth way.
                var contained = polygons.map(function(w, i) {
                    return polygons.map(function(d, n) {
-                       if (i === n) return null;
+                       if (i === n) { return null; }
                        return geoPolygonContainsPolygon(
                            d.nodes.map(function(n) { return n.loc; }),
                            w.nodes.map(function(n) { return n.loc; })
 
 
        var fastDeepEqual = function equal(a, b) {
-         if (a === b) return true;
+         if (a === b) { return true; }
 
          if (a && b && typeof a == 'object' && typeof b == 'object') {
-           if (a.constructor !== b.constructor) return false;
+           if (a.constructor !== b.constructor) { return false; }
 
            var length, i, keys;
            if (Array.isArray(a)) {
              length = a.length;
-             if (length != b.length) return false;
+             if (length != b.length) { return false; }
              for (i = length; i-- !== 0;)
-               if (!equal(a[i], b[i])) return false;
+               { if (!equal(a[i], b[i])) { return false; } }
              return true;
            }
 
 
 
-           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 (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;
+           if (length !== Object.keys(b).length) { return false; }
 
            for (i = length; i-- !== 0;)
-             if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;
+             { if (!Object.prototype.hasOwnProperty.call(b, keys[i])) { return false; } }
 
            for (i = length; i-- !== 0;) {
              var key = keys[i];
 
-             if (!equal(a[key], b[key])) return false;
+             if (!equal(a[key], b[key])) { return false; }
            }
 
            return true;
        // Expects two arrays, finds longest common sequence
        function LCS(buffer1, buffer2) {
 
-         let equivalenceClasses = {};
-         for (let j = 0; j < buffer2.length; j++) {
-           const item = buffer2[j];
+         var equivalenceClasses = {};
+         for (var j = 0; j < buffer2.length; j++) {
+           var item = buffer2[j];
            if (equivalenceClasses[item]) {
              equivalenceClasses[item].push(j);
            } else {
            }
          }
 
-         const NULLRESULT = { buffer1index: -1, buffer2index: -1, chain: null };
-         let candidates = [NULLRESULT];
+         var NULLRESULT = { buffer1index: -1, buffer2index: -1, chain: null };
+         var candidates = [NULLRESULT];
 
-         for (let i = 0; i < buffer1.length; i++) {
-           const item = buffer1[i];
-           const buffer2indices = equivalenceClasses[item] || [];
-           let r = 0;
-           let c = candidates[0];
+         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];
 
-           for (let jx = 0; jx < buffer2indices.length; jx++) {
-             const j = buffer2indices[jx];
+           for (var jx = 0; jx < buffer2indices.length; jx++) {
+             var j$1 = buffer2indices[jx];
 
-             let s;
+             var s = (void 0);
              for (s = r; s < candidates.length; s++) {
-               if ((candidates[s].buffer2index < j) && ((s === candidates.length - 1) || (candidates[s + 1].buffer2index > j))) {
+               if ((candidates[s].buffer2index < j$1) && ((s === candidates.length - 1) || (candidates[s + 1].buffer2index > j$1))) {
                  break;
                }
              }
 
              if (s < candidates.length) {
-               const newCandidate = { buffer1index: i, buffer2index: j, chain: candidates[s] };
+               var newCandidate = { buffer1index: i, buffer2index: j$1, chain: candidates[s] };
                if (r === candidates.length) {
                  candidates.push(c);
                } else {
        // offsets and lengths of mismatched chunks in the input
        // buffers. This is used by diff3MergeRegions.
        function diffIndices(buffer1, buffer2) {
-         const lcs = LCS(buffer1, buffer2);
-         let result = [];
-         let tail1 = buffer1.length;
-         let tail2 = buffer2.length;
-
-         for (let candidate = lcs; candidate !== null; candidate = candidate.chain) {
-           const mismatchLength1 = tail1 - candidate.buffer1index - 1;
-           const mismatchLength2 = tail2 - candidate.buffer2index - 1;
+         var lcs = LCS(buffer1, buffer2);
+         var result = [];
+         var tail1 = buffer1.length;
+         var tail2 = buffer2.length;
+
+         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;
 
 
          // "hunks" are array subsets where `a` or `b` are different from `o`
          // https://www.gnu.org/software/diffutils/manual/html_node/diff3-Hunks.html
-         let hunks = [];
+         var hunks = [];
          function addHunk(h, ab) {
            hunks.push({
              ab: ab,
            });
          }
 
-         diffIndices(o, a).forEach(item => addHunk(item, 'a'));
-         diffIndices(o, b).forEach(item => addHunk(item, 'b'));
-         hunks.sort((x,y) => x.oStart - y.oStart);
+         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; });
 
-         let results = [];
-         let currOffset = 0;
+         var results = [];
+         var currOffset = 0;
 
          function advanceTo(endOffset) {
            if (endOffset > currOffset) {
          }
 
          while (hunks.length) {
-           let hunk = hunks.shift();
-           let regionStart = hunk.oStart;
-           let regionEnd = hunk.oStart + hunk.oLength;
-           let regionHunks = [hunk];
+           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) {
-             const nextHunk = hunks[0];
-             const nextHunkStart = nextHunk.oStart;
-             if (nextHunkStart > regionEnd) break;   // no overlap
+             var nextHunk = hunks[0];
+             var nextHunkStart = nextHunk.oStart;
+             if (nextHunkStart > regionEnd) { break; }   // no overlap
 
              regionEnd = Math.max(regionEnd, nextHunkStart + nextHunk.oLength);
              regionHunks.push(hunks.shift());
              // 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) {
-               const buffer = (hunk.ab === 'a' ? a : b);
+               var buffer = (hunk.ab === 'a' ? a : b);
                results.push({
                  stable: true,
                  buffer: hunk.ab,
              // 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.
-             let bounds = {
+             var bounds = {
                a: [a.length, -1, o.length, -1],
                b: [b.length, -1, o.length, -1]
              };
              while (regionHunks.length) {
                hunk = regionHunks.shift();
-               const oStart = hunk.oStart;
-               const oEnd = oStart + hunk.oLength;
-               const abStart = hunk.abStart;
-               const abEnd = abStart + hunk.abLength;
-               let 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]);
-             }
-
-             const aStart = bounds.a[0] + (regionStart - bounds.a[2]);
-             const aEnd = bounds.a[1] + (regionEnd - bounds.a[3]);
-             const bStart = bounds.b[0] + (regionStart - bounds.b[2]);
-             const bEnd = bounds.b[1] + (regionEnd - bounds.b[3]);
-
-             let result = {
+               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]);
+             }
+
+             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,
        // 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) {
-         let defaults = {
+         var defaults = {
            excludeFalseConflicts: true,
            stringSeparator: /\s+/
          };
          options = Object.assign(defaults, options);
 
-         const aString = (typeof a === 'string');
-         const oString = (typeof o === 'string');
-         const bString = (typeof b === 'string');
+         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);
+         if (aString) { a = a.split(options.stringSeparator); }
+         if (oString) { o = o.split(options.stringSeparator); }
+         if (bString) { b = b.split(options.stringSeparator); }
 
-         let results = [];
-         const regions = diff3MergeRegions(a, o, b);
+         var results = [];
+         var regions = diff3MergeRegions(a, o, b);
 
-         let okBuffer = [];
+         var okBuffer = [];
          function flushOk() {
            if (okBuffer.length) {
              results.push({ ok: okBuffer });
          }
 
          function isFalseConflict(a, b) {
-           if (a.length !== b.length) return false;
-           for (let i = 0; i < a.length; i++) {
-             if (a[i] !== b[i]) return false;
+           if (a.length !== b.length) { return false; }
+           for (var i = 0; i < a.length; i++) {
+             if (a[i] !== b[i]) { return false; }
            }
            return true;
          }
 
-         regions.forEach(region =>  {
+         regions.forEach(function (region) {
            if (region.stable) {
-             okBuffer.push(...region.bufferContent);
+             okBuffer.push.apply(okBuffer, region.bufferContent);
            } else {
              if (options.excludeFalseConflicts && isFalseConflict(region.aContent, region.bContent)) {
-               okBuffer.push(...region.aContent);
+               okBuffer.push.apply(okBuffer, region.aContent);
              } else {
                flushOk();
                results.push({
                            _conflicts.push(_t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
                        }
 
-                       if (_conflicts.length !== ccount) break;
+                       if (_conflicts.length !== ccount) { break; }
                        updates.replacements.push(target);
                    }
                }
            function setupCache(graph) {
                function canMove(nodeID) {
                    // Allow movement of any node that is in the selectedIDs list..
-                   if (moveIDs.indexOf(nodeID) !== -1) return true;
+                   if (moveIDs.indexOf(nodeID) !== -1) { return true; }
 
                    // Allow movement of a vertex where 2 ways meet..
                    var parents = graph.parentWays(graph.entity(nodeID));
-                   if (parents.length < 3) return true;
+                   if (parents.length < 3) { return true; }
 
                    // 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];
+                   if (!parentsMoving) { delete cache.moving[nodeID]; }
 
                    return parentsMoving;
                }
                function cacheEntities(ids) {
                    for (var i = 0; i < ids.length; i++) {
                        var id = ids[i];
-                       if (cache.moving[id]) continue;
+                       if (cache.moving[id]) { continue; }
                        cache.moving[id] = true;
 
                        var entity = graph.hasEntity(id);
-                       if (!entity) continue;
+                       if (!entity) { continue; }
 
                        if (entity.type === 'node') {
                            cache.nodes.push(id);
                        for (var j = 0; j < childNodes.length; j++) {
                            var node = childNodes[j];
                            var parents = graph.parentWays(node);
-                           if (parents.length !== 2) continue;
+                           if (parents.length !== 2) { continue; }
 
                            var moved = graph.entity(id);
                            var unmoved = null;
                                    break;
                                }
                            }
-                           if (!unmoved) continue;
+                           if (!unmoved) { continue; }
 
                            // exclude ways that are overly connected..
-                           if (utilArrayIntersection(moved.nodes, unmoved.nodes).length > 2) continue;
-                           if (moved.isArea() || unmoved.isArea()) continue;
+                           if (utilArrayIntersection(moved.nodes, unmoved.nodes).length > 2) { continue; }
+                           if (moved.isArea() || unmoved.isArea()) { continue; }
 
                            cache.intersections.push({
                                nodeId: node.id,
                var next = graph.hasEntity(way.nodes[nextIndex]);
 
                // Don't add orig vertex at endpoint..
-               if (!prev || !next) return graph;
+               if (!prev || !next) { return graph; }
 
                var key = wayId + '_' + nodeId;
                var orig = cache.replacedVertex[key];
                        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;
+               if (angle > 175 && angle < 185) { return graph; }
 
                // moving forward or backward along way?
                var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection);
                var insertAt = (d1 <= d2) ? movedIndex : nextIndex;
 
                // moving around closed loop?
-               if (way.isClosed() && insertAt === 0) insertAt = len;
+               if (way.isClosed() && insertAt === 0) { insertAt = len; }
 
                way = way.addNode(orig.id, insertAt);
                return graph.replace(orig).replace(way);
                var isEP2 = intersection.unmovedIsEP;
 
                // don't move the vertex if it is the endpoint of both ways.
-               if (isEP1 && isEP2) return graph;
+               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]);
+               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);
                        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;
+                       if (Math.abs(edge1.distance - edge2.distance) < epsilon) { break; }
                    }
                } else if (!isEP1) {
                    loc = edge1.loc;
                    var obj = cache.intersections[i];
 
                    // Don't limit movement if this is vertex joins 2 endpoints..
-                   if (obj.movedIsEP && obj.unmovedIsEP) continue;
+                   if (obj.movedIsEP && obj.unmovedIsEP) { continue; }
                    // Don't limit movement if this vertex is not an endpoint anyway..
-                   if (!obj.movedIsEP) continue;
+                   if (!obj.movedIsEP) { continue; }
 
                    var node = graph.entity(obj.nodeId);
                    var start = projection(node.loc);
                    var hits = geoPathIntersections(movedPath, unmovedPath);
 
                    for (var j = 0; i < hits.length; i++) {
-                       if (geoVecEqual(hits[j], end)) continue;
+                       if (geoVecEqual(hits[j], end)) { continue; }
                        var edge = geoChooseEdge(unmovedNodes, end, projection);
                        _delta = geoVecSubtract(projection(edge.loc), start);
                    }
 
 
            var action = function(graph) {
-               if (_delta[0] === 0 && _delta[1] === 0) return graph;
+               if (_delta[0] === 0 && _delta[1] === 0) { return graph; }
 
                setupCache(graph);
 
        function actionMoveNode(nodeID, toLoc) {
 
            var action = function(graph, t) {
-               if (t === null || !isFinite(t)) t = 1;
+               if (t === null || !isFinite(t)) { t = 1; }
                t = Math.min(Math.max(+t, 0), 1);
 
                var node = graph.entity(nodeID);
 
 
            var action = function(graph, t) {
-               if (t === null || !isFinite(t)) t = 1;
+               if (t === null || !isFinite(t)) { t = 1; }
                t = Math.min(Math.max(+t, 0), 1);
 
                var way = graph.entity(wayID);
 
                var isClosed = way.isClosed();
                var nodes = graph.childNodes(way).slice();  // shallow copy
-               if (isClosed) nodes.pop();
+               if (isClosed) { nodes.pop(); }
 
                if (vertexID !== undefined) {
                    nodes = nodeSubset(nodes, vertexID, isClosed);
-                   if (nodes.length !== 3) return graph;
+                   if (nodes.length !== 3) { return graph; }
                }
 
                // note: all geometry functions here use the unclosed node/point/coord list
                    }
 
                    var bestCoords = bestPoints.map(function(p) { return p.coord; });
-                   if (isClosed) bestCoords.push(bestCoords[0]);
+                   if (isClosed) { bestCoords.push(bestCoords[0]); }
 
                    // move the nodes that should move
                    for (i = 0; i < bestPoints.length; i++) {
                    // 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
+                       if (nodeCount[point.id] > 1) { continue; }   // skip self-intersections
 
                        node = graph.entity(point.id);
 
 
                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];
+                   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];
+                   if (nodeCount[array[i].id] > 1) { return [0, 0]; }
 
                    var a = array[(i - 1 + array.length) % array.length].coord;
                    var origin = point.coord;
 
                var isClosed = way.isClosed();
                var nodes = graph.childNodes(way).slice();  // shallow copy
-               if (isClosed) nodes.pop();
+               if (isClosed) { nodes.pop(); }
 
                var allowStraightAngles = false;
                if (vertexID !== undefined) {
                    allowStraightAngles = true;
                    nodes = nodeSubset(nodes, vertexID, isClosed);
-                   if (nodes.length !== 3) return 'end_vertex';
+                   if (nodes.length !== 3) { return 'end_vertex'; }
                }
 
                var coords = nodes.map(function(n) { return projection(n.loc); });
 
 
            var action = function(graph, t) {
-               if (t === null || !isFinite(t)) t = 1;
+               if (t === null || !isFinite(t)) { t = 1; }
                t = Math.min(Math.max(+t, 0), 1);
 
                var nodes = nodeIDs.map(function(id) { return graph.entity(id); });
 
 
            var action = function(graph, t) {
-               if (t === null || !isFinite(t)) t = 1;
+               if (t === null || !isFinite(t)) { t = 1; }
                t = Math.min(Math.max(+t, 0), 1);
 
                var nodes = allNodes(graph);
 
 
            var action = function(graph, t) {
-               if (t === null || !isFinite(t)) t = 1;
+               if (t === null || !isFinite(t)) { t = 1; }
                t = Math.min(Math.max(+t, 0), 1);
 
                var nodes = utilGetAllNodes(reflectIds, graph);
 
 
            action.useLongAxis = function(val) {
-               if (!arguments.length) return _useLongAxis;
+               if (!arguments.length) { return _useLongAxis; }
                _useLongAxis = val;
                return action;
            };
 
                function eventTarget() {
                    var datum = event.target && event.target.__data__;
-                   if (typeof datum !== 'object') return null;
+                   if (typeof datum !== 'object') { return null; }
                    if (!(datum instanceof osmEntity) && datum.properties && (datum.properties.entity instanceof osmEntity)) {
                        return datum.properties.entity;
                    }
                    // ignore mouse hovers with buttons pressed unless dragging
                    if (context.mode().id.indexOf('drag') === -1 &&
                        (!event.pointerType || event.pointerType === 'mouse') &&
-                       event.buttons) return;
+                       event.buttons) { return; }
 
                    var target = eventTarget();
                    if (target && _targets.indexOf(target) === -1) {
 
 
            behavior.altDisables = function(val) {
-               if (!arguments.length) return _altDisables;
+               if (!arguments.length) { return _altDisables; }
                _altDisables = val;
                return behavior;
            };
 
            behavior.ignoreVertex = function(val) {
-               if (!arguments.length) return _ignoreVertex;
+               if (!arguments.length) { return _ignoreVertex; }
                _ignoreVertex = val;
                return behavior;
            };
            function datum() {
                var mode = context.mode();
                var isNote = mode && (mode.id.indexOf('note') !== -1);
-               if (event.altKey || isNote) return {};
+               if (event.altKey || isNote) { return {}; }
 
                var element;
                if (event.type === 'keydown') {
 
            function pointerdown() {
 
-               if (_downPointer) return;
+               if (_downPointer) { return; }
 
                var pointerLocGetter = utilFastMouse(this);
                _downPointer = {
 
            function pointerup() {
 
-               if (!_downPointer || _downPointer.id !== (event.pointerId || 'mouse')) return;
+               if (!_downPointer || _downPointer.id !== (event.pointerId || 'mouse')) { return; }
 
                var downPointer = _downPointer;
                _downPointer = null;
 
                _lastPointerUpEvent = event;
 
-               if (downPointer.isCancelled) return;
+               if (downPointer.isCancelled) { return; }
 
                var t2 = +new Date();
                var p2 = downPointer.pointerLocGetter(event);
 
                if ((event.pointerType && event.pointerType !== 'mouse') ||
                    event.buttons ||
-                   _downPointer) return;
+                   _downPointer) { return; }
 
                // 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;
+                   event.timeStamp - _lastPointerUpEvent.timeStamp < 100) { return; }
 
                _lastMouse = event;
                dispatch$1.call('move', this, datum());
                    }
                }
 
-               if (_disableSpace || _mouseLeave || !_lastMouse) return;
+               if (_disableSpace || _mouseLeave || !_lastMouse) { return; }
 
                // user must move mouse or release space bar to allow another click
                _lastSpace = currSpace;
            return property in this && delete this[property];
          },
          clear: function() {
-           for (var property in this) if (property[0] === prefix) delete this[property];
+           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));
+           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]);
+           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]});
+           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;
+           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;
+           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);
+           for (var property in this) { if (property[0] === prefix) { f(this[property], property.slice(1), this); } }
          }
        };
 
          var map = new Map$1;
 
          // Copy constructor.
-         if (object instanceof Map$1) object.each(function(value, key) { map.set(key, value); });
+         if (object instanceof Map$1) { object.each(function(value, key) { map.set(key, value); }); }
 
          // Index array by numeric index or specified key function.
          else if (Array.isArray(object)) {
                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);
+           if (f == null) { while (++i < n) { map.set(i, object[i]); } }
+           else { while (++i < n) { map.set(f(o = object[i], i, object), o); } }
          }
 
          // Convert object to map.
-         else if (object) for (var key in object) map.set(key, object[key]);
+         else if (object) { for (var key in object) { map.set(key, object[key]); } }
 
          return map;
        }
          var set = new Set$1;
 
          // Copy constructor.
-         if (object instanceof Set$1) object.each(function(value) { set.add(value); });
+         if (object instanceof Set$1) { object.each(function(value) { set.add(value); }); }
 
          // 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));
+           if (f == null) { while (++i < n) { set.add(object[i]); } }
+           else { while (++i < n) { set.add(f(object[i], i, object)); } }
          }
 
          return set;
 
        function clamper(domain) {
          var a = domain[0], b = domain[domain.length - 1], t;
-         if (a > b) t = a, a = b, b = t;
+         if (a > b) { t = a, a = b, b = t; }
          return function(x) { return Math.max(a, Math.min(b, x)); };
        }
 
        // 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);
+         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)); };
        }
 
        // 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
+         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+
                length = 0;
 
            while (i > 0 && g > 0) {
-             if (length + g + 1 > width) g = Math.max(1, width - length);
+             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;
+             if ((length += g + 1) > width) { break; }
              g = grouping[j = (j + 1) % grouping.length];
            }
 
        var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;
 
        function formatSpecifier(specifier) {
-         if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);
+         if (!(match = re.exec(specifier))) { throw new Error("invalid format: " + specifier); }
          var match;
          return new FormatSpecifier({
            fill: match[1],
          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;
+             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;
 
        function formatPrefixAuto(x, p) {
          var d = formatDecimal(x, p);
-         if (!d) return x + "";
+         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,
 
        function formatRounded(x, p) {
          var d = formatDecimal(x, p);
-         if (!d) return x + "";
+         if (!d) { return x + ""; }
          var coefficient = d[0],
              exponent = d[1];
          return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient
                type = specifier.type;
 
            // The "n" type is an alias for ",g".
-           if (type === "n") comma = true, type = "g";
+           if (type === "n") { comma = true, type = "g"; }
 
            // The "" type, and any invalid type, is an alias for ".12~g".
-           else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = "g";
+           else if (!formatTypes[type]) { precision === undefined && (precision = 12), trim = true, type = "g"; }
 
            // If zero fill is specified, padding goes after sign and before digits.
-           if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "=";
+           if (zero || (fill === "0" && align === "=")) { zero = true, fill = "0", align = "="; }
 
            // Compute the prefix and suffix.
            // For SI-prefix, the suffix is lazily computed.
                value = isNaN(value) ? nan : formatType(Math.abs(value), precision);
 
                // Trim insignificant zeros.
-               if (trim) value = formatTrim(value);
+               if (trim) { value = formatTrim(value); }
 
                // 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;
+               if (valueNegative && +value === 0 && sign !== "+") { valueNegative = false; }
 
                // Compute the prefix and suffix.
                valuePrefix = (valueNegative ? (sign === "(" ? sign : minus) : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;
              }
 
              // If the fill character is not "0", grouping is applied before padding.
-             if (comma && !zero) value = group(value, Infinity);
+             if (comma && !zero) { value = group(value, Infinity); }
 
              // 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 = "";
+             if (comma && zero) { value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = ""; }
 
              // Reconstruct the final output based on the desired alignment.
              switch (align) {
          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;
+             if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) { specifier.precision = precision; }
              return formatPrefix(specifier, value);
            }
            case "":
            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");
+             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;
+             if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) { specifier.precision = precision - (specifier.type === "%") * 2; }
              break;
            }
          }
          };
 
          scale.nice = function(count) {
-           if (count == null) count = 10;
+           if (count == null) { count = 10; }
 
            var d = domain(),
                i0 = 0,
          function rescale() {
            var i = -1;
            domain = new Array(n);
-           while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
+           while (++i < n) { domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1); }
            return scale;
          }
 
 
            function keypress() {
                // prevent operations during low zoom selection
-               if (!context.map().withinEditableZoom()) return;
+               if (!context.map().withinEditableZoom()) { return; }
 
                event.preventDefault();
                var disabled = _operation.disabled();
                        .iconClass('operation')
                        .text(_operation.annotation() || _operation.title)();
 
-                   if (_operation.point) _operation.point(null);
+                   if (_operation.point) { _operation.point(null); }
                    _operation();
                }
            }
 
 
            behavior.which = function (_) {
-               if (!arguments.length) return _operation;
+               if (!arguments.length) { return _operation; }
                _operation = _;
                return behavior;
            };
 
                var entity = context.entity(entityID);
 
-               if (entity.type !== 'way' || new Set(entity.nodes).size <= 1) return null;
+               if (entity.type !== 'way' || new Set(entity.nodes).size <= 1) { return null; }
 
                if (!_extent) {
                    _extent =  entity.extent(context.graph());
            }
 
            var operation = function() {
-               if (!_actions.length) return;
+               if (!_actions.length) { return; }
 
                var combinedAction = function(graph, t) {
                    _actions.forEach(function(action) {
 
            // don't cache this because the visible extent could change
            operation.disabled = function() {
-               if (!_actions.length) return '';
+               if (!_actions.length) { return ''; }
 
                var actionDisableds = _actions.map(function(action) {
                    return action.disabled(context.graph());
 
 
                function someMissing() {
-                   if (context.inIntro()) return false;
+                   if (context.inIntro()) { return false; }
                    var osm = context.connection();
                    if (osm) {
                        var missing = _coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
            }
 
            if (detected.os === 'win') {
-               if (code === '⌘⇧Z') return 'Ctrl+Y';
+               if (code === '⌘⇧Z') { return 'Ctrl+Y'; }
            }
 
            var result = '',
 
        // return a display-focused string for a given keyboard code
        uiCmd.display = function(code) {
-           if (code.length !== 1) return code;
+           if (code.length !== 1) { return code; }
 
            var detected = utilDetect();
            var mac = (detected.os === 'mac');
 
 
                function someMissing() {
-                   if (context.inIntro()) return false;
+                   if (context.inIntro()) { return false; }
                    var osm = context.connection();
                    if (osm) {
                        var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
 
                function protectedMember(id) {
                    var entity = context.entity(id);
-                   if (entity.type !== 'way') return false;
+                   if (entity.type !== 'way') { return false; }
 
                    var parents = context.graph().parentRelations(entity);
                    for (var i = 0; i < parents.length; i++) {
 
                // square a line/area
                if (entity.type === 'way' && new Set(entity.nodes).size > 2 ) {
-                   if (_type && _type !== 'feature') return null;
+                   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;
+                   if (_type && _type !== 'corner') { return null; }
                    _type = 'corner';
                    var graph = context.graph();
                    var parents = graph.parentWays(entity);
 
 
            var operation = function() {
-               if (!_actions.length) return;
+               if (!_actions.length) { return; }
 
                var combinedAction = function(graph, t) {
                    _actions.forEach(function(action) {
 
            // don't cache this because the visible extent could change
            operation.disabled = function() {
-               if (!_actions.length) return '';
+               if (!_actions.length) { return ''; }
 
                var actionDisableds = _actions.map(function(action) {
                    return action.disabled(context.graph());
 
 
                function someMissing() {
-                   if (context.inIntro()) return false;
+                   if (context.inIntro()) { return false; }
                    var osm = context.connection();
                    if (osm) {
                        var missing = _coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
 
 
                function someMissing() {
-                   if (context.inIntro()) return false;
+                   if (context.inIntro()) { return false; }
                    var osm = context.connection();
                    if (osm) {
                        var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
 
 
                function someMissing() {
-                   if (context.inIntro()) return false;
+                   if (context.inIntro()) { return false; }
                    var osm = context.connection();
                    if (osm) {
                        var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
                var currMouse = context.map().mouse();
                var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
 
-               if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
+               if (typeof _prevAngle === 'undefined') { _prevAngle = currAngle; }
                var delta = currAngle - _prevAngle;
 
                fn(actionRotate(entityIDs, _pivot, delta, projection));
 
 
            mode.selectedIDs = function() {
-               if (!arguments.length) return entityIDs;
+               if (!arguments.length) { return entityIDs; }
                // no assign
                return mode;
            };
 
 
                function someMissing() {
-                   if (context.inIntro()) return false;
+                   if (context.inIntro()) { return false; }
                    var osm = context.connection();
                    if (osm) {
                        var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
 
 
            function startNudge(nudge) {
-               if (_nudgeInterval) window.clearInterval(_nudgeInterval);
+               if (_nudgeInterval) { window.clearInterval(_nudgeInterval); }
                _nudgeInterval = window.setInterval(function() {
                    context.map().pan(nudge);
                    doMove(nudge);
 
            function cancel() {
                if (baseGraph) {
-                   while (context.graph() !== baseGraph) context.pop();
+                   while (context.graph() !== baseGraph) { context.pop(); }
                    context.enter(modeBrowse(context));
                } else {
                    context.pop();
 
 
            mode.selectedIDs = function() {
-               if (!arguments.length) return entityIDs;
+               if (!arguments.length) { return entityIDs; }
                // no assign
                return mode;
            };
 
            function doPaste() {
                // prevent paste during low zoom selection
-               if (!context.map().withinEditableZoom()) return;
+               if (!context.map().withinEditableZoom()) { return; }
 
                event.preventDefault();
 
                var projection = context.projection;
                var viewport = geoExtent(projection.clipExtent()).polygon();
 
-               if (!geoPointInPolygon(mouse, viewport)) return;
+               if (!geoPointInPolygon(mouse, viewport)) { return; }
 
                var oldIDs = context.copyIDs();
-               if (!oldIDs.length) return;
+               if (!oldIDs.length) { return; }
 
                var extent = geoExtent();
                var oldGraph = context.copyGraph();
 
            function pointerdown() {
 
-               if (_pointerId) return;
+               if (_pointerId) { return; }
 
                _pointerId = event.pointerId || 'mouse';
 
 
 
                function pointermove() {
-                   if (_pointerId !== (event.pointerId || 'mouse')) return;
+                   if (_pointerId !== (event.pointerId || 'mouse')) { return; }
 
                    var p = pointerLocGetter(event);
 
                        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;
+                       if (dist < tolerance) { return; }
 
                        started = true;
                        _event({ type: 'start' });
 
 
                function pointerup() {
-                   if (_pointerId !== (event.pointerId || 'mouse')) return;
+                   if (_pointerId !== (event.pointerId || 'mouse')) { return; }
 
                    _pointerId = null;
 
 
 
            behavior.selector = function(_) {
-               if (!arguments.length) return _selector;
+               if (!arguments.length) { return _selector; }
                _selector = _;
                return behavior;
            };
 
 
            behavior.origin = function(_) {
-               if (!arguments.length) return _origin;
+               if (!arguments.length) { return _origin; }
                _origin = _;
                return behavior;
            };
 
 
            behavior.target = function() {
-               if (!arguments.length) return _target;
+               if (!arguments.length) { return _target; }
                _target = arguments[0];
                _event = eventOf(_target, Array.prototype.slice.call(arguments, 1));
                return behavior;
 
 
            behavior.surface = function() {
-               if (!arguments.length) return _surface;
+               if (!arguments.length) { return _surface; }
                _surface = arguments[0];
                return behavior;
            };
 
 
            function startNudge(entity, nudge) {
-               if (_nudgeInterval) window.clearInterval(_nudgeInterval);
+               if (_nudgeInterval) { window.clearInterval(_nudgeInterval); }
                _nudgeInterval = window.setInterval(function() {
                    context.map().pan(nudge);
                    doMove(entity, nudge);
 
 
            function shouldSnapToNode(target) {
-               if (!_activeEntity) return false;
+               if (!_activeEntity) { return false; }
                return _activeEntity.geometry(context.graph()) !== 'vertex' ||
                    (target.geometry(context.graph()) === 'vertex' || _mainPresetIndex.allowsVertex(target, context.graph()));
            }
                    // test any parent multipolygons for valid geometry
                    var relations = graph.parentRelations(parent);
                    for (j = 0; j < relations.length; j++) {
-                       if (!relations[j].isMultipolygon()) continue;
+                       if (!relations[j].isMultipolygon()) { continue; }
 
                        var rings = osmJoinWays(relations[j].members, graph);
 
 
                        // test active ring for intersections with other rings in the multipolygon
                        for (k = 0; k < rings.length; k++) {
-                           if (k === activeIndex) continue;
+                           if (k === activeIndex) { continue; }
 
                            // make sure active ring doesnt cross passive rings
                            if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
 
 
            function move(entity) {
-               if (_isCancelled) return;
+               if (_isCancelled) { return; }
                event.sourceEvent.stopPropagation();
 
                context.surface().classed('nope-disabled', event.sourceEvent.altKey);
            }
 
            function end(entity) {
-               if (_isCancelled) return;
+               if (_isCancelled) { return; }
 
                var wasPoint = entity.geometry(context.graph()) === 'point';
 
                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();
+                   if (t === 1) { context.pop(); }
                    return moveNode(graph, t);
                };
                action.transitionable = true;
 
 
            mode.selectedIDs = function() {
-               if (!arguments.length) return _activeEntity ? [_activeEntity.id] : [];
+               if (!arguments.length) { return _activeEntity ? [_activeEntity.id] : []; }
                // no assign
                return mode;
            };
 
 
            mode.activeID = function() {
-               if (!arguments.length) return _activeEntity && _activeEntity.id;
+               if (!arguments.length) { return _activeEntity && _activeEntity.id; }
                // no assign
                return mode;
            };
 
 
            mode.restoreSelectedIDs = function(_) {
-               if (!arguments.length) return _restoreSelectedIDs;
+               if (!arguments.length) { return _restoreSelectedIDs; }
                _restoreSelectedIDs = _;
                return mode;
            };
                var j = right;
 
                swap(arr, left, k);
-               if (compare(arr[right], t) > 0) swap(arr, left, right);
+               if (compare(arr[right], t) > 0) { swap(arr, left, right); }
 
                while (i < j) {
                    swap(arr, i, j);
                    i++;
                    j--;
-                   while (compare(arr[i], t) < 0) i++;
-                   while (compare(arr[j], t) > 0) j--;
+                   while (compare(arr[i], t) < 0) { i++; }
+                   while (compare(arr[j], t) > 0) { j--; }
                }
 
-               if (compare(arr[left], t) === 0) swap(arr, left, j);
+               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;
+               if (j <= k) { left = j + 1; }
+               if (k <= j) { right = j - 1; }
            }
        }
 
            return a < b ? -1 : a > b ? 1 : 0;
        }
 
-       class RBush {
-           constructor(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();
-           }
+       var RBush = function RBush(maxEntries) {
+           if ( maxEntries === void 0 ) maxEntries = 9;
 
-           all() {
-               return this._all(this.data, []);
-           }
+           // 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();
+       };
 
-           search(bbox) {
-               let node = this.data;
-               const result = [];
+       RBush.prototype.all = function all () {
+           return this._all(this.data, []);
+       };
 
-               if (!intersects(bbox, node)) return result;
+       RBush.prototype.search = function search (bbox) {
+           var node = this.data;
+           var result = [];
 
-               const toBBox = this.toBBox;
-               const nodesToSearch = [];
+           if (!intersects(bbox, node)) { return result; }
 
-               while (node) {
-                   for (let i = 0; i < node.children.length; i++) {
-                       const child = node.children[i];
-                       const childBBox = node.leaf ? toBBox(child) : child;
-
-                       if (intersects(bbox, childBBox)) {
-                           if (node.leaf) result.push(child);
-                           else if (contains$1(bbox, childBBox)) this._all(child, result);
-                           else nodesToSearch.push(child);
-                       }
+           var toBBox = this.toBBox;
+           var nodesToSearch = [];
+
+           while (node) {
+               for (var i = 0; i < node.children.length; i++) {
+                   var child = node.children[i];
+                   var childBBox = node.leaf ? toBBox(child) : child;
+
+                   if (intersects(bbox, childBBox)) {
+                       if (node.leaf) { result.push(child); }
+                       else if (contains$1(bbox, childBBox)) { this._all(child, result); }
+                       else { nodesToSearch.push(child); }
                    }
-                   node = nodesToSearch.pop();
                }
-
-               return result;
+               node = nodesToSearch.pop();
            }
 
-           collides(bbox) {
-               let node = this.data;
+           return result;
+       };
+
+       RBush.prototype.collides = function collides (bbox) {
+           var node = this.data;
 
-               if (!intersects(bbox, node)) return false;
+           if (!intersects(bbox, node)) { return false; }
 
-               const nodesToSearch = [];
-               while (node) {
-                   for (let i = 0; i < node.children.length; i++) {
-                       const child = node.children[i];
-                       const childBBox = node.leaf ? this.toBBox(child) : child;
+           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 (intersects(bbox, childBBox)) {
-                           if (node.leaf || contains$1(bbox, childBBox)) return true;
-                           nodesToSearch.push(child);
-                       }
+                   if (intersects(bbox, childBBox)) {
+                       if (node.leaf || contains$1(bbox, childBBox)) { return true; }
+                       nodesToSearch.push(child);
                    }
-                   node = nodesToSearch.pop();
                }
-
-               return false;
+               node = nodesToSearch.pop();
            }
 
-           load(data) {
-               if (!(data && data.length)) return this;
+           return false;
+       };
+
+       RBush.prototype.load = function load (data) {
+           if (!(data && data.length)) { return this; }
 
-               if (data.length < this._minEntries) {
-                   for (let i = 0; i < data.length; i++) {
-                       this.insert(data[i]);
-                   }
-                   return this;
+           if (data.length < this._minEntries) {
+               for (var i = 0; i < data.length; i++) {
+                   this.insert(data[i]);
                }
+               return this;
+           }
 
-               // recursively build the tree with the given data from scratch using OMT algorithm
-               let 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;
+           // recursively build the tree with the given data from scratch using OMT algorithm
+           var node = this._build(data.slice(), 0, data.length - 1, 0);
 
-               } else if (this.data.height === node.height) {
-                   // split root if trees have the same height
-                   this._splitRoot(this.data, node);
+           if (!this.data.children.length) {
+               // save as is if tree is empty
+               this.data = node;
 
-               } else {
-                   if (this.data.height < node.height) {
-                       // swap trees if inserted one is bigger
-                       const tmpNode = this.data;
-                       this.data = node;
-                       node = tmpNode;
-                   }
+           } else if (this.data.height === node.height) {
+               // split root if trees have the same height
+               this._splitRoot(this.data, node);
 
-                   // insert the small tree into the large tree at appropriate level
-                   this._insert(node, this.data.height - node.height - 1, true);
+           } else {
+               if (this.data.height < node.height) {
+                   // swap trees if inserted one is bigger
+                   var tmpNode = this.data;
+                   this.data = node;
+                   node = tmpNode;
                }
 
-               return this;
+               // insert the small tree into the large tree at appropriate level
+               this._insert(node, this.data.height - node.height - 1, true);
            }
 
-           insert(item) {
-               if (item) this._insert(item, this.data.height - 1);
-               return this;
-           }
+           return this;
+       };
 
-           clear() {
-               this.data = createNode([]);
-               return this;
-           }
+       RBush.prototype.insert = function insert (item) {
+           if (item) { this._insert(item, this.data.height - 1); }
+           return this;
+       };
 
-           remove(item, equalsFn) {
-               if (!item) return this;
+       RBush.prototype.clear = function clear () {
+           this.data = createNode([]);
+           return this;
+       };
 
-               let node = this.data;
-               const bbox = this.toBBox(item);
-               const path = [];
-               const indexes = [];
-               let i, parent, goingUp;
+       RBush.prototype.remove = function remove (item, equalsFn) {
+           if (!item) { return this; }
 
-               // depth-first iterative tree traversal
-               while (node || path.length) {
+           var node = this.data;
+           var bbox = this.toBBox(item);
+           var path = [];
+           var indexes = [];
+           var i, parent, goingUp;
 
-                   if (!node) { // go up
-                       node = path.pop();
-                       parent = path[path.length - 1];
-                       i = indexes.pop();
-                       goingUp = true;
-                   }
+           // depth-first iterative tree traversal
+           while (node || path.length) {
 
-                   if (node.leaf) { // check current node
-                       const index = findItem(item, node.children, equalsFn);
+               if (!node) { // go up
+                   node = path.pop();
+                   parent = path[path.length - 1];
+                   i = indexes.pop();
+                   goingUp = true;
+               }
 
-                       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;
-                       }
-                   }
+               if (node.leaf) { // check current node
+                   var index = findItem(item, node.children, equalsFn);
 
-                   if (!goingUp && !node.leaf && contains$1(node, bbox)) { // go down
+                   if (index !== -1) {
+                       // item found, remove the item and condense tree upwards
+                       node.children.splice(index, 1);
                        path.push(node);
-                       indexes.push(i);
-                       i = 0;
-                       parent = node;
-                       node = node.children[0];
+                       this._condense(path);
+                       return this;
+                   }
+               }
 
-                   } else if (parent) { // go right
-                       i++;
-                       node = parent.children[i];
-                       goingUp = false;
+               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 node = null; // nothing found
-               }
+               } else if (parent) { // go right
+                   i++;
+                   node = parent.children[i];
+                   goingUp = false;
 
-               return this;
+               } else { node = null; } // nothing found
            }
 
-           toBBox(item) { return item; }
+           return this;
+       };
 
-           compareMinX(a, b) { return a.minX - b.minX; }
-           compareMinY(a, b) { return a.minY - b.minY; }
+       RBush.prototype.toBBox = function toBBox (item) { return item; };
 
-           toJSON() { return this.data; }
+       RBush.prototype.compareMinX = function compareMinX (a, b) { return a.minX - b.minX; };
+       RBush.prototype.compareMinY = function compareMinY (a, b) { return a.minY - b.minY; };
 
-           fromJSON(data) {
-               this.data = data;
-               return this;
-           }
+       RBush.prototype.toJSON = function toJSON () { return this.data; };
 
-           _all(node, result) {
-               const nodesToSearch = [];
-               while (node) {
-                   if (node.leaf) result.push(...node.children);
-                   else nodesToSearch.push(...node.children);
+       RBush.prototype.fromJSON = function fromJSON (data) {
+           this.data = data;
+           return this;
+       };
 
-                   node = nodesToSearch.pop();
-               }
-               return result;
+       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); }
+
+               node = nodesToSearch.pop();
            }
+           return result;
+       };
 
-           _build(items, left, right, height) {
+       RBush.prototype._build = function _build (items, left, right, height) {
 
-               const N = right - left + 1;
-               let M = this._maxEntries;
-               let node;
+           var N = right - left + 1;
+           var M = this._maxEntries;
+           var node;
 
-               if (N <= M) {
-                   // reached leaf level; return leaf
-                   node = createNode(items.slice(left, right + 1));
-                   calcBBox(node, this.toBBox);
-                   return node;
-               }
+           if (N <= M) {
+               // reached leaf level; return leaf
+               node = createNode(items.slice(left, right + 1));
+               calcBBox(node, this.toBBox);
+               return node;
+           }
 
-               if (!height) {
-                   // target height of the bulk-loaded tree
-                   height = Math.ceil(Math.log(N) / Math.log(M));
+           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
-                   M = Math.ceil(N / Math.pow(M, height - 1));
-               }
+               // target number of root entries to maximize storage utilization
+               M = Math.ceil(N / Math.pow(M, height - 1));
+           }
 
-               node = createNode([]);
-               node.leaf = false;
-               node.height = height;
+           node = createNode([]);
+           node.leaf = false;
+           node.height = height;
 
-               // split the items into M mostly square tiles
+           // split the items into M mostly square tiles
 
-               const N2 = Math.ceil(N / M);
-               const N1 = N2 * Math.ceil(Math.sqrt(M));
+           var N2 = Math.ceil(N / M);
+           var N1 = N2 * Math.ceil(Math.sqrt(M));
 
-               multiSelect(items, left, right, N1, this.compareMinX);
+           multiSelect(items, left, right, N1, this.compareMinX);
 
-               for (let i = left; i <= right; i += N1) {
+           for (var i = left; i <= right; i += N1) {
 
-                   const right2 = Math.min(i + N1 - 1, right);
+               var right2 = Math.min(i + N1 - 1, right);
 
-                   multiSelect(items, i, right2, N2, this.compareMinY);
+               multiSelect(items, i, right2, N2, this.compareMinY);
 
-                   for (let j = i; j <= right2; j += N2) {
+               for (var j = i; j <= right2; j += N2) {
 
-                       const right3 = Math.min(j + N2 - 1, right2);
+                   var right3 = Math.min(j + N2 - 1, right2);
 
-                       // pack each entry recursively
-                       node.children.push(this._build(items, j, right3, height - 1));
-                   }
+                   // pack each entry recursively
+                   node.children.push(this._build(items, j, right3, height - 1));
                }
+           }
 
-               calcBBox(node, this.toBBox);
+           calcBBox(node, this.toBBox);
 
-               return node;
-           }
+           return node;
+       };
 
-           _chooseSubtree(bbox, node, level, path) {
-               while (true) {
-                   path.push(node);
+       RBush.prototype._chooseSubtree = function _chooseSubtree (bbox, node, level, path) {
+           while (true) {
+               path.push(node);
 
-                   if (node.leaf || path.length - 1 === level) break;
+               if (node.leaf || path.length - 1 === level) { break; }
 
-                   let minArea = Infinity;
-                   let minEnlargement = Infinity;
-                   let targetNode;
+               var minArea = Infinity;
+               var minEnlargement = Infinity;
+               var targetNode = (void 0);
 
-                   for (let i = 0; i < node.children.length; i++) {
-                       const child = node.children[i];
-                       const area = bboxArea(child);
-                       const enlargement = enlargedArea(bbox, child) - area;
+               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;
+                   // 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;
-                           }
+                   } else if (enlargement === minEnlargement) {
+                       // otherwise choose one with the smallest area
+                       if (area < minArea) {
+                           minArea = area;
+                           targetNode = child;
                        }
                    }
-
-                   node = targetNode || node.children[0];
                }
 
-               return node;
+               node = targetNode || node.children[0];
            }
 
-           _insert(item, level, isNode) {
-               const bbox = isNode ? item : this.toBBox(item);
-               const insertPath = [];
+           return node;
+       };
 
-               // find the best node for accommodating the item, saving all nodes along the path too
-               const node = this._chooseSubtree(bbox, this.data, level, insertPath);
+       RBush.prototype._insert = function _insert (item, level, isNode) {
+           var bbox = isNode ? item : this.toBBox(item);
+           var insertPath = [];
 
-               // put the item into the node
-               node.children.push(item);
-               extend$1(node, bbox);
+           // find the best node for accommodating the item, saving all nodes along the path too
+           var node = this._chooseSubtree(bbox, this.data, level, insertPath);
 
-               // 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;
-               }
+           // put the item into the node
+           node.children.push(item);
+           extend$1(node, bbox);
 
-               // adjust bboxes along the insertion path
-               this._adjustParentBBoxes(bbox, insertPath, level);
+           // 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; }
            }
 
-           // split overflowed node into two
-           _split(insertPath, level) {
-               const node = insertPath[level];
-               const M = node.children.length;
-               const m = this._minEntries;
+           // adjust bboxes along the insertion path
+           this._adjustParentBBoxes(bbox, insertPath, level);
+       };
 
-               this._chooseSplitAxis(node, m, M);
+       // 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;
 
-               const splitIndex = this._chooseSplitIndex(node, m, M);
+           this._chooseSplitAxis(node, m, M);
 
-               const newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
-               newNode.height = node.height;
-               newNode.leaf = node.leaf;
+           var splitIndex = this._chooseSplitIndex(node, m, M);
 
-               calcBBox(node, this.toBBox);
-               calcBBox(newNode, this.toBBox);
+           var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
+           newNode.height = node.height;
+           newNode.leaf = node.leaf;
 
-               if (level) insertPath[level - 1].children.push(newNode);
-               else this._splitRoot(node, newNode);
-           }
+           calcBBox(node, this.toBBox);
+           calcBBox(newNode, this.toBBox);
 
-           _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 (level) { insertPath[level - 1].children.push(newNode); }
+           else { this._splitRoot(node, newNode); }
+       };
 
-           _chooseSplitIndex(node, m, M) {
-               let index;
-               let minOverlap = Infinity;
-               let minArea = Infinity;
+       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);
+       };
 
-               for (let i = m; i <= M - m; i++) {
-                   const bbox1 = distBBox(node, 0, i, this.toBBox);
-                   const bbox2 = distBBox(node, i, M, this.toBBox);
+       RBush.prototype._chooseSplitIndex = function _chooseSplitIndex (node, m, M) {
+           var index;
+           var minOverlap = Infinity;
+           var minArea = Infinity;
 
-                   const overlap = intersectionArea(bbox1, bbox2);
-                   const area = bboxArea(bbox1) + bboxArea(bbox2);
+           for (var i = m; i <= M - m; i++) {
+               var bbox1 = distBBox(node, 0, i, this.toBBox);
+               var bbox2 = distBBox(node, i, M, this.toBBox);
 
-                   // choose distribution with minimum overlap
-                   if (overlap < minOverlap) {
-                       minOverlap = overlap;
-                       index = i;
+               var overlap = intersectionArea(bbox1, bbox2);
+               var area = bboxArea(bbox1) + bboxArea(bbox2);
 
-                       minArea = area < minArea ? area : minArea;
+               // choose distribution with minimum overlap
+               if (overlap < minOverlap) {
+                   minOverlap = overlap;
+                   index = i;
 
-                   } else if (overlap === minOverlap) {
-                       // otherwise choose distribution with minimum area
-                       if (area < minArea) {
-                           minArea = area;
-                           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 || M - m;
            }
 
-           // sorts node children by the best axis for split
-           _chooseSplitAxis(node, m, M) {
-               const compareMinX = node.leaf ? this.compareMinX : compareNodeMinX;
-               const compareMinY = node.leaf ? this.compareMinY : compareNodeMinY;
-               const xMargin = this._allDistMargin(node, m, M, compareMinX);
-               const yMargin = this._allDistMargin(node, m, M, compareMinY);
+           return index || M - m;
+       };
 
-               // 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);
-           }
+       // 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);
 
-           // total margin of all possible split distributions where each node is at least m full
-           _allDistMargin(node, m, M, compare) {
-               node.children.sort(compare);
+           // 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); }
+       };
 
-               const toBBox = this.toBBox;
-               const leftBBox = distBBox(node, 0, m, toBBox);
-               const rightBBox = distBBox(node, M - m, M, toBBox);
-               let margin = bboxMargin(leftBBox) + bboxMargin(rightBBox);
+       // 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);
 
-               for (let i = m; i < M - m; i++) {
-                   const child = node.children[i];
-                   extend$1(leftBBox, node.leaf ? toBBox(child) : child);
-                   margin += bboxMargin(leftBBox);
-               }
+           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);
 
-               for (let i = M - m - 1; i >= m; i--) {
-                   const child = node.children[i];
-                   extend$1(rightBBox, node.leaf ? toBBox(child) : child);
-                   margin += bboxMargin(rightBBox);
-               }
+           for (var i = m; i < M - m; i++) {
+               var child = node.children[i];
+               extend$1(leftBBox, node.leaf ? toBBox(child) : child);
+               margin += bboxMargin(leftBBox);
+           }
 
-               return margin;
+           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);
            }
 
-           _adjustParentBBoxes(bbox, path, level) {
-               // adjust bboxes along the given tree path
-               for (let i = level; i >= 0; i--) {
-                   extend$1(path[i], bbox);
-               }
+           return margin;
+       };
+
+       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);
            }
+       };
 
-           _condense(path) {
-               // go through the path, removing empty nodes and updating bboxes
-               for (let 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);
+       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);
 
-                       } else this.clear();
+                   } else { this.clear(); }
 
-                   } else calcBBox(path[i], this.toBBox);
-               }
+               } else { calcBBox(path[i], this.toBBox); }
            }
-       }
+       };
 
        function findItem(item, items, equalsFn) {
-           if (!equalsFn) return items.indexOf(item);
+           if (!equalsFn) { return items.indexOf(item); }
 
-           for (let i = 0; i < items.length; i++) {
-               if (equalsFn(item, items[i])) return i;
+           for (var i = 0; i < items.length; i++) {
+               if (equalsFn(item, items[i])) { return i; }
            }
            return -1;
        }
 
        // min bounding rectangle of node children from k to p-1
        function distBBox(node, k, p, toBBox, destNode) {
-           if (!destNode) destNode = createNode(null);
+           if (!destNode) { destNode = createNode(null); }
            destNode.minX = Infinity;
            destNode.minY = Infinity;
            destNode.maxX = -Infinity;
            destNode.maxY = -Infinity;
 
-           for (let i = k; i < p; i++) {
-               const child = node.children[i];
+           for (var i = k; i < p; i++) {
+               var child = node.children[i];
                extend$1(destNode, node.leaf ? toBBox(child) : child);
            }
 
        }
 
        function intersectionArea(a, b) {
-           const minX = Math.max(a.minX, b.minX);
-           const minY = Math.max(a.minY, b.minY);
-           const maxX = Math.min(a.maxX, b.maxX);
-           const maxY = Math.min(a.maxY, b.maxY);
+           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);
 
            return Math.max(0, maxX - minX) *
                   Math.max(0, maxY - minY);
 
        function createNode(children) {
            return {
-               children,
+               children: children,
                height: 1,
                leaf: true,
                minX: Infinity,
        // combines selection algorithm with binary divide & conquer approach
 
        function multiSelect(arr, left, right, n, compare) {
-           const stack = [left, right];
+           var stack = [left, right];
 
            while (stack.length) {
                right = stack.pop();
                left = stack.pop();
 
-               if (right - left <= n) continue;
+               if (right - left <= n) { continue; }
 
-               const mid = left + Math.ceil((right - left) / n / 2) * n;
+               var mid = left + Math.ceil((right - left) / n / 2) * n;
                quickselect(arr, mid, left, right, compare);
 
                stack.push(left, mid, mid, right);
            }
        }
 
-       const tiler = utilTiler();
-       const dispatch$1 = dispatch('loaded');
-       const _tileZoom = 14;
-       const _krUrlRoot = 'https://www.keepright.at';
-       let _krData = { errorTypes: {}, localizeStrings: {} };
+       var tiler = utilTiler();
+       var dispatch$1 = dispatch('loaded');
+       var _tileZoom = 14;
+       var _krUrlRoot = 'https://www.keepright.at';
+       var _krData = { errorTypes: {}, localizeStrings: {} };
 
        // This gets reassigned if reset
-       let _cache;
+       var _cache;
 
-       const _krRuleset = [
+       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,
        }
 
        function abortUnwantedRequests(cache, tiles) {
-         Object.keys(cache.inflightTile).forEach(k => {
-           const wanted = tiles.find(tile => k === tile.id);
+         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];
 
        // Replace or remove QAItem from rtree
        function updateRtree(item, replace) {
-         _cache.rtree.remove(item, (a, b) => a.data.id === b.data.id);
+         _cache.rtree.remove(item, function (a, b) { return a.data.id === b.data.id; });
 
          if (replace) {
            _cache.rtree.insert(item);
 
 
        function tokenReplacements(d) {
-         if (!(d instanceof QAItem)) return;
+         if (!(d instanceof QAItem)) { return; }
 
-         const htmlRegex = new RegExp(/<\/[a-z][\s\S]*>/);
-         const replacements = {};
+         var htmlRegex = new RegExp(/<\/[a-z][\s\S]*>/);
+         var replacements = {};
 
-         const issueTemplate = _krData.errorTypes[d.whichType];
+         var issueTemplate = _krData.errorTypes[d.whichType];
          if (!issueTemplate) {
            /* eslint-disable no-console */
            console.log('No Template: ', d.whichType);
          }
 
          // some descriptions are just fixed text
-         if (!issueTemplate.regex) return;
+         if (!issueTemplate.regex) { return; }
 
          // regex pattern should match description with variable details captured
-         const errorRegex = new RegExp(issueTemplate.regex, 'i');
-         const errorMatch = errorRegex.exec(d.description);
+         var errorRegex = new RegExp(issueTemplate.regex, 'i');
+         var errorMatch = errorRegex.exec(d.description);
          if (!errorMatch) {
            /* eslint-disable no-console */
            console.log('Unmatched: ', d.whichType);
            return;
          }
 
-         for (let i = 1; i < errorMatch.length; i++) {   // skip first
-           let capture = errorMatch[i];
-           let idType;
+         for (var i = 1; i < errorMatch.length; i++) {   // skip first
+           var capture = errorMatch[i];
+           var idType = (void 0);
 
            idType = 'IDs' in issueTemplate ? issueTemplate.IDs[i-1] : '';
            if (idType && capture) {   // link IDs if present in the capture
            } else if (htmlRegex.test(capture)) {   // escape any html in non-IDs
              capture = '\\' +  capture + '\\';
            } else {
-             const compare = capture.toLowerCase();
+             var compare = capture.toLowerCase();
              if (_krData.localizeStrings[compare]) {   // some replacement strings can be localized
                capture = _t('QA.keepRight.error_parts.' + _krData.localizeStrings[compare]);
              }
 
 
        function parseError(capture, idType) {
-         const compare = capture.toLowerCase();
+         var compare = capture.toLowerCase();
          if (_krData.localizeStrings[compare]) {   // some replacement strings can be localized
            capture = _t('QA.keepRight.error_parts.' + _krData.localizeStrings[compare]);
          }
 
 
          function linkErrorObject(d) {
-           return `<a class="error_object_link">${d}</a>`;
+           return ("<a class=\"error_object_link\">" + d + "</a>");
          }
 
          function linkEntity(d) {
-           return `<a class="error_entity_link">${d}</a>`;
+           return ("<a class=\"error_entity_link\">" + d + "</a>");
          }
 
          function linkURL(d) {
-           return `<a class="kr_external_link" target="_blank" href="${d}">${d}</a>`;
+           return ("<a class=\"kr_external_link\" target=\"_blank\" href=\"" + d + "\">" + d + "</a>");
          }
 
          // arbitrary node list of form: #ID, #ID, #ID...
          function parse211(capture) {
-           let newList = [];
-           const items = capture.split(', ');
+           var newList = [];
+           var items = capture.split(', ');
 
-           items.forEach(item => {
+           items.forEach(function (item) {
              // ID has # at the front
-             let id = linkEntity('n' + item.slice(1));
+             var id = linkEntity('n' + item.slice(1));
              newList.push(id);
            });
 
 
          // arbitrary way list of form: #ID(layer),#ID(layer),#ID(layer)...
          function parse231(capture) {
-           let newList = [];
+           var newList = [];
            // unfortunately 'layer' can itself contain commas, so we split on '),'
-           const items = capture.split('),');
+           var items = capture.split('),');
 
-           items.forEach(item => {
-             const match = item.match(/\#(\d+)\((.+)\)?/);
+           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] })
 
          // arbitrary node/relation list of form: from node #ID,to relation #ID,to node #ID...
          function parse294(capture) {
-           let newList = [];
-           const items = capture.split(',');
+           var newList = [];
+           var items = capture.split(',');
 
-           items.forEach(item => {
+           items.forEach(function (item) {
              // item of form "from/to node/relation #ID"
              item = item.split(' ');
 
              // to/from role is more clear in quotes
-             const role = `"${item[0]}"`;
+             var role = "\"" + (item[0]) + "\"";
 
              // first letter of node/relation provides the type
-             const idType = item[1].slice(0,1);
+             var idType = item[1].slice(0,1);
 
              // ID has # at the front
-             let id = item[2].slice(1);
+             var id = item[2].slice(1);
              id = linkEntity(idType + id);
 
-             newList.push(`${role} ${item[1]} ${id}`);
+             newList.push((role + " " + (item[1]) + " " + id));
            });
 
            return newList.join(', ');
 
          // may or may not include the string "(including the name 'name')"
          function parse370(capture) {
-           if (!capture) return '';
+           if (!capture) { return ''; }
 
-           const match = capture.match(/\(including the name (\'.+\')\)/);
+           var match = capture.match(/\(including the name (\'.+\')\)/);
            if (match && match.length) {
              return _t('QA.keepRight.errorTypes.370.including_the_name', { name: match[1] });
            }
 
          // arbitrary node list of form: #ID,#ID,#ID...
          function parse20(capture) {
-           let newList = [];
-           const items = capture.split(',');
+           var newList = [];
+           var items = capture.split(',');
 
-           items.forEach(item => {
+           items.forEach(function (item) {
              // ID has # at the front
-             const id = linkEntity('n' + item.slice(1));
+             var id = linkEntity('n' + item.slice(1));
              newList.push(id);
            });
 
        var serviceKeepRight = {
          title: 'keepRight',
 
-         init() {
+         init: function init() {
            _mainFileFetcher.get('keepRight')
-             .then(d => _krData = d);
+             .then(function (d) { return _krData = d; });
 
            if (!_cache) {
              this.reset();
            this.event = utilRebind(this, dispatch$1, 'on');
          },
 
-         reset() {
+         reset: function reset() {
            if (_cache) {
              Object.values(_cache.inflightTile).forEach(abortRequest);
            }
 
 
          // KeepRight API:  http://osm.mueschelsoft.de/keepright/interfacing.php
-         loadIssues(projection) {
-           const options = {
+         loadIssues: function loadIssues(projection) {
+           var this$1 = this;
+
+           var options = {
              format: 'geojson',
              ch: _krRuleset
            };
 
            // determine the needed tiles to cover the view
-           const tiles = tiler
+           var tiles = tiler
              .zoomExtent([_tileZoom, _tileZoom])
              .getTiles(projection);
 
            abortUnwantedRequests(_cache, tiles);
 
            // issue new requests..
-           tiles.forEach(tile => {
-             if (_cache.loadedTile[tile.id] || _cache.inflightTile[tile.id]) return;
-
-             const [ left, top, right, bottom ] = tile.extent.rectangle();
-             const params = Object.assign({}, options, { left, bottom, right, top });
-             const url = `${_krUrlRoot}/export.php?` + utilQsString(params);
-             const controller = new AbortController();
+           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();
 
              _cache.inflightTile[tile.id] = controller;
 
              d3_json(url, { signal: controller.signal })
-               .then(data => {
+               .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(feature => {
-                   const {
-                     properties: {
-                       error_type: itemType,
-                       error_id: id,
-                       comment = null,
-                       object_id: objectId,
-                       object_type: objectType,
-                       schema,
-                       title
-                     }
-                   } = feature;
-                   let {
-                     geometry: { coordinates: loc },
-                     properties: { description = '' }
-                   } = feature;
+                 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)
-                   const issueTemplate = _krData.errorTypes[itemType];
-                   const parentIssueType = (Math.floor(itemType / 10) * 10).toString();
+                   var issueTemplate = _krData.errorTypes[itemType];
+                   var parentIssueType = (Math.floor(itemType / 10) * 10).toString();
 
                    // try to handle error type directly, fallback to parent error type.
-                   const whichType = issueTemplate ? itemType : parentIssueType;
-                   const whichTemplate = _krData.errorTypes[whichType];
+                   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}`;
+                       description = "This feature has a FIXME tag: " + description;
                        break;
                      case '292':
                      case '293':
                      case '296':
                      case '297':
                      case '298':
-                       description = `This turn-restriction~${description}`;
+                       description = "This turn-restriction~" + description;
                        break;
                      case '300':
                        description = 'This highway is missing a maxspeed tag';
                      case '411':
                      case '412':
                      case '413':
-                       description = `This feature~${description}`;
+                       description = "This feature~" + description;
                        break;
                    }
 
                    // move markers slightly so it doesn't obscure the geometry,
                    // then move markers away from other coincident markers
-                   let coincident = false;
+                   var coincident = false;
                    do {
                      // first time, move marker up. after that, move marker right.
-                     let delta = coincident ? [0.00001, 0] : [0, 0.00001];
+                     var delta = coincident ? [0.00001, 0] : [0, 0.00001];
                      loc = geoVecAdd(loc, delta);
-                     let bbox = geoExtent(loc).bbox();
+                     var bbox = geoExtent(loc).bbox();
                      coincident = _cache.rtree.search(bbox).length;
                    } while (coincident);
 
-                   let d = new QAItem(loc, this, itemType, id, {
-                     comment,
-                     description,
-                     whichType,
-                     parentIssueType,
+                   var d = new QAItem(loc, this$1, itemType, id, {
+                     comment: comment,
+                     description: description,
+                     whichType: whichType,
+                     parentIssueType: parentIssueType,
                      severity: whichTemplate.severity || 'error',
-                     objectId,
-                     objectType,
-                     schema,
-                     title
+                     objectId: objectId,
+                     objectType: objectType,
+                     schema: schema,
+                     title: title
                    });
 
                    d.replacements = tokenReplacements(d);
 
                  dispatch$1.call('loaded');
                })
-               .catch(() => {
+               .catch(function () {
                  delete _cache.inflightTile[tile.id];
                  _cache.loadedTile[tile.id] = true;
                });
          },
 
 
-         postUpdate(d, callback) {
+         postUpdate: function postUpdate(d, callback) {
+           var this$1 = this;
+
            if (_cache.inflightPost[d.id]) {
              return callback({ message: 'Error update already inflight', status: -2 }, d);
            }
 
-           const params = { schema: d.schema, id: d.id };
+           var params = { schema: d.schema, id: d.id };
 
            if (d.newStatus) {
              params.st = d.newStatus;
 
            // NOTE: This throws a CORS err, but it seems successful.
            // We don't care too much about the response, so this is fine.
-           const url = `${_krUrlRoot}/comment.php?` + utilQsString(params);
-           const controller = new AbortController();
+           var url = _krUrlRoot + "/comment.php?" + utilQsString(params);
+           var controller = new AbortController();
 
            _cache.inflightPost[d.id] = controller;
 
            // 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(() => {
+             .finally(function () {
                delete _cache.inflightPost[d.id];
 
                if (d.newStatus === 'ignore') {
                  // ignore permanently (false positive)
-                 this.removeItem(d);
+                 this$1.removeItem(d);
                } else if (d.newStatus === 'ignore_t') {
                  // ignore temporarily (error fixed)
-                 this.removeItem(d);
-                 _cache.closed[`${d.schema}:${d.id}`] = true;
+                 this$1.removeItem(d);
+                 _cache.closed[((d.schema) + ":" + (d.id))] = true;
                } else {
-                 d = this.replaceItem(d.update({
+                 d = this$1.replaceItem(d.update({
                    comment: d.newComment,
                    newComment: undefined,
                    newState: undefined
                  }));
                }
 
-               if (callback) callback(null, d);
+               if (callback) { callback(null, d); }
              });
          },
 
          // Get all cached QAItems covering the viewport
-         getItems(projection) {
-           const viewport = projection.clipExtent();
-           const min = [viewport[0][0], viewport[1][1]];
-           const max = [viewport[1][0], viewport[0][1]];
-           const bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
+         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.rtree.search(bbox).map(d => d.data);
+           return _cache.rtree.search(bbox).map(function (d) { return d.data; });
          },
 
          // Get a QAItem from cache
          // NOTE: Don't change method name until UI v3 is merged
-         getError(id) {
+         getError: function getError(id) {
            return _cache.data[id];
          },
 
          // Replace a single QAItem in the cache
-         replaceItem(item) {
-           if (!(item instanceof QAItem) || !item.id) return;
+         replaceItem: function replaceItem(item) {
+           if (!(item instanceof QAItem) || !item.id) { return; }
 
            _cache.data[item.id] = item;
            updateRtree(encodeIssueRtree(item), true); // true = replace
          },
 
          // Remove a single QAItem from the cache
-         removeItem(item) {
-           if (!(item instanceof QAItem) || !item.id) return;
+         removeItem: function removeItem(item) {
+           if (!(item instanceof QAItem) || !item.id) { return; }
 
            delete _cache.data[item.id];
            updateRtree(encodeIssueRtree(item), false); // false = remove
          },
 
-         issueURL(item) {
-           return `${_krUrlRoot}/report_map.php?schema=${item.schema}&error=${item.id}`;
+         issueURL: function issueURL(item) {
+           return (_krUrlRoot + "/report_map.php?schema=" + (item.schema) + "&error=" + (item.id));
          },
 
          // Get an array of issues closed during this session.
          // Used to populate `closed:keepright` changeset tag
-         getClosedIDs() {
+         getClosedIDs: function getClosedIDs() {
            return Object.keys(_cache.closed).sort();
          }
 
        };
 
-       const tiler$1 = utilTiler();
-       const dispatch$2 = dispatch('loaded');
-       const _tileZoom$1 = 14;
-       const _impOsmUrls = {
+       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'
        };
-       let _impOsmData = { icons: {} };
+       var _impOsmData = { icons: {} };
 
 
        // This gets reassigned if reset
-       let _cache$1;
+       var _cache$1;
 
        function abortRequest$1(i) {
-         Object.values(i).forEach(controller => {
+         Object.values(i).forEach(function (controller) {
            if (controller) {
              controller.abort();
            }
        }
 
        function abortUnwantedRequests$1(cache, tiles) {
-         Object.keys(cache.inflightTile).forEach(k => {
-           const wanted = tiles.find(tile => k === tile.id);
+         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];
 
        // Replace or remove QAItem from rtree
        function updateRtree$1(item, replace) {
-         _cache$1.rtree.remove(item, (a, b) => a.data.id === b.data.id);
+         _cache$1.rtree.remove(item, function (a, b) { return a.data.id === b.data.id; });
 
          if (replace) {
            _cache$1.rtree.insert(item);
        }
 
        function linkErrorObject(d) {
-         return `<a class="error_object_link">${d}</a>`;
+         return ("<a class=\"error_object_link\">" + d + "</a>");
        }
 
        function linkEntity(d) {
-         return `<a class="error_entity_link">${d}</a>`;
+         return ("<a class=\"error_entity_link\">" + d + "</a>");
        }
 
        function pointAverage(points) {
          if (points.length) {
-           const sum = points.reduce(
-             (acc, point) => geoVecAdd(acc, [point.lon, point.lat]),
+           var sum = points.reduce(
+             function (acc, point) { return geoVecAdd(acc, [point.lon, point.lat]); },
              [0,0]
            );
            return geoVecScale(sum, 1 / points.length);
        }
 
        function relativeBearing(p1, p2) {
-         let angle = Math.atan2(p2.lon - p1.lon, p2.lat - p1.lat);
+         var angle = Math.atan2(p2.lon - p1.lon, p2.lat - p1.lat);
          if (angle < 0) {
            angle += 2 * Math.PI;
          }
 
        // Assuming range [0,360)
        function cardinalDirection(bearing) {
-         const dir = 45 * Math.round(bearing / 45);
-         const compass = {
+         var dir = 45 * Math.round(bearing / 45);
+         var compass = {
            0: 'north',
            45: 'northeast',
            90: 'east',
            360: 'north'
          };
 
-         return _t(`QA.improveOSM.directions.${compass[dir]}`);
+         return _t(("QA.improveOSM.directions." + (compass[dir])));
        }
 
        // Errors shouldn't obscure eachother
        function preventCoincident(loc, bumpUp) {
-         let coincident = false;
+         var coincident = false;
          do {
            // first time, move marker up. after that, move marker right.
-           let delta = coincident ? [0.00001, 0] : (bumpUp ? [0, 0.00001] : [0, 0]);
+           var delta = coincident ? [0.00001, 0] : (bumpUp ? [0, 0.00001] : [0, 0]);
            loc = geoVecAdd(loc, delta);
-           let bbox = geoExtent(loc).bbox();
+           var bbox = geoExtent(loc).bbox();
            coincident = _cache$1.rtree.search(bbox).length;
          } while (coincident);
 
        var serviceImproveOSM = {
          title: 'improveOSM',
 
-         init() {
+         init: function init() {
            _mainFileFetcher.get('qa_data')
-             .then(d => _impOsmData = d.improveOSM);
+             .then(function (d) { return _impOsmData = d.improveOSM; });
 
            if (!_cache$1) {
              this.reset();
            this.event = utilRebind(this, dispatch$2, 'on');
          },
 
-         reset() {
+         reset: function reset() {
            if (_cache$1) {
              Object.values(_cache$1.inflightTile).forEach(abortRequest$1);
            }
            };
          },
 
-         loadIssues(projection) {
-           const options = {
+         loadIssues: function loadIssues(projection) {
+           var this$1 = this;
+
+           var options = {
              client: 'iD',
              status: 'OPEN',
              zoom: '19' // Use a high zoom so that clusters aren't returned
            };
 
            // determine the needed tiles to cover the view
-           const tiles = tiler$1
+           var tiles = tiler$1
              .zoomExtent([_tileZoom$1, _tileZoom$1])
              .getTiles(projection);
 
            abortUnwantedRequests$1(_cache$1, tiles);
 
            // issue new requests..
-           tiles.forEach(tile => {
-             if (_cache$1.loadedTile[tile.id] || _cache$1.inflightTile[tile.id]) return;
+           tiles.forEach(function (tile) {
+             if (_cache$1.loadedTile[tile.id] || _cache$1.inflightTile[tile.id]) { return; }
 
-             const [ east, north, west, south ] = tile.extent.rectangle();
-             const params = Object.assign({}, options, { east, south, west, north });
+             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 });
 
              // 3 separate requests to store for each tile
-             const requests = {};
+             var requests = {};
 
-             Object.keys(_impOsmUrls).forEach(k => {
+             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
-               const kParams = Object.assign({},
+               var kParams = Object.assign({},
                  params,
                  (k === 'mr') ? { type: 'PARKING,ROAD,BOTH,PATH' } : { confidenceLevel: 'C1' }
                );
-               const url = `${_impOsmUrls[k]}/search?` + utilQsString(kParams);
-               const controller = new AbortController();
+               var url = (_impOsmUrls[k]) + "/search?" + utilQsString(kParams);
+               var controller = new AbortController();
 
                requests[k] = controller;
 
                d3_json(url, { signal: controller.signal })
-                 .then(data => {
+                 .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];
 
                    // Road segments at high zoom == oneways
                    if (data.roadSegments) {
-                     data.roadSegments.forEach(feature => {
+                     data.roadSegments.forEach(function (feature) {
                        // Position error at the approximate middle of the segment
-                       const { points, wayId, fromNodeId, toNodeId } = feature;
-                       const itemId = `${wayId}${fromNodeId}${toNodeId}`;
-                       let mid = points.length / 2;
-                       let loc;
+                       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
                        // One-ways can land on same segment in opposite direction
                        loc = preventCoincident(loc, false);
 
-                       let d = new QAItem(loc, this, k, itemId, {
+                       var d = new QAItem(loc, this$1, k, itemId, {
                          issueKey: k, // used as a category
                          identifier: { // used to post changes
-                           wayId,
-                           fromNodeId,
-                           toNodeId
+                           wayId: wayId,
+                           fromNodeId: fromNodeId,
+                           toNodeId: toNodeId
                          },
                          objectId: wayId,
                          objectType: 'way'
 
                    // Tiles at high zoom == missing roads
                    if (data.tiles) {
-                     data.tiles.forEach(feature => {
-                       const { type, x, y, numberOfTrips } = feature;
-                       const geoType = type.toLowerCase();
-                       const itemId = `${geoType}${x}${y}${numberOfTrips}`;
+                     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
-                       let loc = pointAverage(feature.points);
+                       var loc = pointAverage(feature.points);
                        loc = preventCoincident(loc, false);
 
-                       let d = new QAItem(loc, this, `${k}-${geoType}`, itemId, {
+                       var d = new QAItem(loc, this$1, (k + "-" + geoType), itemId, {
                          issueKey: k,
-                         identifier: { x, y }
+                         identifier: { x: x, y: y }
                        });
 
                        d.replacements = {
                          num_trips: numberOfTrips,
-                         geometry_type: _t(`QA.improveOSM.geometry_types.${geoType}`)
+                         geometry_type: _t(("QA.improveOSM.geometry_types." + geoType))
                        };
 
                        // -1 trips indicates data came from a 3rd party
 
                    // Entities at high zoom == turn restrictions
                    if (data.entities) {
-                     data.entities.forEach(feature => {
-                       const { point, id, segments, numberOfPasses, turnType } = feature;
-                       const itemId = `${id.replace(/[,:+#]/g, '_')}`;
+                     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
-                       const loc = preventCoincident([point.lon, point.lat], true);
+                       var loc = preventCoincident([point.lon, point.lat], true);
 
                        // Elements are presented in a strange way
-                       const ids = id.split(',');
-                       const from_way = ids[0];
-                       const via_node = ids[3];
-                       const to_way = ids[2].split(':')[1];
+                       var ids = id.split(',');
+                       var from_way = ids[0];
+                       var via_node = ids[3];
+                       var to_way = ids[2].split(':')[1];
 
-                       let d = new QAItem(loc, this, k, itemId, {
+                       var d = new QAItem(loc, this$1, k, itemId, {
                          issueKey: k,
                          identifier: id,
                          objectId: via_node,
                        });
 
                        // Travel direction along from_way clarifies the turn restriction
-                       const [ p1, p2 ] = segments[0].points;
-                       const dir_of_travel = cardinalDirection(relativeBearing(p1, p2));
+                       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 = {
                      });
                    }
                  })
-                 .catch(() => {
+                 .catch(function () {
                    delete _cache$1.inflightTile[tile.id][k];
                    if (!Object.keys(_cache$1.inflightTile[tile.id]).length) {
                      delete _cache$1.inflightTile[tile.id];
            });
          },
 
-         getComments(item) {
+         getComments: function getComments(item) {
+           var this$1 = this;
+
            // If comments already retrieved no need to do so again
            if (item.comments) {
              return Promise.resolve(item);
            }
 
-           const key = item.issueKey;
-           let qParams = {};
+           var key = item.issueKey;
+           var qParams = {};
 
            if (key === 'ow') {
              qParams = item.identifier;
              qParams.targetId = item.identifier;
            }
 
-           const url = `${_impOsmUrls[key]}/retrieveComments?` + utilQsString(qParams);
-           const cacheComments = data => {
+           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.replaceItem(item);
+             this$1.replaceItem(item);
            };
 
-           return d3_json(url).then(cacheComments).then(() => item);
+           return d3_json(url).then(cacheComments).then(function () { return item; });
          },
 
-         postUpdate(d, callback) {
+         postUpdate: function postUpdate(d, callback) {
            if (!serviceOsm.authenticated()) { // Username required in payload
              return callback({ message: 'Not Authenticated', status: -3}, d);
            }
            serviceOsm.userDetails(sendPayload.bind(this));
 
            function sendPayload(err, user) {
+             var this$1 = this;
+
              if (err) { return callback(err, d); }
 
-             const key = d.issueKey;
-             const url = `${_impOsmUrls[key]}/comment`;
-             const payload = {
+             var key = d.issueKey;
+             var url = (_impOsmUrls[key]) + "/comment";
+             var payload = {
                username: user.display_name,
                targetIds: [ d.identifier ]
              };
                payload.text = d.newComment;
              }
 
-             const controller = new AbortController();
+             var controller = new AbortController();
              _cache$1.inflightPost[d.id] = controller;
 
-             const options = {
+             var options = {
                method: 'POST',
                signal: controller.signal,
                body: JSON.stringify(payload)
              };
 
              d3_json(url, options)
-               .then(() => {
+               .then(function () {
                  delete _cache$1.inflightPost[d.id];
 
                  // Just a comment, update error in cache
                  if (!d.newStatus) {
-                   const now = new Date();
-                   let comments = d.comments ? d.comments : [];
+                   var now = new Date();
+                   var comments = d.comments ? d.comments : [];
 
                    comments.push({
                      username: payload.username,
                      timestamp: now.getTime() / 1000
                    });
 
-                   this.replaceItem(d.update({
+                   this$1.replaceItem(d.update({
                      comments: comments,
                      newComment: undefined
                    }));
                  } else {
-                   this.removeItem(d);
+                   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] += 1;
                    }
                  }
-                 if (callback) callback(null, d);
+                 if (callback) { callback(null, d); }
                })
-               .catch(err => {
+               .catch(function (err) {
                  delete _cache$1.inflightPost[d.id];
-                 if (callback) callback(err.message);
+                 if (callback) { callback(err.message); }
                });
            }
          },
 
 
          // Get all cached QAItems covering the viewport
-         getItems(projection) {
-           const viewport = projection.clipExtent();
-           const min = [viewport[0][0], viewport[1][1]];
-           const max = [viewport[1][0], viewport[0][1]];
-           const bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
+         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$1.rtree.search(bbox).map(d => d.data);
+           return _cache$1.rtree.search(bbox).map(function (d) { return d.data; });
          },
 
          // Get a QAItem from cache
          // NOTE: Don't change method name until UI v3 is merged
-         getError(id) {
+         getError: function getError(id) {
            return _cache$1.data[id];
          },
 
          // get the name of the icon to display for this item
-         getIcon(itemType) {
+         getIcon: function getIcon(itemType) {
            return _impOsmData.icons[itemType];
          },
 
          // Replace a single QAItem in the cache
-         replaceItem(issue) {
-           if (!(issue instanceof QAItem) || !issue.id) return;
+         replaceItem: function replaceItem(issue) {
+           if (!(issue instanceof QAItem) || !issue.id) { return; }
 
            _cache$1.data[issue.id] = issue;
            updateRtree$1(encodeIssueRtree$1(issue), true); // true = replace
          },
 
          // Remove a single QAItem from the cache
-         removeItem(issue) {
-           if (!(issue instanceof QAItem) || !issue.id) return;
+         removeItem: function removeItem(issue) {
+           if (!(issue instanceof QAItem) || !issue.id) { return; }
 
            delete _cache$1.data[issue.id];
            updateRtree$1(encodeIssueRtree$1(issue), false); // false = remove
          },
 
          // Used to populate `closed:improveosm:*` changeset tags
-         getClosedCounts() {
+         getClosedCounts: function getClosedCounts() {
            return _cache$1.closed;
          }
        };
 
        module.exports = {
          defaults: getDefaults(),
-         getDefaults,
-         changeDefaults
+         getDefaults: getDefaults,
+         changeDefaults: changeDefaults
        };
        });
 
        /**
         * Helpers
         */
-       const escapeTest = /[&<>"']/;
-       const escapeReplace = /[&<>"']/g;
-       const escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
-       const escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
-       const escapeReplacements = {
+       var escapeTest = /[&<>"']/;
+       var escapeReplace = /[&<>"']/g;
+       var escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
+       var escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
+       var escapeReplacements = {
          '&': '&amp;',
          '<': '&lt;',
          '>': '&gt;',
          '"': '&quot;',
          "'": '&#39;'
        };
-       const getEscapeReplacement = (ch) => escapeReplacements[ch];
+       var getEscapeReplacement = function (ch) { return escapeReplacements[ch]; };
        function escape$1(html, encode) {
          if (encode) {
            if (escapeTest.test(html)) {
          return html;
        }
 
-       const unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;
+       var unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;
 
        function unescape$1(html) {
          // explicitly match decimal, hex, and named HTML entities
-         return html.replace(unescapeTest, (_, n) => {
+         return html.replace(unescapeTest, function (_, n) {
            n = n.toLowerCase();
-           if (n === 'colon') return ':';
+           if (n === 'colon') { return ':'; }
            if (n.charAt(0) === '#') {
              return n.charAt(1) === 'x'
                ? String.fromCharCode(parseInt(n.substring(2), 16))
          });
        }
 
-       const caret = /(^|[^\[])\^/g;
+       var caret = /(^|[^\[])\^/g;
        function edit(regex, opt) {
          regex = regex.source || regex;
          opt = opt || '';
-         const obj = {
-           replace: (name, val) => {
+         var obj = {
+           replace: function (name, val) {
              val = val.source || val;
              val = val.replace(caret, '$1');
              regex = regex.replace(name, val);
              return obj;
            },
-           getRegex: () => {
+           getRegex: function () {
              return new RegExp(regex, opt);
            }
          };
          return obj;
        }
 
-       const nonWordAndColonTest = /[^\w:]/g;
-       const originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
+       var nonWordAndColonTest = /[^\w:]/g;
+       var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
        function cleanUrl(sanitize, base, href) {
          if (sanitize) {
-           let prot;
+           var prot;
            try {
              prot = decodeURIComponent(unescape$1(href))
                .replace(nonWordAndColonTest, '')
          }
          try {
            href = encodeURI(href).replace(/%25/g, '%');
-         } catch (e) {
+         } catch (e$1) {
            return null;
          }
          return href;
        }
 
-       const baseUrls = {};
-       const justDomain = /^[^:]+:\/*[^/]*$/;
-       const protocol = /^([^:]+:)[\s\S]*$/;
-       const domain = /^([^:]+:\/*[^/]*)[\s\S]*$/;
+       var baseUrls = {};
+       var justDomain = /^[^:]+:\/*[^/]*$/;
+       var protocol = /^([^:]+:)[\s\S]*$/;
+       var domain = /^([^:]+:\/*[^/]*)[\s\S]*$/;
 
        function resolveUrl(base, href) {
          if (!baseUrls[' ' + base]) {
            }
          }
          base = baseUrls[' ' + base];
-         const relativeBase = base.indexOf(':') === -1;
+         var relativeBase = base.indexOf(':') === -1;
 
          if (href.substring(0, 2) === '//') {
            if (relativeBase) {
          }
        }
 
-       const noopTest = { exec: function noopTest() {} };
+       var noopTest = { exec: function noopTest() {} };
 
        function merge$1(obj) {
-         let i = 1,
+         var arguments$1 = arguments;
+
+         var i = 1,
            target,
            key;
 
          for (; i < arguments.length; i++) {
-           target = arguments[i];
+           target = arguments$1[i];
            for (key in target) {
              if (Object.prototype.hasOwnProperty.call(target, key)) {
                obj[key] = target[key];
        function splitCells(tableRow, count) {
          // ensure that every cell-delimiting pipe has a space
          // before it to distinguish it from an escaped pipe
-         const row = tableRow.replace(/\|/g, (match, offset, str) => {
-             let escaped = false,
+         var row = tableRow.replace(/\|/g, function (match, offset, str) {
+             var escaped = false,
                curr = offset;
-             while (--curr >= 0 && str[curr] === '\\') escaped = !escaped;
+             while (--curr >= 0 && str[curr] === '\\') { escaped = !escaped; }
              if (escaped) {
                // odd number of slashes means | is escaped
                // so we leave it alone
              }
            }),
            cells = row.split(/ \|/);
-         let i = 0;
+         var i = 0;
 
          if (cells.length > count) {
            cells.splice(count);
          } else {
-           while (cells.length < count) cells.push('');
+           while (cells.length < count) { cells.push(''); }
          }
 
          for (; i < cells.length; i++) {
        // /c*$/ is vulnerable to REDOS.
        // invert: Remove suffix of non-c chars instead. Default falsey.
        function rtrim(str, c, invert) {
-         const l = str.length;
+         var l = str.length;
          if (l === 0) {
            return '';
          }
 
          // Length of suffix matching the invert condition.
-         let suffLen = 0;
+         var suffLen = 0;
 
          // Step left until we fail to match the invert condition.
          while (suffLen < l) {
-           const currChar = str.charAt(l - suffLen - 1);
+           var currChar = str.charAt(l - suffLen - 1);
            if (currChar === c && !invert) {
              suffLen++;
            } else if (currChar !== c && invert) {
          if (str.indexOf(b[1]) === -1) {
            return -1;
          }
-         const l = str.length;
-         let level = 0,
+         var l = str.length;
+         var level = 0,
            i = 0;
          for (; i < l; i++) {
            if (str[i] === '\\') {
        var helpers = {
          escape: escape$1,
          unescape: unescape$1,
-         edit,
-         cleanUrl,
-         resolveUrl,
-         noopTest,
+         edit: edit,
+         cleanUrl: cleanUrl,
+         resolveUrl: resolveUrl,
+         noopTest: noopTest,
          merge: merge$1,
-         splitCells,
-         rtrim,
-         findClosingBracket,
-         checkSanitizeDeprecation
+         splitCells: splitCells,
+         rtrim: rtrim,
+         findClosingBracket: findClosingBracket,
+         checkSanitizeDeprecation: checkSanitizeDeprecation
        };
 
-       const { defaults: defaults$1 } = defaults;
-       const {
-         rtrim: rtrim$1,
-         splitCells: splitCells$1,
-         escape: escape$2,
-         findClosingBracket: findClosingBracket$1
-       } = helpers;
+       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;
 
        function outputLink(cap, link, raw) {
-         const href = link.href;
-         const title = link.title ? escape$2(link.title) : null;
+         var href = link.href;
+         var title = link.title ? escape$2(link.title) : null;
 
          if (cap[0].charAt(0) !== '!') {
            return {
              type: 'link',
-             raw,
-             href,
-             title,
+             raw: raw,
+             href: href,
+             title: title,
              text: cap[1]
            };
          } else {
            return {
              type: 'image',
-             raw,
+             raw: raw,
              text: escape$2(cap[1]),
-             href,
-             title
+             href: href,
+             title: title
            };
          }
        }
        /**
         * Tokenizer
         */
-       var Tokenizer_1 = class Tokenizer {
-         constructor(options) {
+       var Tokenizer_1 = /*@__PURE__*/(function () {
+         function Tokenizer(options) {
            this.options = options || defaults$1;
          }
 
-         space(src) {
-           const cap = this.rules.block.newline.exec(src);
+         Tokenizer.prototype.space = function space (src) {
+           var cap = this.rules.block.newline.exec(src);
            if (cap) {
              if (cap[0].length > 1) {
                return {
              }
              return { raw: '\n' };
            }
-         }
+         };
 
-         code(src, tokens) {
-           const cap = this.rules.block.code.exec(src);
+         Tokenizer.prototype.code = function code (src, tokens) {
+           var cap = this.rules.block.code.exec(src);
            if (cap) {
-             const lastToken = tokens[tokens.length - 1];
+             var lastToken = tokens[tokens.length - 1];
              // An indented code block cannot interrupt a paragraph.
              if (lastToken && lastToken.type === 'paragraph') {
                tokens.pop();
                lastToken.raw += '\n' + cap[0];
                return lastToken;
              } else {
-               const text = cap[0].replace(/^ {4}/gm, '');
+               var text = cap[0].replace(/^ {4}/gm, '');
                return {
                  type: 'code',
                  raw: cap[0],
                };
              }
            }
-         }
+         };
 
-         fences(src) {
-           const cap = this.rules.block.fences.exec(src);
+         Tokenizer.prototype.fences = function fences (src) {
+           var cap = this.rules.block.fences.exec(src);
            if (cap) {
              return {
                type: 'code',
                text: cap[3] || ''
              };
            }
-         }
+         };
 
-         heading(src) {
-           const cap = this.rules.block.heading.exec(src);
+         Tokenizer.prototype.heading = function heading (src) {
+           var cap = this.rules.block.heading.exec(src);
            if (cap) {
              return {
                type: 'heading',
                text: cap[2]
              };
            }
-         }
+         };
 
-         nptable(src) {
-           const cap = this.rules.block.nptable.exec(src);
+         Tokenizer.prototype.nptable = function nptable (src) {
+           var cap = this.rules.block.nptable.exec(src);
            if (cap) {
-             const item = {
+             var item = {
                type: 'table',
                header: splitCells$1(cap[1].replace(/^ *| *\| *$/g, '')),
                align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
              };
 
              if (item.header.length === item.align.length) {
-               let l = item.align.length;
-               let i;
+               var l = item.align.length;
+               var i;
                for (i = 0; i < l; i++) {
                  if (/^ *-+: *$/.test(item.align[i])) {
                    item.align[i] = 'right';
                return item;
              }
            }
-         }
+         };
 
-         hr(src) {
-           const cap = this.rules.block.hr.exec(src);
+         Tokenizer.prototype.hr = function hr (src) {
+           var cap = this.rules.block.hr.exec(src);
            if (cap) {
              return {
                type: 'hr',
                raw: cap[0]
              };
            }
-         }
+         };
 
-         blockquote(src) {
-           const cap = this.rules.block.blockquote.exec(src);
+         Tokenizer.prototype.blockquote = function blockquote (src) {
+           var cap = this.rules.block.blockquote.exec(src);
            if (cap) {
-             const text = cap[0].replace(/^ *> ?/gm, '');
+             var text = cap[0].replace(/^ *> ?/gm, '');
 
              return {
                type: 'blockquote',
                raw: cap[0],
-               text
+               text: text
              };
            }
-         }
+         };
 
-         list(src) {
-           const cap = this.rules.block.list.exec(src);
+         Tokenizer.prototype.list = function list (src) {
+           var cap = this.rules.block.list.exec(src);
            if (cap) {
-             let raw = cap[0];
-             const bull = cap[2];
-             const isordered = bull.length > 1;
+             var raw = cap[0];
+             var bull = cap[2];
+             var isordered = bull.length > 1;
 
-             const list = {
+             var list = {
                type: 'list',
-               raw,
+               raw: raw,
                ordered: isordered,
                start: isordered ? +bull : '',
                loose: false,
              };
 
              // Get each top-level item.
-             const itemMatch = cap[0].match(this.rules.block.item);
+             var itemMatch = cap[0].match(this.rules.block.item);
 
-             let next = false,
+             var next = false,
                item,
                space,
                b,
                istask,
                ischecked;
 
-             const l = itemMatch.length;
-             for (let i = 0; i < l; i++) {
+             var l = itemMatch.length;
+             for (var i = 0; i < l; i++) {
                item = itemMatch[i];
                raw = item;
 
                loose = next || /\n\n(?!\s*$)/.test(item);
                if (i !== l - 1) {
                  next = item.charAt(item.length - 1) === '\n';
-                 if (!loose) loose = next;
+                 if (!loose) { loose = next; }
                }
 
                if (loose) {
                }
 
                list.items.push({
-                 raw,
+                 raw: raw,
                  task: istask,
                  checked: ischecked,
                  loose: loose,
 
              return list;
            }
-         }
+         };
 
-         html(src) {
-           const cap = this.rules.block.html.exec(src);
+         Tokenizer.prototype.html = function html (src) {
+           var cap = this.rules.block.html.exec(src);
            if (cap) {
              return {
                type: this.options.sanitize
                text: this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape$2(cap[0])) : cap[0]
              };
            }
-         }
+         };
 
-         def(src) {
-           const cap = this.rules.block.def.exec(src);
+         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);
-             const tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
+             if (cap[3]) { cap[3] = cap[3].substring(1, cap[3].length - 1); }
+             var tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
              return {
-               tag,
+               tag: tag,
                raw: cap[0],
                href: cap[2],
                title: cap[3]
              };
            }
-         }
+         };
 
-         table(src) {
-           const cap = this.rules.block.table.exec(src);
+         Tokenizer.prototype.table = function table (src) {
+           var cap = this.rules.block.table.exec(src);
            if (cap) {
-             const item = {
+             var item = {
                type: 'table',
                header: splitCells$1(cap[1].replace(/^ *| *\| *$/g, '')),
                align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
              if (item.header.length === item.align.length) {
                item.raw = cap[0];
 
-               let l = item.align.length;
-               let i;
+               var l = item.align.length;
+               var i;
                for (i = 0; i < l; i++) {
                  if (/^ *-+: *$/.test(item.align[i])) {
                    item.align[i] = 'right';
                return item;
              }
            }
-         }
+         };
 
-         lheading(src) {
-           const cap = this.rules.block.lheading.exec(src);
+         Tokenizer.prototype.lheading = function lheading (src) {
+           var cap = this.rules.block.lheading.exec(src);
            if (cap) {
              return {
                type: 'heading',
                text: cap[1]
              };
            }
-         }
+         };
 
-         paragraph(src) {
-           const cap = this.rules.block.paragraph.exec(src);
+         Tokenizer.prototype.paragraph = function paragraph (src) {
+           var cap = this.rules.block.paragraph.exec(src);
            if (cap) {
              return {
                type: 'paragraph',
                  : cap[1]
              };
            }
-         }
+         };
 
-         text(src) {
-           const cap = this.rules.block.text.exec(src);
+         Tokenizer.prototype.text = function text (src) {
+           var cap = this.rules.block.text.exec(src);
            if (cap) {
              return {
                type: 'text',
                text: cap[0]
              };
            }
-         }
+         };
 
-         escape(src) {
-           const cap = this.rules.inline.escape.exec(src);
+         Tokenizer.prototype.escape = function escape$1 (src) {
+           var cap = this.rules.inline.escape.exec(src);
            if (cap) {
              return {
                type: 'escape',
                text: escape$2(cap[1])
              };
            }
-         }
+         };
 
-         tag(src, inLink, inRawBlock) {
-           const cap = this.rules.inline.tag.exec(src);
+         Tokenizer.prototype.tag = function tag (src, inLink, inRawBlock) {
+           var cap = this.rules.inline.tag.exec(src);
            if (cap) {
              if (!inLink && /^<a /i.test(cap[0])) {
                inLink = true;
                  ? 'text'
                  : 'html',
                raw: cap[0],
-               inLink,
-               inRawBlock,
+               inLink: inLink,
+               inRawBlock: inRawBlock,
                text: this.options.sanitize
                  ? (this.options.sanitizer
                    ? this.options.sanitizer(cap[0])
                  : cap[0]
              };
            }
-         }
+         };
 
-         link(src) {
-           const cap = this.rules.inline.link.exec(src);
+         Tokenizer.prototype.link = function link (src) {
+           var cap = this.rules.inline.link.exec(src);
            if (cap) {
-             const lastParenIndex = findClosingBracket$1(cap[2], '()');
+             var lastParenIndex = findClosingBracket$1(cap[2], '()');
              if (lastParenIndex > -1) {
-               const start = cap[0].indexOf('!') === 0 ? 5 : 4;
-               const linkLen = start + cap[1].length + lastParenIndex;
+               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] = '';
              }
-             let href = cap[2];
-             let title = '';
+             var href = cap[2];
+             var title = '';
              if (this.options.pedantic) {
-               const link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
+               var link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
 
                if (link) {
                  href = link[1];
                title = cap[3] ? cap[3].slice(1, -1) : '';
              }
              href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
-             const token = outputLink(cap, {
+             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;
            }
-         }
+         };
 
-         reflink(src, links) {
-           let cap;
+         Tokenizer.prototype.reflink = function reflink (src, links) {
+           var cap;
            if ((cap = this.rules.inline.reflink.exec(src))
                || (cap = this.rules.inline.nolink.exec(src))) {
-             let link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
+             var link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
              link = links[link.toLowerCase()];
              if (!link || !link.href) {
-               const text = cap[0].charAt(0);
+               var text = cap[0].charAt(0);
                return {
                  type: 'text',
                  raw: text,
-                 text
+                 text: text
                };
              }
-             const token = outputLink(cap, link, cap[0]);
+             var token = outputLink(cap, link, cap[0]);
              return token;
            }
-         }
+         };
 
-         strong(src) {
-           const cap = this.rules.inline.strong.exec(src);
+         Tokenizer.prototype.strong = function strong (src) {
+           var cap = this.rules.inline.strong.exec(src);
            if (cap) {
              return {
                type: 'strong',
                text: cap[4] || cap[3] || cap[2] || cap[1]
              };
            }
-         }
+         };
 
-         em(src) {
-           const cap = this.rules.inline.em.exec(src);
+         Tokenizer.prototype.em = function em (src) {
+           var cap = this.rules.inline.em.exec(src);
            if (cap) {
              return {
                type: 'em',
                text: cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]
              };
            }
-         }
+         };
 
-         codespan(src) {
-           const cap = this.rules.inline.code.exec(src);
+         Tokenizer.prototype.codespan = function codespan (src) {
+           var cap = this.rules.inline.code.exec(src);
            if (cap) {
              return {
                type: 'codespan',
                text: escape$2(cap[2].trim(), true)
              };
            }
-         }
+         };
 
-         br(src) {
-           const cap = this.rules.inline.br.exec(src);
+         Tokenizer.prototype.br = function br (src) {
+           var cap = this.rules.inline.br.exec(src);
            if (cap) {
              return {
                type: 'br',
                raw: cap[0]
              };
            }
-         }
+         };
 
-         del(src) {
-           const cap = this.rules.inline.del.exec(src);
+         Tokenizer.prototype.del = function del (src) {
+           var cap = this.rules.inline.del.exec(src);
            if (cap) {
              return {
                type: 'del',
                text: cap[1]
              };
            }
-         }
+         };
 
-         autolink(src, mangle) {
-           const cap = this.rules.inline.autolink.exec(src);
+         Tokenizer.prototype.autolink = function autolink (src, mangle) {
+           var cap = this.rules.inline.autolink.exec(src);
            if (cap) {
-             let text, href;
+             var text, href;
              if (cap[2] === '@') {
                text = escape$2(this.options.mangle ? mangle(cap[1]) : cap[1]);
                href = 'mailto:' + text;
              return {
                type: 'link',
                raw: cap[0],
-               text,
-               href,
+               text: text,
+               href: href,
                tokens: [
                  {
                    type: 'text',
                    raw: text,
-                   text
+                   text: text
                  }
                ]
              };
            }
-         }
+         };
 
-         url(src, mangle) {
-           let cap;
+         Tokenizer.prototype.url = function url (src, mangle) {
+           var cap;
            if (cap = this.rules.inline.url.exec(src)) {
-             let text, href;
+             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
-               let prevCapZero;
+               var prevCapZero;
                do {
                  prevCapZero = cap[0];
                  cap[0] = this.rules.inline._backpedal.exec(cap[0])[0];
              return {
                type: 'link',
                raw: cap[0],
-               text,
-               href,
+               text: text,
+               href: href,
                tokens: [
                  {
                    type: 'text',
                    raw: text,
-                   text
+                   text: text
                  }
                ]
              };
            }
-         }
+         };
 
-         inlineText(src, inRawBlock, smartypants) {
-           const cap = this.rules.inline.text.exec(src);
+         Tokenizer.prototype.inlineText = function inlineText (src, inRawBlock, smartypants) {
+           var cap = this.rules.inline.text.exec(src);
            if (cap) {
-             let text;
+             var text;
              if (inRawBlock) {
                text = this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape$2(cap[0])) : cap[0];
              } else {
              return {
                type: 'text',
                raw: cap[0],
-               text
+               text: text
              };
            }
-         }
-       };
+         };
+
+         return Tokenizer;
+       }());
 
-       const {
-         noopTest: noopTest$1,
-         edit: edit$1,
-         merge: merge$2
-       } = helpers;
+       var noopTest$1 = helpers.noopTest;
+       var edit$1 = helpers.edit;
+       var merge$2 = helpers.merge;
 
        /**
         * Block-Level Grammar
         */
-       const block = {
+       var block = {
          newline: /^\n+/,
          code: /^( {4}[^\n]+\n*)+/,
          fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,
        /**
         * Inline-Level Grammar
         */
-       const inline = {
+       var inline = {
          escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
          autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
          url: noopTest$1,
        });
 
        var rules = {
-         block,
-         inline
+         block: block,
+         inline: inline
        };
 
-       const { defaults: defaults$2 } = defaults;
-       const { block: block$1, inline: inline$1 } = rules;
+       var defaults$2 = defaults.defaults;
+       var block$1 = rules.block;
+       var inline$1 = rules.inline;
 
        /**
         * smartypants text replacement
         * mangle email addresses
         */
        function mangle(text) {
-         let out = '',
+         var out = '',
            i,
            ch;
 
-         const l = text.length;
+         var l = text.length;
          for (i = 0; i < l; i++) {
            ch = text.charCodeAt(i);
            if (Math.random() > 0.5) {
        /**
         * Block Lexer
         */
-       var Lexer_1 = class Lexer {
-         constructor(options) {
+       var Lexer_1 = /*@__PURE__*/(function () {
+         function Lexer(options) {
            this.tokens = [];
            this.tokens.links = Object.create(null);
            this.options = options || defaults$2;
            this.tokenizer = this.options.tokenizer;
            this.tokenizer.options = this.options;
 
-           const rules = {
+           var rules = {
              block: block$1.normal,
              inline: inline$1.normal
            };
            this.tokenizer.rules = rules;
          }
 
+         var staticAccessors = { rules: { configurable: true } };
+
          /**
           * Expose Rules
           */
-         static get rules() {
+         staticAccessors.rules.get = function () {
            return {
              block: block$1,
              inline: inline$1
            };
-         }
+         };
 
          /**
           * Static Lex Method
           */
-         static lex(src, options) {
-           const lexer = new Lexer(options);
+         Lexer.lex = function lex (src, options) {
+           var lexer = new Lexer(options);
            return lexer.lex(src);
-         }
+         };
 
          /**
           * Preprocessing
           */
-         lex(src) {
+         Lexer.prototype.lex = function lex (src) {
            src = src
              .replace(/\r\n|\r/g, '\n')
              .replace(/\t/g, '    ');
            this.inline(this.tokens);
 
            return this.tokens;
-         }
+         };
 
          /**
           * Lexing
           */
-         blockTokens(src, tokens = [], top = true) {
+         Lexer.prototype.blockTokens = function blockTokens (src, tokens, top) {
+           if ( tokens === void 0 ) tokens = [];
+           if ( top === void 0 ) top = true;
+
            src = src.replace(/^ +$/gm, '');
-           let token, i, l;
+           var token, i, l;
 
            while (src) {
              // newline
              }
 
              if (src) {
-               const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);
+               var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);
                if (this.options.silent) {
                  console.error(errMsg);
                  break;
            }
 
            return tokens;
-         }
+         };
 
-         inline(tokens) {
-           let i,
+         Lexer.prototype.inline = function inline (tokens) {
+           var i,
              j,
              k,
              l2,
              row,
              token;
 
-           const l = tokens.length;
+           var l = tokens.length;
            for (i = 0; i < l; i++) {
              token = tokens[i];
              switch (token.type) {
            }
 
            return tokens;
-         }
+         };
 
          /**
           * Lexing/Compiling
           */
-         inlineTokens(src, tokens = [], inLink = false, inRawBlock = false) {
-           let token;
+         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 (src) {
-               const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);
+               var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);
                if (this.options.silent) {
                  console.error(errMsg);
                  break;
            }
 
            return tokens;
-         }
-       };
+         };
 
-       const { defaults: defaults$3 } = defaults;
-       const {
-         cleanUrl: cleanUrl$1,
-         escape: escape$3
-       } = helpers;
+         Object.defineProperties( Lexer, staticAccessors );
+
+         return Lexer;
+       }());
+
+       var defaults$3 = defaults.defaults;
+       var cleanUrl$1 = helpers.cleanUrl;
+       var escape$3 = helpers.escape;
 
        /**
         * Renderer
         */
-       var Renderer_1 = class Renderer {
-         constructor(options) {
+       var Renderer_1 = /*@__PURE__*/(function () {
+         function Renderer(options) {
            this.options = options || defaults$3;
          }
 
-         code(code, infostring, escaped) {
-           const lang = (infostring || '').match(/\S*/)[0];
+         Renderer.prototype.code = function code (code$1, infostring, escaped) {
+           var lang = (infostring || '').match(/\S*/)[0];
            if (this.options.highlight) {
-             const out = this.options.highlight(code, lang);
-             if (out != null && out !== code) {
+             var out = this.options.highlight(code$1, lang);
+             if (out != null && out !== code$1) {
                escaped = true;
-               code = out;
+               code$1 = out;
              }
            }
 
            if (!lang) {
              return '<pre><code>'
-               + (escaped ? code : escape$3(code, true))
+               + (escaped ? code$1 : escape$3(code$1, true))
                + '</code></pre>';
            }
 
              + this.options.langPrefix
              + escape$3(lang, true)
              + '">'
-             + (escaped ? code : escape$3(code, true))
+             + (escaped ? code$1 : escape$3(code$1, true))
              + '</code></pre>\n';
-         }
+         };
 
-         blockquote(quote) {
+         Renderer.prototype.blockquote = function blockquote (quote) {
            return '<blockquote>\n' + quote + '</blockquote>\n';
-         }
+         };
 
-         html(html) {
-           return html;
-         }
+         Renderer.prototype.html = function html (html$1) {
+           return html$1;
+         };
 
-         heading(text, level, raw, slugger) {
+         Renderer.prototype.heading = function heading (text, level, raw, slugger) {
            if (this.options.headerIds) {
              return '<h'
                + level
            }
            // ignore IDs
            return '<h' + level + '>' + text + '</h' + level + '>\n';
-         }
+         };
 
-         hr() {
+         Renderer.prototype.hr = function hr () {
            return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
-         }
+         };
 
-         list(body, ordered, start) {
-           const type = ordered ? 'ol' : 'ul',
+         Renderer.prototype.list = function list (body, ordered, start) {
+           var type = ordered ? 'ol' : 'ul',
              startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
            return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
-         }
+         };
 
-         listitem(text) {
+         Renderer.prototype.listitem = function listitem (text) {
            return '<li>' + text + '</li>\n';
-         }
+         };
 
-         checkbox(checked) {
+         Renderer.prototype.checkbox = function checkbox (checked) {
            return '<input '
              + (checked ? 'checked="" ' : '')
              + 'disabled="" type="checkbox"'
              + (this.options.xhtml ? ' /' : '')
              + '> ';
-         }
+         };
 
-         paragraph(text) {
+         Renderer.prototype.paragraph = function paragraph (text) {
            return '<p>' + text + '</p>\n';
-         }
+         };
 
-         table(header, body) {
-           if (body) body = '<tbody>' + body + '</tbody>';
+         Renderer.prototype.table = function table (header, body) {
+           if (body) { body = '<tbody>' + body + '</tbody>'; }
 
            return '<table>\n'
              + '<thead>\n'
              + '</thead>\n'
              + body
              + '</table>\n';
-         }
+         };
 
-         tablerow(content) {
+         Renderer.prototype.tablerow = function tablerow (content) {
            return '<tr>\n' + content + '</tr>\n';
-         }
+         };
 
-         tablecell(content, flags) {
-           const type = flags.header ? 'th' : 'td';
-           const tag = flags.align
+         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 + '</' + type + '>\n';
-         }
+         };
 
          // span level renderer
-         strong(text) {
+         Renderer.prototype.strong = function strong (text) {
            return '<strong>' + text + '</strong>';
-         }
+         };
 
-         em(text) {
+         Renderer.prototype.em = function em (text) {
            return '<em>' + text + '</em>';
-         }
+         };
 
-         codespan(text) {
+         Renderer.prototype.codespan = function codespan (text) {
            return '<code>' + text + '</code>';
-         }
+         };
 
-         br() {
+         Renderer.prototype.br = function br () {
            return this.options.xhtml ? '<br/>' : '<br>';
-         }
+         };
 
-         del(text) {
+         Renderer.prototype.del = function del (text) {
            return '<del>' + text + '</del>';
-         }
+         };
 
-         link(href, title, text) {
+         Renderer.prototype.link = function link (href, title, text) {
            href = cleanUrl$1(this.options.sanitize, this.options.baseUrl, href);
            if (href === null) {
              return text;
            }
-           let out = '<a href="' + escape$3(href) + '"';
+           var out = '<a href="' + escape$3(href) + '"';
            if (title) {
              out += ' title="' + title + '"';
            }
            out += '>' + text + '</a>';
            return out;
-         }
+         };
 
-         image(href, title, text) {
+         Renderer.prototype.image = function image (href, title, text) {
            href = cleanUrl$1(this.options.sanitize, this.options.baseUrl, href);
            if (href === null) {
              return text;
            }
 
-           let out = '<img src="' + href + '" alt="' + text + '"';
+           var out = '<img src="' + href + '" alt="' + text + '"';
            if (title) {
              out += ' title="' + title + '"';
            }
            out += this.options.xhtml ? '/>' : '>';
            return out;
-         }
+         };
 
-         text(text) {
-           return text;
-         }
-       };
+         Renderer.prototype.text = function text (text$1) {
+           return text$1;
+         };
+
+         return Renderer;
+       }());
 
        /**
         * TextRenderer
         * returns only the textual part of the token
         */
-       var TextRenderer_1 = class TextRenderer {
-         // no need for block level renderers
-         strong(text) {
-           return text;
-         }
+       var TextRenderer_1 = /*@__PURE__*/(function () {
+         function TextRenderer () {}
 
-         em(text) {
+         TextRenderer.prototype.strong = function strong (text) {
            return text;
-         }
+         };
 
-         codespan(text) {
+         TextRenderer.prototype.em = function em (text) {
            return text;
-         }
+         };
 
-         del(text) {
+         TextRenderer.prototype.codespan = function codespan (text) {
            return text;
-         }
+         };
 
-         html(text) {
+         TextRenderer.prototype.del = function del (text) {
            return text;
-         }
+         };
 
-         text(text) {
+         TextRenderer.prototype.html = function html (text) {
            return text;
-         }
+         };
+
+         TextRenderer.prototype.text = function text (text$1) {
+           return text$1;
+         };
 
-         link(href, title, text) {
+         TextRenderer.prototype.link = function link (href, title, text) {
            return '' + text;
-         }
+         };
 
-         image(href, title, text) {
+         TextRenderer.prototype.image = function image (href, title, text) {
            return '' + text;
-         }
+         };
 
-         br() {
+         TextRenderer.prototype.br = function br () {
            return '';
-         }
-       };
+         };
+
+         return TextRenderer;
+       }());
 
        /**
         * Slugger generates header id
         */
-       var Slugger_1 = class Slugger {
-         constructor() {
+       var Slugger_1 = /*@__PURE__*/(function () {
+         function Slugger() {
            this.seen = {};
          }
 
          /**
           * Convert string to unique id
           */
-         slug(value) {
-           let slug = value
+         Slugger.prototype.slug = function slug (value) {
+           var slug = value
              .toLowerCase()
              .trim()
              // remove html tags
              .replace(/\s/g, '-');
 
            if (this.seen.hasOwnProperty(slug)) {
-             const originalSlug = slug;
+             var originalSlug = slug;
              do {
                this.seen[originalSlug]++;
                slug = originalSlug + '-' + this.seen[originalSlug];
            this.seen[slug] = 0;
 
            return slug;
-         }
-       };
+         };
 
-       const { defaults: defaults$4 } = defaults;
-       const {
-         unescape: unescape$2
-       } = helpers;
+         return Slugger;
+       }());
+
+       var defaults$4 = defaults.defaults;
+       var unescape$2 = helpers.unescape;
 
        /**
         * Parsing & Compiling
         */
-       var Parser_1 = class Parser {
-         constructor(options) {
+       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;
          /**
           * Static Parse Method
           */
-         static parse(tokens, options) {
-           const parser = new Parser(options);
+         Parser.parse = function parse (tokens, options) {
+           var parser = new Parser(options);
            return parser.parse(tokens);
-         }
+         };
 
          /**
           * Parse Loop
           */
-         parse(tokens, top = true) {
-           let out = '',
+         Parser.prototype.parse = function parse (tokens, top) {
+           if ( top === void 0 ) top = true;
+
+           var out = '',
              i,
              j,
              k,
              task,
              checkbox;
 
-           const l = tokens.length;
+           var l = tokens.length;
            for (i = 0; i < l; i++) {
              token = tokens[i];
              switch (token.type) {
                  continue;
                }
                default: {
-                 const errMsg = 'Token with "' + token.type + '" type was not found.';
+                 var errMsg = 'Token with "' + token.type + '" type was not found.';
                  if (this.options.silent) {
                    console.error(errMsg);
                    return;
            }
 
            return out;
-         }
+         };
 
          /**
           * Parse Inline Tokens
           */
-         parseInline(tokens, renderer) {
+         Parser.prototype.parseInline = function parseInline (tokens, renderer) {
            renderer = renderer || this.renderer;
-           let out = '',
+           var out = '',
              i,
              token;
 
-           const l = tokens.length;
+           var l = tokens.length;
            for (i = 0; i < l; i++) {
              token = tokens[i];
              switch (token.type) {
                  break;
                }
                default: {
-                 const errMsg = 'Token with "' + token.type + '" type was not found.';
+                 var errMsg = 'Token with "' + token.type + '" type was not found.';
                  if (this.options.silent) {
                    console.error(errMsg);
                    return;
              }
            }
            return out;
-         }
-       };
+         };
 
-       const {
-         merge: merge$3,
-         checkSanitizeDeprecation: checkSanitizeDeprecation$1,
-         escape: escape$4
-       } = helpers;
-       const {
-         getDefaults,
-         changeDefaults,
-         defaults: defaults$5
-       } = defaults;
+         return Parser;
+       }());
+
+       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
 
            opt = merge$3({}, marked.defaults, opt || {});
            checkSanitizeDeprecation$1(opt);
-           const highlight = opt.highlight;
-           let tokens,
+           var highlight = opt.highlight;
+           var tokens,
              pending,
              i = 0;
 
 
            pending = tokens.length;
 
-           const done = function(err) {
+           var done = function(err) {
              if (err) {
                opt.highlight = highlight;
                return callback(err);
              }
 
-             let out;
+             var out;
 
              try {
                out = Parser_1.parse(tokens, opt);
 
            delete opt.highlight;
 
-           if (!pending) return done();
+           if (!pending) { return done(); }
 
            for (; i < tokens.length; i++) {
              (function(token) {
                  return --pending || done();
                }
                return highlight(token.text, token.lang, function(err, code) {
-                 if (err) return done(err);
+                 if (err) { return done(err); }
                  if (code == null || code === token.text) {
                    return --pending || done();
                  }
            opt = merge$3({}, marked.defaults, opt || {});
            checkSanitizeDeprecation$1(opt);
            return Parser_1.parse(Lexer_1.lex(src, opt), opt);
-         } catch (e) {
-           e.message += '\nPlease report this to https://github.com/markedjs/marked.';
+         } catch (e$1) {
+           e$1.message += '\nPlease report this to https://github.com/markedjs/marked.';
            if ((opt || marked.defaults).silent) {
              return '<p>An error occurred:</p><pre>'
-               + escape$4(e.message + '', true)
+               + escape$4(e$1.message + '', true)
                + '</pre>';
            }
-           throw e;
+           throw e$1;
          }
        }
 
         */
 
        marked.use = function(extension) {
-         const opts = merge$3({}, extension);
+         var opts = merge$3({}, extension);
          if (extension.renderer) {
-           const renderer = marked.defaults.renderer || new Renderer_1();
-           for (const prop in extension.renderer) {
-             const prevRenderer = renderer[prop];
-             renderer[prop] = (...args) => {
-               let ret = extension.renderer[prop].apply(renderer, args);
+           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;
              };
-           }
+           };
+
+           for (var prop in extension.renderer) loop( prop );
            opts.renderer = renderer;
          }
          if (extension.tokenizer) {
-           const tokenizer = marked.defaults.tokenizer || new Tokenizer_1();
-           for (const prop in extension.tokenizer) {
-             const prevTokenizer = tokenizer[prop];
-             tokenizer[prop] = (...args) => {
-               let ret = extension.tokenizer[prop].apply(tokenizer, args);
+           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;
              };
-           }
+           };
+
+           for (var prop$1 in extension.tokenizer) loop$1( prop );
            opts.tokenizer = tokenizer;
          }
          marked.setOptions(opts);
 
        var marked_1 = marked;
 
-       const tiler$2 = utilTiler();
-       const dispatch$3 = dispatch('loaded');
-       const _tileZoom$2 = 14;
-       const _osmoseUrlRoot = 'https://osmose.openstreetmap.fr/api/0.3';
-       let _osmoseData = { icons: {}, items: [] };
+       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
-       let _cache$2;
+       var _cache$2;
 
        function abortRequest$2(controller) {
          if (controller) {
        }
 
        function abortUnwantedRequests$2(cache, tiles) {
-         Object.keys(cache.inflightTile).forEach(k => {
-           let wanted = tiles.find(tile => k === tile.id);
+         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];
 
        // Replace or remove QAItem from rtree
        function updateRtree$2(item, replace) {
-         _cache$2.rtree.remove(item, (a, b) => a.data.id === b.data.id);
+         _cache$2.rtree.remove(item, function (a, b) { return a.data.id === b.data.id; });
 
          if (replace) {
            _cache$2.rtree.insert(item);
 
        // Issues shouldn't obscure eachother
        function preventCoincident$1(loc) {
-         let coincident = false;
+         var coincident = false;
          do {
            // first time, move marker up. after that, move marker right.
-           let delta = coincident ? [0.00001, 0] : [0, 0.00001];
+           var delta = coincident ? [0.00001, 0] : [0, 0.00001];
            loc = geoVecAdd(loc, delta);
-           let bbox = geoExtent(loc).bbox();
+           var bbox = geoExtent(loc).bbox();
            coincident = _cache$2.rtree.search(bbox).length;
          } while (coincident);
 
        var serviceOsmose = {
          title: 'osmose',
 
-         init() {
+         init: function init() {
            _mainFileFetcher.get('qa_data')
-             .then(d => {
+             .then(function (d) {
                _osmoseData = d.osmose;
                _osmoseData.items = Object.keys(d.osmose.icons)
-                 .map(s => s.split('-')[0])
-                 .reduce((unique, item) => unique.indexOf(item) !== -1 ? unique : [...unique, item], []);
+                 .map(function (s) { return s.split('-')[0]; })
+                 .reduce(function (unique, item) { return unique.indexOf(item) !== -1 ? unique : unique.concat( [item]); }, []);
              });
 
            if (!_cache$2) {
            this.event = utilRebind(this, dispatch$3, 'on');
          },
 
-         reset() {
-           let _strings = {};
-           let _colors = {};
+         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
            };
          },
 
-         loadIssues(projection) {
-           let params = {
+         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
            };
 
            // determine the needed tiles to cover the view
-           let tiles = tiler$2
+           var tiles = tiler$2
              .zoomExtent([_tileZoom$2, _tileZoom$2])
              .getTiles(projection);
 
            abortUnwantedRequests$2(_cache$2, tiles);
 
            // issue new requests..
-           tiles.forEach(tile => {
-             if (_cache$2.loadedTile[tile.id] || _cache$2.inflightTile[tile.id]) return;
+           tiles.forEach(function (tile) {
+             if (_cache$2.loadedTile[tile.id] || _cache$2.inflightTile[tile.id]) { return; }
 
-             let [ x, y, z ] = tile.xyz;
-             let url = `${_osmoseUrlRoot}/issues/${z}/${x}/${y}.json?` + utilQsString(params);
+             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);
 
-             let controller = new AbortController();
+             var controller = new AbortController();
              _cache$2.inflightTile[tile.id] = controller;
 
              d3_json(url, { signal: controller.signal })
-               .then(data => {
+               .then(function (data) {
                  delete _cache$2.inflightTile[tile.id];
                  _cache$2.loadedTile[tile.id] = true;
 
                  if (data.features) {
-                   data.features.forEach(issue => {
-                     const { item, class: cl, uuid: id } = issue.properties;
+                   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) */
-                     const itemType = `${item}-${cl}`;
+                     var itemType = item + "-" + cl;
 
                      // Filter out unsupported issue types (some are too specific or advanced)
                      if (itemType in _osmoseData.icons) {
-                       let loc = issue.geometry.coordinates; // lon, lat
+                       var loc = issue.geometry.coordinates; // lon, lat
                        loc = preventCoincident$1(loc);
 
-                       let d = new QAItem(loc, this, itemType, id, { item });
+                       var d = new QAItem(loc, this$1, itemType, id, { item: item });
 
                        // Setting elems here prevents UI detail requests
                        if (item === 8300 || item === 8360) {
 
                  dispatch$3.call('loaded');
                })
-               .catch(() => {
+               .catch(function () {
                  delete _cache$2.inflightTile[tile.id];
                  _cache$2.loadedTile[tile.id] = true;
                });
            });
          },
 
-         loadIssueDetail(issue) {
+         loadIssueDetail: function loadIssueDetail(issue) {
+           var this$1 = this;
+
            // Issue details only need to be fetched once
            if (issue.elems !== undefined) {
              return Promise.resolve(issue);
            }
 
-           const url = `${_osmoseUrlRoot}/issue/${issue.id}?langs=${_mainLocalizer.localeCode()}`;
-           const cacheDetails = data => {
+           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(e => e.type.substring(0,1) + e.id);
+             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.replaceItem(issue);
+             this$1.replaceItem(issue);
            };
 
-           return d3_json(url).then(cacheDetails).then(() => issue);
+           return d3_json(url).then(cacheDetails).then(function () { return issue; });
          },
 
-         loadStrings(locale=_mainLocalizer.localeCode()) {
-           const items = Object.keys(_osmoseData.icons);
+         loadStrings: function loadStrings(locale) {
+           if ( locale === void 0 ) locale=_mainLocalizer.localeCode();
+
+           var items = Object.keys(_osmoseData.icons);
 
            if (
              locale in _cache$2.strings
 
            // Only need to cache strings for supported issue types
            // Using multiple individual item + class requests to reduce fetched data size
-           const allRequests = items.map(itemType => {
+           var allRequests = items.map(function (itemType) {
              // No need to request data we already have
-             if (itemType in _cache$2.strings[locale]) return;
+             if (itemType in _cache$2.strings[locale]) { return; }
 
-             const cacheData = data => {
+             var cacheData = function (data) {
                // Bunch of nested single value arrays of objects
-               const [ cat = {items:[]} ] = data.categories;
-               const [ item = {class:[]} ] = cat.items;
-               const [ cl = null ] = item.class;
+               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`);
+                 console.log(("Osmose strings request (" + itemType + ") had unexpected data"));
                  /* eslint-enable no-console */
                  return;
                }
 
                // Cache served item colors to automatically style issue markers later
-               const { item: itemInt, color } = item;
+               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;
                }
 
                // Value of root key will be null if no string exists
                // If string exists, value is an object with key 'auto' for string
-               const { title, detail, fix, trap } = cl;
+               var title = cl.title;
+               var detail = cl.detail;
+               var fix = cl.fix;
+               var trap = cl.trap;
 
                // Osmose titles shouldn't contain markdown
-               let 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);
+               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;
              };
 
-             const [ item, cl ] = itemType.split('-');
+             var ref = itemType.split('-');
+             var item = ref[0];
+             var cl = ref[1];
 
              // Osmose API falls back to English strings where untranslated or if locale doesn't exist
-             const url = `${_osmoseUrlRoot}/items/${item}/class/${cl}?langs=${locale}`;
+             var url = _osmoseUrlRoot + "/items/" + item + "/class/" + cl + "?langs=" + locale;
 
              return d3_json(url).then(cacheData);
            });
 
-           return Promise.all(allRequests).then(() => _cache$2.strings[locale]);
+           return Promise.all(allRequests).then(function () { return _cache$2.strings[locale]; });
          },
 
-         getStrings(itemType, locale=_mainLocalizer.localeCode()) {
+         getStrings: function getStrings(itemType, locale) {
+           if ( locale === void 0 ) locale=_mainLocalizer.localeCode();
+
            // No need to fallback to English, Osmose API handles this for us
            return (locale in _cache$2.strings) ? _cache$2.strings[locale][itemType] : {};
          },
 
-         getColor(itemType) {
+         getColor: function getColor(itemType) {
            return (itemType in _cache$2.colors) ? _cache$2.colors[itemType] : '#FFFFFF';
          },
 
-         postUpdate(issue, callback) {
+         postUpdate: function postUpdate(issue, callback) {
+           var this$1 = this;
+
            if (_cache$2.inflightPost[issue.id]) {
              return callback({ message: 'Issue update already inflight', status: -2 }, issue);
            }
 
            // UI sets the status to either 'done' or 'false'
-           const url = `${_osmoseUrlRoot}/issue/${issue.id}/${issue.newStatus}`;
-           const controller = new AbortController();
-           const after = () => {
+           var url = _osmoseUrlRoot + "/issue/" + (issue.id) + "/" + (issue.newStatus);
+           var controller = new AbortController();
+           var after = function () {
              delete _cache$2.inflightPost[issue.id];
 
-             this.removeItem(issue);
+             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] += 1;
              }
-             if (callback) callback(null, issue);
+             if (callback) { callback(null, issue); }
            };
 
            _cache$2.inflightPost[issue.id] = controller;
 
            fetch(url, { signal: controller.signal })
              .then(after)
-             .catch(err => {
+             .catch(function (err) {
                delete _cache$2.inflightPost[issue.id];
-               if (callback) callback(err.message);
+               if (callback) { callback(err.message); }
              });
          },
 
          // Get all cached QAItems covering the viewport
-         getItems(projection) {
-           const viewport = projection.clipExtent();
-           const min = [viewport[0][0], viewport[1][1]];
-           const max = [viewport[1][0], viewport[0][1]];
-           const bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
+         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(d => d.data);
+           return _cache$2.rtree.search(bbox).map(function (d) { return d.data; });
          },
 
          // Get a QAItem from cache
          // NOTE: Don't change method name until UI v3 is merged
-         getError(id) {
+         getError: function getError(id) {
            return _cache$2.data[id];
          },
 
          // get the name of the icon to display for this item
-         getIcon(itemType) {
+         getIcon: function getIcon(itemType) {
            return _osmoseData.icons[itemType];
          },
 
          // Replace a single QAItem in the cache
-         replaceItem(item) {
-           if (!(item instanceof QAItem) || !item.id) return;
+         replaceItem: function replaceItem(item) {
+           if (!(item instanceof QAItem) || !item.id) { return; }
 
            _cache$2.data[item.id] = item;
            updateRtree$2(encodeIssueRtree$2(item), true); // true = replace
          },
 
          // Remove a single QAItem from the cache
-         removeItem(item) {
-           if (!(item instanceof QAItem) || !item.id) return;
+         removeItem: function removeItem(item) {
+           if (!(item instanceof QAItem) || !item.id) { return; }
 
            delete _cache$2.data[item.id];
            updateRtree$2(encodeIssueRtree$2(item), false); // false = remove
          },
 
          // Used to populate `closed:osmose:*` changeset tags
-         getClosedCounts() {
+         getClosedCounts: function getClosedCounts() {
            return _cache$2.closed;
          },
 
-         itemURL(item) {
-           return `https://osmose.openstreetmap.fr/en/error/${item.id}`;
+         itemURL: function itemURL(item) {
+           return ("https://osmose.openstreetmap.fr/en/error/" + (item.id));
          }
        };
 
 
 
        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;
+           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; }
        }
 
 
                    bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
                });
 
-           if (nextPage > maxPages) return;
+           if (nextPage > maxPages) { return; }
 
            var id = tile.id + ',' + String(nextPage);
-           if (cache.loaded[id] || cache.inflight[id]) return;
+           if (cache.loaded[id] || cache.inflight[id]) { return; }
 
            var controller = new AbortController();
            cache.inflight[id] = controller;
                }
 
                var viewer = context.container().select('.photoviewer');
-               if (!viewer.empty()) viewer.datum(null);
+               if (!viewer.empty()) { viewer.datum(null); }
 
                viewer
                    .classed('hide', true)
 
 
            updateViewer: function(context, imageKey) {
-               if (!imageKey) return this;
+               if (!imageKey) { return this; }
 
                if (!_mlyViewer) {
                    this.initViewer(context, imageKey);
                var d = _mlyCache.images.forImageKey[imageKey];
 
                var viewer = context.container().select('.photoviewer');
-               if (!viewer.empty()) viewer.datum(d);
+               if (!viewer.empty()) { viewer.datum(d); }
 
                imageKey = (d && d.key) || imageKey;
                if (!fromViewer && imageKey) {
 
 
            updateDetections: function(d) {
-               if (!_mlyViewer || _mlyFallback) return;
+               if (!_mlyViewer || _mlyFallback) { return; }
 
                var imageKey = d && d.key;
-               if (!imageKey) return;
+               if (!imageKey) { return; }
 
                var detections = _mlyCache.image_detections.forImageKey[imageKey] || [];
                detections.forEach(function(data) {
 
                function makeTag(data) {
                    var valueParts = data.value.split('--');
-                   if (valueParts.length !== 3) return;
+                   if (valueParts.length !== 3) { return; }
 
                    var text = valueParts[1].replace(/-/g, ' ');
                    var tag;
                );
 
                if (cached.length > 0) {
-                   if (callback) callback(null, cached[0].data);
+                   if (callback) { callback(null, cached[0].data); }
                    return;
                }
 
                var params = { zoom: 13, format: 'json', addressdetails: 1, lat: loc[1], lon: loc[0] };
                var url = apibase$1 + 'reverse?' + utilQsString(params);
 
-               if (_inflight[url]) return;
+               if (_inflight[url]) { return; }
                var controller = new AbortController();
                _inflight[url] = controller;
 
                        }
                        var extent = geoExtent(loc).padByMeters(200);
                        _nominatimCache.insert(Object.assign(extent.bbox(), {data: result}));
-                       if (callback) callback(null, result);
+                       if (callback) { callback(null, result); }
                    })
                    .catch(function(err) {
                        delete _inflight[url];
-                       if (err.name === 'AbortError') return;
-                       if (callback) callback(err.message);
+                       if (err.name === 'AbortError') { return; }
+                       if (callback) { callback(err.message); }
                    });
            },
 
                var searchVal = encodeURIComponent(val);
                var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json';
 
-               if (_inflight[url]) return;
+               if (_inflight[url]) { return; }
                var controller = new AbortController();
                _inflight[url] = controller;
 
                        if (result && result.error) {
                            throw new Error(result.error);
                        }
-                       if (callback) callback(null, result);
+                       if (callback) { callback(null, result); }
                    })
                    .catch(function(err) {
                        delete _inflight[url];
-                       if (err.name === 'AbortError') return;
-                       if (callback) callback(err.message);
+                       if (err.name === 'AbortError') { return; }
+                       if (callback) { callback(err.message); }
                    });
            }
 
 
 
        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;
+           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; }
        }
 
 
                bbBottomRight: [bbox.minY, bbox.maxX].join(',')
            }, true);
 
-           if (nextPage > maxPages) return;
+           if (nextPage > maxPages) { return; }
 
            var id = tile.id + ',' + String(nextPage);
-           if (cache.loaded[id] || cache.inflight[id]) return;
+           if (cache.loaded[id] || cache.inflight[id]) { return; }
 
            var controller = new AbortController();
            cache.inflight[id] = controller;
 
                function rotate(deg) {
                    return function() {
-                       if (!_oscSelectedImage) return;
+                       if (!_oscSelectedImage) { return; }
                        var sequenceKey = _oscSelectedImage.sequence_id;
                        var sequence = _oscCache.sequences[sequenceKey];
-                       if (!sequence) return;
+                       if (!sequence) { return; }
 
                        var r = sequence.rotation || 0;
                        r += deg;
 
-                       if (r > 180) r -= 360;
-                       if (r < -180) r += 360;
+                       if (r > 180) { r -= 360; }
+                       if (r < -180) { r += 360; }
                        sequence.rotation = r;
 
                        var wrap = context.container().select('.photoviewer .osc-wrapper');
 
                function step(stepBy) {
                    return function() {
-                       if (!_oscSelectedImage) return;
+                       if (!_oscSelectedImage) { return; }
                        var sequenceKey = _oscSelectedImage.sequence_id;
                        var sequence = _oscCache.sequences[sequenceKey];
-                       if (!sequence) return;
+                       if (!sequence) { return; }
 
                        var nextIndex = _oscSelectedImage.sequence_index + stepBy;
                        var nextImage = sequence.images[nextIndex];
-                       if (!nextImage) return;
+                       if (!nextImage) { return; }
 
                        context.map().centerEase(nextImage.loc);
 
                _oscSelectedImage = null;
 
                var viewer = context.container().select('.photoviewer');
-               if (!viewer.empty()) viewer.datum(null);
+               if (!viewer.empty()) { viewer.datum(null); }
 
                viewer
                    .classed('hide', true)
 
 
                function localeDateString(s) {
-                   if (!s) return null;
+                   if (!s) { return null; }
                    var options = { day: 'numeric', month: 'short', year: 'numeric' };
                    var d = new Date(s);
-                   if (isNaN(d.getTime())) return null;
+                   if (isNaN(d.getTime())) { return null; }
                    return d.toLocaleDateString(_mainLocalizer.localeCode(), options);
                }
            },
            selectImage: function(context, d) {
                _oscSelectedImage = d;
                var viewer = context.container().select('.photoviewer');
-               if (!viewer.empty()) viewer.datum(d);
+               if (!viewer.empty()) { viewer.datum(d); }
 
                this.setStyles(context, null, true);
 
        var hasOwnProperty$3 = Object.prototype.hasOwnProperty;
 
        function extend$2() {
+           var arguments$1 = arguments;
+
            var target = {};
 
            for (var i = 0; i < arguments.length; i++) {
-               var source = arguments[i];
+               var source = arguments$1[i];
 
                for (var key in source) {
                    if (hasOwnProperty$3.call(source, key)) {
                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 (twoHundred.test(xhr.status)) { callback(null, xhr); }
+                   else { return callback(xhr, null); }
                }
            };
            xhr.onerror = function(e) { return callback(e, null); };
            xhr.open(method, url, true);
-           for (var h in headers) xhr.setRequestHeader(h, headers[h]);
+           for (var h in headers) { xhr.setRequestHeader(h, headers[h]); }
            xhr.send(data);
            return xhr;
        };
        };
 
        ohauth.baseString = function(method, url, params) {
-           if (params.oauth_signature) delete params.oauth_signature;
+           if (params.oauth_signature) { delete params.oauth_signature; }
            return [
                method,
                ohauth.percentEncode(url),
                    oauth_nonce: ohauth.nonce()
                };
 
-               if (token) oauth_params.oauth_token = token;
+               if (token) { oauth_params.oauth_token = token; }
 
                var all_params = immutable({}, oauth_params, query_params, extra_params),
                    base_str = ohauth.baseString(method, base_uri, all_params);
        }(commonjsGlobal, function() {
 
          function resolveUrl(/* ...urls */) {
+           var arguments$1 = arguments;
+
            var numUrls = arguments.length;
 
            if (numUrls === 0) {
            var resolved;
 
            for (var index = 1; index < numUrls; index++) {
-             a.href = arguments[index];
+             a.href = arguments$1[index];
              resolved = a.href;
              base.href = resolved;
            }
                        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[i]), function(val, key) {
+                                       each(Object(arguments$1[i]), function(val, key) {
                                                obj[key] = val;
                                        });
                                }                       
 
            // TODO: detect lack of click event
            oauth.authenticate = function(callback) {
-               if (oauth.authenticated()) return callback();
+               if (oauth.authenticated()) { return callback(); }
 
                oauth.logout();
 
 
                function reqTokenDone(err, xhr) {
                    o.done();
-                   if (err) return callback(err);
+                   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({
 
                function accessTokenDone(err, xhr) {
                    o.done();
-                   if (err) return callback(err);
+                   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);
 
                function accessTokenDone(err, xhr) {
                    o.done();
-                   if (err) return callback(err);
+                   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);
                }
 
                function done(err, xhr) {
-                   if (err) return callback(err);
-                   else if (xhr.responseXML) return callback(err, xhr.responseXML);
-                   else return callback(err, xhr.response);
+                   if (err) { return callback(err); }
+                   else if (xhr.responseXML) { return callback(err, xhr.responseXML); }
+                   else { return callback(err, xhr.response); }
                }
            };
 
            // 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);
+               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;
+               if (!arguments.length) { return o; }
 
                o = _;
                o.url = o.url || 'https://www.openstreetmap.org';
 
            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);
+                   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;
+                   if (arguments.length === 1) { return storage[o.url + x]; }
+                   else if (arguments.length === 2) { return storage[o.url + x] = y; }
                };
            }
 
 
        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 (cache.toLoad[k]) { return; }
+               if (visibleTiles.find(function(tile) { return k === tile.id; })) { return; }
 
                abortRequest$5(cache.inflight[k]);
                delete cache.inflight[k];
                    for (var j = 0; j < childNodes.length; j++) {
                        var node = childNodes[j];
                        var nodeName = node.nodeName;
-                       if (nodeName === '#text') continue;
+                       if (nodeName === '#text') { continue; }
                        parsedComment[nodeName] = node.textContent;
 
                        if (nodeName === 'uid') {
                return new osmNode({
                    id:  uid,
                    visible: typeof obj.visible === 'boolean' ? obj.visible : true,
-                   version: obj.version.toString(),
-                   changeset: obj.changeset.toString(),
+                   version: obj.version && obj.version.toString(),
+                   changeset: obj.changeset && obj.changeset.toString(),
                    timestamp: obj.timestamp,
                    user: obj.user,
-                   uid: obj.uid.toString(),
+                   uid: obj.uid && obj.uid.toString(),
                    loc: [parseFloat(obj.lon), parseFloat(obj.lat)],
                    tags: obj.tags
                });
                return new osmWay({
                    id:  uid,
                    visible: typeof obj.visible === 'boolean' ? obj.visible : true,
-                   version: obj.version.toString(),
-                   changeset: obj.changeset.toString(),
+                   version: obj.version && obj.version.toString(),
+                   changeset: obj.changeset && obj.changeset.toString(),
                    timestamp: obj.timestamp,
                    user: obj.user,
-                   uid: obj.uid.toString(),
+                   uid: obj.uid && obj.uid.toString(),
                    tags: obj.tags,
                    nodes: getNodesJSON(obj)
                });
                return new osmRelation({
                    id:  uid,
                    visible: typeof obj.visible === 'boolean' ? obj.visible : true,
-                   version: obj.version.toString(),
-                   changeset: obj.changeset.toString(),
+                   version: obj.version && obj.version.toString(),
+                   changeset: obj.changeset && obj.changeset.toString(),
                    timestamp: obj.timestamp,
                    user: obj.user,
-                   uid: obj.uid.toString(),
+                   uid: obj.uid && obj.uid.toString(),
                    tags: obj.tags,
                    members: getMembersJSON(obj)
                });
 
            var json = payload;
            if (typeof json !== 'object')
-              json = JSON.parse(payload);
+              { json = JSON.parse(payload); }
 
            if (!json.elements)
-               return callback({ message: 'No JSON', status: -1 });
+               { return callback({ message: 'No JSON', status: -1 }); }
 
            var children = json.elements;
 
                var result;
                for (var i = 0; i < children.length; i++) {
                    result = parseChild(children[i]);
-                   if (result) results.push(result);
+                   if (result) { results.push(result); }
                }
                callback(null, results);
            });
 
            function parseChild(child) {
                var parser = jsonparsers[child.type];
-               if (!parser) return null;
+               if (!parser) { return null; }
 
                var uid;
 
                uid = osmEntity.id.fromOSM(child.type, child.id);
                if (options.skipSeen) {
-                   if (_tileCache.seen[uid]) return null;  // avoid reparsing a "seen" entity
+                   if (_tileCache.seen[uid]) { return null; }  // avoid reparsing a "seen" entity
                    _tileCache.seen[uid] = true;
                }
 
                for (var i = 0; i < childNodes.length; i++) {
                    var node = childNodes[i];
                    var nodeName = node.nodeName;
-                   if (nodeName === '#text') continue;
+                   if (nodeName === '#text') { continue; }
 
                    // if the element is comments, parse the comments
                    if (nodeName === 'comments') {
                var result;
                for (var i = 0; i < children.length; i++) {
                    result = parseChild(children[i]);
-                   if (result) results.push(result);
+                   if (result) { results.push(result); }
                }
                callback(null, results);
            });
 
            function parseChild(child) {
                var parser = parsers[child.nodeName];
-               if (!parser) return null;
+               if (!parser) { return null; }
 
                var uid;
                if (child.nodeName === 'user') {
                } 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
+                       if (_tileCache.seen[uid]) { return null; }  // avoid reparsing a "seen" entity
                        _tileCache.seen[uid] = true;
                    }
                }
                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);
+               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() };
 
                function done(err, payload) {
                    if (that.getConnectionId() !== cid) {
-                       if (callback) callback({ message: 'Connection Switched', status: -1 });
+                       if (callback) { callback({ message: 'Connection Switched', status: -1 }); }
                        return;
                    }
 
                            done(null, data);
                        })
                        .catch(function(err) {
-                           if (err.name === 'AbortError') return;
+                           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
                this.loadFromAPI(
                    '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : '') + '.json',
                    function(err, entities) {
-                       if (callback) callback(err, { data: entities });
+                       if (callback) { callback(err, { data: entities }); }
                    },
                    options
                );
                this.loadFromAPI(
                    '/api/0.6/' + type + '/' + osmID + '/' + version + '.json',
                    function(err, entities) {
-                       if (callback) callback(err, { data: entities });
+                       if (callback) { callback(err, { data: entities }); }
                    },
                    options
                );
                        that.loadFromAPI(
                            '/api/0.6/' + type + '.json?' + type + '=' + arr.join(),
                            function(err, entities) {
-                               if (callback) callback(err, { data: entities });
+                               if (callback) { callback(err, { data: entities }); }
                            },
                            options
                        );
 
                function uploadedChangeset(err) {
                    _changeset.inflight = null;
-                   if (err) return callback(err, changeset);
+                   if (err) { return callback(err, changeset); }
 
                    // Upload was successful, safe to call the callback.
                    // Add delay to allow for postgres replication #1646 #2678
 
                if (cached.length || !this.authenticated()) {
                    callback(undefined, cached);
-                   if (!this.authenticated()) return;  // require auth
+                   if (!this.authenticated()) { return; }  // require auth
                }
 
                utilArrayChunk(toLoad, 150).forEach(function(arr) {
                    } else {
                        var waynodes = xml.getElementsByTagName('waynodes');
                        var maxWayNodes = waynodes.length && parseInt(waynodes[0].getAttribute('maximum'), 10);
-                       if (maxWayNodes && isFinite(maxWayNodes)) _maxWayNodes = maxWayNodes;
+                       if (maxWayNodes && isFinite(maxWayNodes)) { _maxWayNodes = maxWayNodes; }
 
                        var apiStatus = xml.getElementsByTagName('status');
                        var val = apiStatus[0].getAttribute('api');
            // Load data (entities) from the API in tiles
            // GET /api/0.6/map?bbox=
            loadTiles: function(projection, callback) {
-               if (_off) return;
+               if (_off) { return; }
 
                // determine the needed tiles to cover the view
                var tiles = tiler$5.zoomExtent([_tileZoom$3, _tileZoom$3]).getTiles(projection);
            // 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;
+               if (_off) { return; }
+               if (_tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) { return; }
 
                if (!hasInflightRequests(_tileCache)) {
                    dispatch$6.call('loading');   // start the spinner
                // 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;
+               if (Object.keys(_tileCache.toLoad).length > 50) { return; }
 
                var k = geoZoomToScale(_tileZoom$3 + 1);
                var offset = geoRawMercator().scale(k)(loc);
                var tiles = tiler$5.zoomExtent([_tileZoom$3, _tileZoom$3]).getTiles(projection);
 
                tiles.forEach(function(tile) {
-                   if (_tileCache.toLoad[tile.id] || _tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) return;
+                   if (_tileCache.toLoad[tile.id] || _tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) { return; }
 
                    _tileCache.toLoad[tile.id] = true;
                    this.loadTile(tile, callback);
            // GET /api/0.6/notes?bbox=
            loadNotes: function(projection, noteOptions) {
                noteOptions = Object.assign({ limit: 10000, closed: 7 }, noteOptions);
-               if (_off) return;
+               if (_off) { return; }
 
                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;
+                   if (!uids.length) { return; }
                    that.loadUsers(uids, function() {});  // eagerly load user details
                }, 750);
 
 
                // issue new requests..
                tiles.forEach(function(tile) {
-                   if (_noteCache.loaded[tile.id] || _noteCache.inflight[tile.id]) return;
+                   if (_noteCache.loaded[tile.id] || _noteCache.inflight[tile.id]) { return; }
 
                    var options = { skipSeen: false };
                    _noteCache.inflight[tile.id] = that.loadFromAPI(
                    return callback({ message: 'Note update already inflight', status: -2 }, note);
                }
 
-               if (!note.loc[0] || !note.loc[1] || !note.newComment) return; // location & description required
+               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; }
                    action = 'reopen';
                } else {
                    action = 'comment';
-                   if (!note.newComment) return; // when commenting, comment required
+                   if (!note.newComment) { return; } // when commenting, comment required
                }
 
                var path = '/api/0.6/notes/' + note.id + '/' + action;
 
                function done(err, res) {
                    if (err) {
-                       if (callback) callback(err);
+                       if (callback) { callback(err); }
                        return;
                    }
                    if (that.getConnectionId() !== cid) {
-                       if (callback) callback({ message: 'Connection Switched', status: -1 });
+                       if (callback) { callback({ message: 'Connection Switched', status: -1 }); }
                        return;
                    }
                    _rateLimitError = undefined;
                    dispatch$6.call('change');
-                   if (callback) callback(err, res);
+                   if (callback) { callback(err, res); }
                    that.userChangesets(function() {});  // eagerly load user details/changesets
                }
 
 
 
            tileZoom: function(val) {
-               if (!arguments.length) return _tileZoom$3;
+               if (!arguments.length) { return _tileZoom$3; }
                _tileZoom$3 = val;
                return this;
            },
 
            // remove a single note from the cache
            removeNote: function(note) {
-               if (!(note instanceof osmNote) || !note.id) return;
+               if (!(note instanceof osmNote) || !note.id) { return; }
 
                delete _noteCache.note[note.id];
                updateRtree$3(encodeNoteRtree(note), false);  // false = remove
 
            // replace a single note in the cache
            replaceNote: function(note) {
-               if (!(note instanceof osmNote) || !note.id) return;
+               if (!(note instanceof osmNote) || !note.id) { return; }
 
                _noteCache.note[note.id] = note;
                updateRtree$3(encodeNoteRtree(note), true);  // true = replace
        var debouncedRequest = debounce(request, 500, { leading: false });
 
        function request(url, callback) {
-           if (_inflight$1[url]) return;
+           if (_inflight$1[url]) { return; }
            var controller = new AbortController();
            _inflight$1[url] = controller;
 
            d3_json(url, { signal: controller.signal })
                .then(function(result) {
                    delete _inflight$1[url];
-                   if (callback) callback(null, result);
+                   if (callback) { callback(null, result); }
                })
                .catch(function(err) {
                    delete _inflight$1[url];
-                   if (err.name === 'AbortError') return;
-                   if (callback) callback(err.message);
+                   if (err.name === 'AbortError') { return; }
+                   if (callback) { callback(err.message); }
                });
        }
 
             * @param langCode string e.g. 'fr' for French
             */
            claimToValue: function(entity, property, langCode) {
-               if (!entity.claims[property]) return undefined;
+               if (!entity.claims[property]) { return undefined; }
                var locale = _localeIDs[langCode];
                var preferredPick, localePick;
 
             * @param property string e.g. 'P31' for monolingual wiki page title
             */
            monolingualClaimToValueObj: function(entity, property) {
-               if (!entity || !entity.claims[property]) return undefined;
+               if (!entity || !entity.claims[property]) { return undefined; }
 
                return entity.claims[property].reduce(function(acc, obj) {
                    var value = obj.mainsnak.datavalue.value;
 
 
            apibase: function(val) {
-               if (!arguments.length) return apibase$3;
+               if (!arguments.length) { return apibase$3; }
                apibase$3 = val;
                return this;
            }
                var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
                var c = '';
                var i = -1;
-               while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
+               while (++i < 15) { c += chars.charAt(Math.floor(Math.random() * 52)); }
                return c;
            }
 
            return request;
        }
 
-       const bubbleApi = 'https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?';
-       const streetsideImagesApi = 'https://t.ssl.ak.tiles.virtualearth.net/tiles/';
-       const bubbleAppKey = 'AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm';
-       const pannellumViewerCSS = 'pannellum-streetside/pannellum.css';
-       const pannellumViewerJS = 'pannellum-streetside/pannellum.js';
-       const maxResults$2 = 2000;
-       const tileZoom$2 = 16.5;
-       const tiler$6 = utilTiler().zoomExtent([tileZoom$2, tileZoom$2]).skipNullIsland(true);
-       const dispatch$7 = dispatch('loadedBubbles', 'viewerChanged');
-       const minHfov = 10;         // zoom in degrees:  20, 10, 5
-       const maxHfov = 90;         // zoom out degrees
-       const defaultHfov = 45;
-
-       let _hires = false;
-       let _resolution = 512;    // higher numbers are slower - 512, 1024, 2048, 4096
-       let _currScene = 0;
-       let _ssCache;
-       let _pannellumViewer;
-       let _sceneOptions;
-       let _dataUrlArray = [];
+       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;
+
+       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 = [];
 
 
        /**
         * localeTimeStamp().
         */
        function localeTimestamp(s) {
-         if (!s) return null;
-         const options = { day: 'numeric', month: 'short', year: 'numeric' };
-         const d = new Date(s);
-         if (isNaN(d.getTime())) return null;
+         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);
        }
 
         * loadTiles() wraps the process of generating tiles and then fetching image points for each tile.
         */
        function loadTiles$2(which, url, projection, margin) {
-         const tiles = tiler$6.margin(margin).getTiles(projection);
+         var tiles = tiler$6.margin(margin).getTiles(projection);
 
          // abort inflight requests that are no longer needed
-         const cache = _ssCache[which];
-         Object.keys(cache.inflight).forEach(k => {
-           const wanted = tiles.find(tile => k.indexOf(tile.id + ',') === 0);
+         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];
            }
          });
 
-         tiles.forEach(tile => loadNextTilePage$2(which, url, tile));
+         tiles.forEach(function (tile) { return loadNextTilePage$2(which, url, tile); });
        }
 
 
         * loadNextTilePage() load data for the next tile page in line.
         */
        function loadNextTilePage$2(which, url, tile) {
-         const cache = _ssCache[which];
-         const nextPage = cache.nextPage[tile.id] || 0;
-         const id = tile.id + ',' + String(nextPage);
-         if (cache.loaded[id] || cache.inflight[id]) return;
+         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, (bubbles) => {
+         cache.inflight[id] = getBubbles(url, tile, function (bubbles) {
            cache.loaded[id] = true;
            delete cache.inflight[id];
-           if (!bubbles) return;
+           if (!bubbles) { return; }
 
            // [].shift() removes the first element, some statistics info, not a bubble point
            bubbles.shift();
 
-           const features = bubbles.map(bubble => {
-             if (cache.points[bubble.id]) return null;  // skip duplicates
+           var features = bubbles.map(function (bubble) {
+             if (cache.points[bubble.id]) { return null; }  // skip duplicates
 
-             const loc = [bubble.lo, bubble.la];
-             const d = {
+             var loc = [bubble.lo, bubble.la];
+             var d = {
                loc: loc,
                key: bubble.id,
                ca: bubble.he,
 
        // call this sometimes to connect the bubbles into sequences
        function connectSequences() {
-         let cache = _ssCache.bubbles;
-         let keepLeaders = [];
+         var cache = _ssCache.bubbles;
+         var keepLeaders = [];
 
-         for (let i = 0; i < cache.leaders.length; i++) {
-           let bubble = cache.points[cache.leaders[i]];
-           let seen = {};
+         for (var i = 0; i < cache.leaders.length; i++) {
+           var bubble = cache.points[cache.leaders[i]];
+           var seen = {};
 
            // try to make a sequence.. use the key of the leader bubble.
-           let sequence = { key: bubble.key, bubbles: [] };
-           let complete = false;
+           var sequence = { key: bubble.key, bubbles: [] };
+           var complete = false;
 
            do {
              sequence.bubbles.push(bubble);
              _ssCache.sequences[sequence.key] = sequence;
 
              // assign bubbles to the sequence
-             for (let j = 0; j < sequence.bubbles.length; j++) {
+             for (var j = 0; j < sequence.bubbles.length; j++) {
                sequence.bubbles[j].sequenceKey = sequence.key;
              }
 
              sequence.geojson = {
                type: 'LineString',
                properties: { key: sequence.key },
-               coordinates: sequence.bubbles.map(d => d.loc)
+               coordinates: sequence.bubbles.map(function (d) { return d.loc; })
              };
 
            } else {
         * getBubbles() handles the request to the server for a tile extent of 'bubbles' (streetside image locations).
         */
        function getBubbles(url, tile, callback) {
-         let rect = tile.extent.rectangle();
-         let urlForRequest = url + utilQsString({
+         var rect = tile.extent.rectangle();
+         var urlForRequest = url + utilQsString({
            n: rect[3],
            s: rect[1],
            e: rect[2],
            jsCallback: '{callback}'
          });
 
-         return jsonpRequest(urlForRequest, (data) => {
+         return jsonpRequest(urlForRequest, function (data) {
            if (!data || data.error) {
              callback(null);
            } else {
 
        // partition viewport into higher zoom tiles
        function partitionViewport$2(projection) {
-         let z = geoScaleToZoom(projection.scale());
-         let z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
-         let tiler = utilTiler().zoomExtent([z2, z2]);
+         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(tile => tile.extent);
+           .map(function (tile) { return tile.extent; });
        }
 
 
          limit = limit || 5;
 
          return partitionViewport$2(projection)
-           .reduce((result, extent) => {
-             let found = rtree.search(extent.bbox())
+           .reduce(function (result, extent) {
+             var found = rtree.search(extent.bbox())
                .slice(0, limit)
-               .map(d => d.data);
+               .map(function (d) { return d.data; });
 
              return (found.length ? result.concat(found) : result);
            }, []);
         * loadImage()
         */
        function loadImage(imgInfo) {
-         return new Promise(resolve => {
-           let img = new Image();
-           img.onload = () => {
-             let canvas = document.getElementById('ideditor-canvas' + imgInfo.face);
-             let ctx = canvas.getContext('2d');
+         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 = () => {
+           img.onerror = function () {
              resolve({ data: imgInfo, status: 'error' });
            };
            img.setAttribute('crossorigin', '');
         */
        function loadCanvas(imageGroup) {
          return Promise.all(imageGroup.map(loadImage))
-           .then((data) => {
-             let canvas = document.getElementById('ideditor-canvas' + data[0].imgInfo.face);
-             const which = { '01': 0, '02': 1, '03': 2, '10': 3, '11': 4, '12': 5 };
-             let face = data[0].imgInfo.face;
+           .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'};
            });
         */
        function loadFaces(faceGroup) {
          return Promise.all(faceGroup.map(loadCanvas))
-           .then(() => { return { status: 'loadFaces done' }; });
+           .then(function () { return { status: 'loadFaces done' }; });
        }
 
 
            .data(['canvas01', 'canvas02', 'canvas03', 'canvas10', 'canvas11', 'canvas12'])
            .enter()
            .append('canvas')
-           .attr('id', d => 'ideditor-' + d)
+           .attr('id', function (d) { return 'ideditor-' + d; })
            .attr('width', _resolution)
            .attr('height', _resolution);
        }
 
 
        function qkToXY(qk) {
-         let x = 0;
-         let y = 0;
-         let scale = 256;
-         for (let i = qk.length; i > 0; i--) {
-           const key = qk[i-1];
+         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;
 
 
        function getQuadKeys() {
-         let dim = _resolution / 256;
-         let quadKeys;
+         var dim = _resolution / 256;
+         var quadKeys;
 
          if (dim === 16) {
            quadKeys = [
           * bubbles()
           */
          bubbles: function(projection) {
-           const limit = 5;
+           var limit = 5;
            return searchLimited$2(limit, projection, _ssCache.bubbles.rtree);
          },
 
 
          sequences: function(projection) {
-           const viewport = projection.clipExtent();
-           const min = [viewport[0][0], viewport[1][1]];
-           const max = [viewport[1][0], viewport[0][1]];
-           const bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
-           let seen = {};
-           let results = [];
+           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 = [];
 
            // all sequences for bubbles in viewport
            _ssCache.bubbles.rtree.search(bbox)
-             .forEach(d => {
-               const key = d.data.sequenceKey;
+             .forEach(function (d) {
+               var key = d.data.sequenceKey;
                if (key && !seen[key]) {
                    seen[key] = true;
                    results.push(_ssCache.sequences[key].geojson);
           */
          loadBubbles: function(projection, margin) {
            // by default: request 2 nearby tiles so we can connect sequences.
-           if (margin === undefined) margin = 2;
+           if (margin === undefined) { margin = 2; }
 
            loadTiles$2('bubbles', bubbleApi, projection, margin);
          },
 
 
          initViewer: function () {
-           if (!window.pannellum) return;
-           if (_pannellumViewer) return;
+           if (!window.pannellum) { return; }
+           if (_pannellumViewer) { return; }
 
-           const sceneID = ++_currScene + '';
-           const options = {
+           var sceneID = ++_currScene + '';
+           var options = {
              'default': { firstScene: sceneID },
              scenes: {}
            };
           * loadViewer() create the streeside viewer.
           */
          loadViewer: function(context) {
-           let that = this;
+           var that = this;
 
-           let pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse';
+           var pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse';
 
            // create ms-wrapper, a photo wrapper class
-           let wrap = context.container().select('.photoviewer').selectAll('.ms-wrapper')
+           var wrap = context.container().select('.photoviewer').selectAll('.ms-wrapper')
              .data([0]);
 
            // inject ms-wrapper into the photoviewer div
            // (used by all to house each custom photo viewer)
-           let wrapEnter = wrap.enter()
+           var wrapEnter = wrap.enter()
              .append('div')
              .attr('class', 'photo-wrapper ms-wrapper')
              .classed('hide', true);
            wrapEnter
              .append('div')
              .attr('id', 'ideditor-viewer-streetside')
-             .on(pointerPrefix + 'down.streetside', () => {
+             .on(pointerPrefix + 'down.streetside', function () {
                select(window)
-                 .on(pointerPrefix + 'move.streetside', () => {
+                 .on(pointerPrefix + 'move.streetside', function () {
                    dispatch$7.call('viewerChanged');
                  }, true);
              })
-             .on(pointerPrefix + 'up.streetside pointercancel.streetside', () => {
+             .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.
-               let t = timer(elapsed => {
+               var t = timer(function (elapsed) {
                  dispatch$7.call('viewerChanged');
                  if (elapsed > 2000) {
                    t.stop();
              .append('div')
              .attr('class', 'photo-attribution fillD');
 
-           let controlsEnter = wrapEnter
+           var controlsEnter = wrapEnter
              .append('div')
              .attr('class', 'photo-controls-wrap')
              .append('div')
 
 
            // Register viewer resize handler
-           context.ui().photoviewer.on('resize.streetside', () => {
+           context.ui().photoviewer.on('resize.streetside', function () {
              if (_pannellumViewer) {
                _pannellumViewer.resize();
              }
 
 
            function step(stepBy) {
-             return () => {
-               let viewer = context.container().select('.photoviewer');
-               let selected = viewer.empty() ? undefined : viewer.datum();
-               if (!selected) return;
+             return function () {
+               var viewer = context.container().select('.photoviewer');
+               var selected = viewer.empty() ? undefined : viewer.datum();
+               if (!selected) { return; }
 
-               let nextID = (stepBy === 1 ? selected.ne : selected.pr);
-               let yaw = _pannellumViewer.getYaw();
-               let ca = selected.ca + yaw;
-               let origin = selected.loc;
+               var nextID = (stepBy === 1 ? selected.ne : selected.pr);
+               var yaw = _pannellumViewer.getYaw();
+               var ca = selected.ca + yaw;
+               var origin = selected.loc;
 
                // construct a search trapezoid pointing out from current bubble
-               const meters = 35;
-               let p1 = [
+               var meters = 35;
+               var p1 = [
                  origin[0] + geoMetersToLon(meters / 5, origin[1]),
                  origin[1]
                ];
-               let p2 = [
+               var p2 = [
                  origin[0] + geoMetersToLon(meters / 2, origin[1]),
                  origin[1] + geoMetersToLat(meters)
                ];
-               let p3 = [
+               var p3 = [
                  origin[0] - geoMetersToLon(meters / 2, origin[1]),
                  origin[1] + geoMetersToLat(meters)
                ];
-               let p4 = [
+               var p4 = [
                  origin[0] - geoMetersToLon(meters / 5, origin[1]),
                  origin[1]
                ];
 
-               let poly = [p1, p2, p3, p4, p1];
+               var poly = [p1, p2, p3, p4, p1];
 
                // rotate it to face forward/backward
-               let angle = (stepBy === 1 ? ca : ca + 180) * (Math.PI / 180);
+               var angle = (stepBy === 1 ? ca : ca + 180) * (Math.PI / 180);
                poly = geoRotate(poly, -angle, origin);
 
-               let extent = poly.reduce((extent, point) => {
+               var extent = poly.reduce(function (extent, point) {
                  return extent.extend(geoExtent(point));
                }, geoExtent());
 
                // find nearest other bubble in the search polygon
-               let minDist = Infinity;
+               var minDist = Infinity;
                _ssCache.bubbles.rtree.search(extent.bbox())
-                 .forEach(d => {
-                   if (d.data.key === selected.key) return;
-                   if (!geoPointInPolygon(d.data.loc, poly)) return;
+                 .forEach(function (d) {
+                   if (d.data.key === selected.key) { return; }
+                   if (!geoPointInPolygon(d.data.loc, poly)) { return; }
 
-                   let dist = geoVecLength(d.data.loc, selected.loc);
-                   let theta = selected.ca - d.data.ca;
-                   let minTheta = Math.min(Math.abs(theta), 360 - Math.abs(theta));
+                   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
                    }
                    }
                  });
 
-               let nextBubble = nextID && _ssCache.bubbles.points[nextID];
-               if (!nextBubble) return;
+               var nextBubble = nextID && _ssCache.bubbles.points[nextID];
+               if (!nextBubble) { return; }
 
                context.map().centerEase(nextBubble.loc);
 
                that.selectImage(context, nextBubble)
-                 .then(response => {
+                 .then(function (response) {
                    if (response.status === 'ok') {
                      _sceneOptions.yaw = yaw;
                      that.showViewer(context);
           * showViewer()
           */
          showViewer: function(context, yaw) {
-           if (!_sceneOptions) return;
+           if (!_sceneOptions) { return; }
 
            if (yaw !== undefined) {
              _sceneOptions.yaw = yaw;
              this.initViewer();
            } else {
              // make a new scene
-             let sceneID = ++_currScene + '';
+             var sceneID = ++_currScene + '';
              _pannellumViewer
                .addScene(sceneID, _sceneOptions)
                .loadScene(sceneID);
              }
            }
 
-           let wrap = context.container().select('.photoviewer')
+           var wrap = context.container().select('.photoviewer')
              .classed('hide', false);
 
-           let isHidden = wrap.selectAll('.photo-wrapper.ms-wrapper.hide').size();
+           var isHidden = wrap.selectAll('.photo-wrapper.ms-wrapper.hide').size();
 
            if (isHidden) {
              wrap
           * hideViewer()
           */
          hideViewer: function (context) {
-           let viewer = context.container().select('.photoviewer');
-           if (!viewer.empty()) viewer.datum(null);
+           var viewer = context.container().select('.photoviewer');
+           if (!viewer.empty()) { viewer.datum(null); }
 
            viewer
              .classed('hide', true)
           * selectImage().
           */
          selectImage: function (context, d) {
-           let that = this;
-           let viewer = context.container().select('.photoviewer');
-           if (!viewer.empty()) viewer.datum(d);
+           var that = this;
+           var viewer = context.container().select('.photoviewer');
+           if (!viewer.empty()) { viewer.datum(d); }
 
            this.setStyles(context, null, true);
 
-           let wrap = context.container().select('.photoviewer .ms-wrapper');
-           let attribution = wrap.selectAll('.photo-attribution').html('');
+           var wrap = context.container().select('.photoviewer .ms-wrapper');
+           var attribution = wrap.selectAll('.photo-attribution').html('');
 
            wrap.selectAll('.pnlm-load-box')   // display "loading.."
              .style('display', 'block');
              return Promise.resolve({ status: 'ok' });
            }
 
-           let line1 = attribution
+           var line1 = attribution
              .append('div')
              .attr('class', 'attribution-row');
 
-           const hiresDomId = utilUniqueDomId('streetside-hires');
+           var hiresDomId = utilUniqueDomId('streetside-hires');
 
            // Add hires checkbox
-           let label = line1
+           var label = line1
              .append('label')
              .attr('for', hiresDomId)
              .attr('class', 'streetside-hires');
              .attr('type', 'checkbox')
              .attr('id', hiresDomId)
              .property('checked', _hires)
-             .on('click', () => {
+             .on('click', function () {
                event.stopPropagation();
 
                _hires = !_hires;
                _resolution = _hires ? 1024 : 512;
                wrap.call(setupCanvas, true);
 
-               let viewstate = {
+               var viewstate = {
                  yaw: _pannellumViewer.getYaw(),
                  pitch: _pannellumViewer.getPitch(),
                  hfov: _pannellumViewer.getHfov()
                };
 
                that.selectImage(context, d)
-                 .then(response => {
+                 .then(function (response) {
                    if (response.status === 'ok') {
                      _sceneOptions = Object.assign(_sceneOptions, viewstate);
                      that.showViewer(context);
              .text(_t('streetside.hires'));
 
 
-           let captureInfo = line1
+           var captureInfo = line1
              .append('div')
              .attr('class', 'attribution-capture-info');
 
            // Add capture date
            if (d.captured_by) {
-             const yyyy = (new Date()).getFullYear();
+             var yyyy = (new Date()).getFullYear();
 
              captureInfo
                .append('a')
            }
 
            // Add image links
-           let line2 = attribution
+           var line2 = attribution
              .append('div')
              .attr('class', 'attribution-row');
 
              .text(_t('streetside.report'));
 
 
-           let bubbleIdQuadKey = d.key.toString(4);
-           const paddingNeeded = 16 - bubbleIdQuadKey.length;
-           for (let i = 0; i < paddingNeeded; i++) {
+           var bubbleIdQuadKey = d.key.toString(4);
+           var paddingNeeded = 16 - bubbleIdQuadKey.length;
+           for (var i = 0; i < paddingNeeded; i++) {
              bubbleIdQuadKey = '0' + bubbleIdQuadKey;
            }
-           const imgUrlPrefix = streetsideImagesApi + 'hs' + bubbleIdQuadKey;
-           const imgUrlSuffix = '.jpg?g=6338&n=z';
+           var imgUrlPrefix = streetsideImagesApi + 'hs' + bubbleIdQuadKey;
+           var imgUrlSuffix = '.jpg?g=6338&n=z';
 
            // Cubemap face code order matters here: front=01, right=02, back=03, left=10, up=11, down=12
-           const faceKeys = ['01','02','03','10','11','12'];
+           var faceKeys = ['01','02','03','10','11','12'];
 
            // Map images to cube faces
-           let quadKeys = getQuadKeys();
-           let faces = faceKeys.map((faceKey) => {
-             return quadKeys.map((quadKey) =>{
-               const xy = qkToXY(quadKey);
+           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,
            });
 
            return loadFaces(faces)
-             .then(() => {
+             .then(function () {
                _sceneOptions = {
                  showFullscreenCtrl: false,
                  autoLoad: true,
                .classed('currentView', false);
            }
 
-           let hoveredBubbleKey = hovered && hovered.key;
-           let hoveredSequenceKey = this.getSequenceKeyForBubble(hovered);
-           let hoveredSequence = hoveredSequenceKey && _ssCache.sequences[hoveredSequenceKey];
-           let hoveredBubbleKeys =  (hoveredSequence && hoveredSequence.bubbles.map(d => d.key)) || [];
+           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; })) || [];
 
-           let viewer = context.container().select('.photoviewer');
-           let selected = viewer.empty() ? undefined : viewer.datum();
-           let selectedBubbleKey = selected && selected.key;
-           let selectedSequenceKey = this.getSequenceKeyForBubble(selected);
-           let selectedSequence = selectedSequenceKey && _ssCache.sequences[selectedSequenceKey];
-           let selectedBubbleKeys = (selectedSequence && selectedSequence.bubbles.map(d => d.key)) || [];
+           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
-           let highlightedBubbleKeys = utilArrayUnion(hoveredBubbleKeys, selectedBubbleKeys);
+           var highlightedBubbleKeys = utilArrayUnion(hoveredBubbleKeys, selectedBubbleKeys);
 
            context.container().selectAll('.layer-streetside-images .viewfield-group')
-             .classed('highlighted', d => highlightedBubbleKeys.indexOf(d.key) !== -1)
-             .classed('hovered',     d => d.key === hoveredBubbleKey)
-             .classed('currentView', d => d.key === selectedBubbleKey);
+             .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; });
 
            context.container().selectAll('.layer-streetside-images .sequence')
-             .classed('highlighted', d => d.properties.key === hoveredSequenceKey)
-             .classed('currentView', d => d.properties.key === selectedSequenceKey);
+             .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() {
-             let d = this.parentNode.__data__;
+             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 {
 
        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
+               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;
            };
        }
 
        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
+               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;
            };
        }
        var debouncedRequest$1 = debounce(request$1, 300, { leading: false });
 
        function request$1(url, params, exactMatch, callback, loaded) {
-           if (_inflight$2[url]) return;
+           if (_inflight$2[url]) { return; }
 
-           if (checkCache(url, params, exactMatch, callback)) return;
+           if (checkCache(url, params, exactMatch, callback)) { return; }
 
            var controller = new AbortController();
            _inflight$2[url] = controller;
            d3_json(url, { signal: controller.signal })
                .then(function(result) {
                    delete _inflight$2[url];
-                   if (loaded) loaded(null, result);
+                   if (loaded) { loaded(null, result); }
                })
                .catch(function(err) {
                    delete _inflight$2[url];
-                   if (err.name === 'AbortError') return;
-                   if (loaded) loaded(err.message);
+                   if (err.name === 'AbortError') { return; }
+                   if (loaded) { loaded(err.message); }
                });
        }
 
                }
 
                // don't try to shorten the query
-               if (exactMatch || !testQuery.length) return false;
+               if (exactMatch || !testQuery.length) { return false; }
 
                // do shorten the query to see if we already have a cached result
                // that has returned fewer than max results (rp)
                    lang: _mainLocalizer.languageCode()
                };
                this.keys(params, function(err, data) {
-                   if (err) return;
+                   if (err) { return; }
                    data.forEach(function(d) {
-                       if (d.value === 'opening_hours') return;  // exception
+                       if (d.value === 'opening_hours') { return; }  // exception
                        _popularKeys[d.value] = true;
                    });
                });
 
 
            apibase: function(_) {
-               if (!arguments.length) return apibase$4;
+               if (!arguments.length) { return apibase$4; }
                apibase$4 = _;
                return this;
            }
                part = [],
                i, a, b, codeB, lastCode;
 
-           if (!result) result = [];
+           if (!result) { result = []; }
 
            for (i = 1; i < len; i++) {
                a = points[i - 1];
                codeA = lastCode;
            }
 
-           if (part.length) result.push(part);
+           if (part.length) { result.push(part); }
 
            return result;
        }
                    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));
+                   if (inside !== prevInside) { result.push(intersect(prev, p, edge, bbox)); }
 
-                   if (inside) result.push(p); // add a point if it's inside
+                   if (inside) { result.push(p); } // add a point if it's inside
 
                    prev = p;
                    prevInside = inside;
 
                points = result;
 
-               if (!points.length) break;
+               if (!points.length) { break; }
            }
 
            return result;
        function bitCode(p, bbox) {
            var code = 0;
 
-           if (p[0] < bbox[0]) code |= 1; // left
-           else if (p[0] > bbox[2]) code |= 2; // right
+           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
+           if (p[1] < bbox[1]) { code |= 4; } // bottom
+           else if (p[1] > bbox[3]) { code |= 8; } // top
 
            return code;
        }
 
        var bboxClip_1 = createCommonjsModule(function (module, exports) {
        var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) {
-           if (mod && mod.__esModule) return 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];
+           if (mod != null) { for (var k in mod) { if (Object.hasOwnProperty.call(mod, k)) { result[k] = mod[k]; } } }
            result["default"] = mod;
            return result;
        };
        });
 
        var fastJsonStableStringify = function (data, opts) {
-           if (!opts) opts = {};
-           if (typeof opts === 'function') opts = { cmp: 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) {
                    node = node.toJSON();
                }
 
-               if (node === undefined) return;
-               if (typeof node == 'number') return isFinite(node) ? '' + node : 'null';
-               if (typeof node !== 'object') return JSON.stringify(node);
+               if (node === undefined) { return; }
+               if (typeof node == 'number') { return isFinite(node) ? '' + node : 'null'; }
+               if (typeof node !== 'object') { return JSON.stringify(node); }
 
                var i, out;
                if (Array.isArray(node)) {
                    out = '[';
                    for (i = 0; i < node.length; i++) {
-                       if (i) out += ',';
+                       if (i) { out += ','; }
                        out += stringify(node[i]) || 'null';
                    }
                    return out + ']';
                }
 
-               if (node === null) return 'null';
+               if (node === null) { return 'null'; }
 
                if (seen.indexOf(node) !== -1) {
-                   if (cycles) return JSON.stringify('__cycle__');
+                   if (cycles) { return JSON.stringify('__cycle__'); }
                    throw new TypeError('Converting circular structure to JSON');
                }
 
                    var key = keys[i];
                    var value = stringify(node[key]);
 
-                   if (!value) continue;
-                   if (out) out += ',';
+                   if (!value) { continue; }
+                   if (out) { out += ','; }
                    out += JSON.stringify(key) + ':' + value;
                }
                seen.splice(seenIndex, 1);
 
        function DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }
 
-       class SplayTree {
+       var SplayTree = function SplayTree(compare, noDuplicates) {
+         if ( compare === void 0 ) compare = DEFAULT_COMPARE;
+         if ( noDuplicates === void 0 ) noDuplicates = false;
 
-         constructor(compare = DEFAULT_COMPARE, noDuplicates = false) {
-           this._compare = compare;
-           this._root = null;
-           this._size = 0;
-           this._noDuplicates = !!noDuplicates;
-         }
+         this._compare = compare;
+         this._root = null;
+         this._size = 0;
+         this._noDuplicates = !!noDuplicates;
+       };
 
+       var prototypeAccessors = { size: { configurable: true } };
 
-         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;
+       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;
+       };
 
-         rotateRight(x) {
-           var y = x.left;
-           if (y) {
-             x.left = y.right;
-             if (y.right) y.right.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.right = x;
-           x.parent = y;
+       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;
          }
 
+         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;
+       };
 
-         _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);
-             }
+
+       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);
            }
          }
+       };
 
 
-         splay(x) {
-           var p, gp, ggp, l, r;
+       SplayTree.prototype.splay = function splay (x) {
+         var p, gp, ggp, l, r;
 
-           while (x.parent) {
-             p = x.parent;
-             gp = p.parent;
+         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;
-             }
+           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;
+           }
 
-             l = x.left; r = x.right;
+           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;
+           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; }
 
-                   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;
-                 }
-               }
-               if (l) {
-                 p.right = l;
-                 l.parent = p;
-               } else p.right = null;
+                 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.left   = p;
-               p.parent = x;
+                 x.right = gp;
+                 gp.parent = x;
+               }
              }
+             if (l) {
+               p.right = l;
+               l.parent = p;
+             } else { p.right = null; }
+
+             x.left = p;
+             p.parent = x;
            }
          }
+       };
 
 
-         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;
-         }
+       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; }
+       };
 
 
-         minNode(u = this._root) {
-           if (u) while (u.left) u = u.left;
-           return u;
-         }
+       SplayTree.prototype.minNode = function minNode (u) {
+           if ( u === void 0 ) u = this._root;
 
+         if (u) { while (u.left) { u = u.left; } }
+         return u;
+       };
 
-         maxNode(u = this._root) {
-           if (u) while (u.right) u = u.right;
-           return u;
-         }
 
+       SplayTree.prototype.maxNode = function maxNode (u) {
+           if ( u === void 0 ) u = this._root;
 
-         insert(key, data) {
-           var z = this._root;
-           var p = null;
-           var comp = this._compare;
-           var cmp;
+         if (u) { while (u.right) { u = u.right; } }
+         return u;
+       };
 
-           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;
-             }
+
+       SplayTree.prototype.insert = function insert (key, data) {
+         var z = this._root;
+         var p = null;
+         var comp = this._compare;
+         var cmp;
+
+         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; }
+           }
+         }
 
-           z = { key, data, left: null, right: null, parent: p };
+         z = { key: key, data: data, left: null, right: null, parent: p };
 
-           if (!p)                          this._root = z;
-           else if (comp(p.key, z.key) < 0) p.right = z;
-           else                             p.left  = z;
+         if (!p)                        { this._root = z; }
+         else if (comp(p.key, z.key) < 0) { p.right = z; }
+         else                           { p.left= z; }
 
-           this.splay(z);
-           this._size++;
-           return z;
-         }
+         this.splay(z);
+         this._size++;
+         return z;
+       };
 
 
-         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;
+       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;
+       };
 
-         /**
-          * Whether the tree contains a node with the given key
-          * @param  {Key} key
-          * @return {boolean} true/false
-          */
-         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;
+       /**
+        * 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;
+       };
 
-         remove (key) {
-           var z = this.find(key);
 
-           if (!z) return false;
+       SplayTree.prototype.remove = function remove (key) {
+         var z = this.find(key);
 
-           this.splay(z);
+         if (!z) { return false; }
 
-           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.splay(z);
 
-           this._size--;
-           return true;
+         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;
+       };
 
-         removeNode(z) {
-           if (!z) return false;
 
-           this.splay(z);
+       SplayTree.prototype.removeNode = function removeNode (z) {
+         if (!z) { return false; }
 
-           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.splay(z);
 
-           this._size--;
-           return true;
+         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;
+       };
 
-         erase (key) {
-           var z = this.find(key);
-           if (!z) return;
 
-           this.splay(z);
+       SplayTree.prototype.erase = function erase (key) {
+         var z = this.find(key);
+         if (!z) { return; }
 
-           var s = z.left;
-           var t = z.right;
+         this.splay(z);
 
-           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;
-           }
+         var s = z.left;
+         var t = z.right;
 
-           this._size--;
+         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;
          }
 
-         /**
-          * Removes and returns the node with smallest key
-          * @return {?Node}
-          */
-         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;
+         this._size--;
+       };
+
+       /**
+        * 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;
+       };
 
 
-         /* eslint-disable class-methods-use-this */
+       /* eslint-disable class-methods-use-this */
 
-         /**
-          * Successor node
-          * @param  {Node} node
-          * @return {?Node}
-          */
-         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;
-               }
+       /**
+        * 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;
              }
            }
-           return successor;
          }
+         return successor;
+       };
 
 
-         /**
-          * Predecessor node
-          * @param  {Node} node
-          * @return {?Node}
-          */
-         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;
-               }
+       /**
+        * 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;
              }
            }
-           return predecessor;
          }
-         /* eslint-enable class-methods-use-this */
+         return predecessor;
+       };
+       /* eslint-enable class-methods-use-this */
 
 
-         /**
-          * @param  {forEachCallback} callback
-          * @return {SplayTree}
-          */
-         forEach(callback) {
-           var current = this._root;
-           var s = [], done = false, i = 0;
-
-           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;
-             }
+       /**
+        * @param{forEachCallback} callback
+        * @return {SplayTree}
+        */
+       SplayTree.prototype.forEach = function forEach (callback) {
+         var current = this._root;
+         var s = [], done = false, i = 0;
+
+         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;
          }
+         return this;
+       };
 
 
-         /**
-          * 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}
-          */
-         range(low, high, fn, ctx) {
-           const Q = [];
-           const compare = this._compare;
-           let 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
-               }
-               node = node.right;
+       /**
+        * 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
              }
+             node = node.right;
            }
-           return this;
          }
+         return this;
+       };
 
-         /**
-          * Returns all keys in order
-          * @return {Array<Key>}
-          */
-         keys () {
-           var current = this._root;
-           var s = [], r = [], done = false;
-
-           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;
-             }
+       /**
+        * Returns all keys in order
+        * @return {Array<Key>}
+        */
+       SplayTree.prototype.keys = function keys () {
+         var current = this._root;
+         var s = [], r = [], done = false;
+
+         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;
          }
+         return r;
+       };
 
 
-         /**
-          * Returns `data` fields of all nodes in order.
-          * @return {Array<Value>}
-          */
-         values () {
-           var current = this._root;
-           var s = [], r = [], done = false;
-
-           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;
-             }
+       /**
+        * Returns `data` fields of all nodes in order.
+        * @return {Array<Value>}
+        */
+       SplayTree.prototype.values = function values () {
+         var current = this._root;
+         var s = [], r = [], done = false;
+
+         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;
          }
+         return r;
+       };
 
 
-         /**
-          * Returns node at given index
-          * @param  {number} index
-          * @return {?Node}
-          */
-         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;
-
-           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;
-             }
+       /**
+        * 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;
+
+         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;
          }
+         return null;
+       };
 
-         /**
-          * Bulk-load items. Both array have to be same size
-          * @param  {Array<Key>}    keys
-          * @param  {Array<Value>}  [values]
-          * @param  {Boolean}       [presort=false] Pre-sort keys and values, using
-          *                                         tree's comparator. Sorting is done
-          *                                         in-place
-          * @return {AVLTree}
-          */
-         load(keys = [], values = [], presort = false) {
-           if (this._size !== 0) throw new Error('bulk-load: tree is not empty');
-           const 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;
-         }
+       /**
+        * Bulk-load items. Both array have to be same size
+        * @param{Array<Key>}  keys
+        * @param{Array<Value>}[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;
+       };
 
 
-         min() {
-           var node = this.minNode(this._root);
-           if (node) return node.key;
-           else      return null;
-         }
+       SplayTree.prototype.min = function min () {
+         var node = this.minNode(this._root);
+         if (node) { return node.key; }
+         else    { return null; }
+       };
 
 
-         max() {
-           var node = this.maxNode(this._root);
-           if (node) return node.key;
-           else      return null;
-         }
+       SplayTree.prototype.max = function max () {
+         var node = this.maxNode(this._root);
+         if (node) { return node.key; }
+         else    { return null; }
+       };
 
-         isEmpty() { return this._root === null; }
-         get size() { return this._size; }
+       SplayTree.prototype.isEmpty = function isEmpty () { return this._root === null; };
+       prototypeAccessors.size.get = function () { return this._size; };
 
 
-         /**
-          * Create a tree and load it with items
-          * @param  {Array<Key>}          keys
-          * @param  {Array<Value>?}        [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}
-          */
-         static createTree(keys, values, comparator, presort, noDuplicates) {
-           return new SplayTree(comparator, noDuplicates).load(keys, values, presort);
-         }
-       }
+       /**
+        * Create a tree and load it with items
+        * @param{Array<Key>}        keys
+        * @param{Array<Value>?}      [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);
+       };
+
+       Object.defineProperties( SplayTree.prototype, prototypeAccessors );
 
 
        function loadRecursive (parent, keys, values, start, end) {
-         const size = end - start;
+         var size = end - start;
          if (size > 0) {
-           const middle = start + Math.floor(size / 2);
-           const key    = keys[middle];
-           const data   = values[middle];
-           const node   = { key, data, parent };
+           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;
 
 
        function sort(keys, values, left, right, compare) {
-         if (left >= right) return;
+         if (left >= right) { return; }
 
-         const pivot = keys[(left + right) >> 1];
-         let i = left - 1;
-         let j = right + 1;
+         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;
+           do { i++; } while (compare(keys[i], pivot) < 0);
+           do { j--; } while (compare(keys[j], pivot) > 0);
+           if (i >= j) { break; }
 
-           let tmp = keys[i];
+           var tmp = keys[i];
            keys[i] = keys[j];
            keys[j] = tmp;
 
          sort(keys, values, j + 1, right, compare);
        }
 
-       const NORMAL               = 0;
-       const NON_CONTRIBUTING     = 1;
-       const SAME_TRANSITION      = 2;
-       const DIFFERENT_TRANSITION = 3;
+       var NORMAL               = 0;
+       var NON_CONTRIBUTING     = 1;
+       var SAME_TRANSITION      = 2;
+       var DIFFERENT_TRANSITION = 3;
 
-       const INTERSECTION = 0;
-       const UNION        = 1;
-       const DIFFERENCE   = 2;
-       const XOR          = 3;
+       var INTERSECTION = 0;
+       var UNION        = 1;
+       var DIFFERENCE   = 2;
+       var XOR          = 3;
 
        /**
         * @param  {SweepEvent} event
          }
 
          // check if the line segment belongs to the Boolean operation
-         let isInResult = inResult(event, operation);
+         var isInResult = inResult(event, operation);
          if (isInResult) {
            event.resultTransition = determineResultTransition(event, operation);
          } else {
 
 
        function determineResultTransition(event, operation) {
-         let thisIn = !event.inOut;
-         let thatIn = !event.otherInOut;
+         var thisIn = !event.inOut;
+         var thatIn = !event.otherInOut;
 
-         let isIn;
+         var isIn;
          switch (operation) {
            case INTERSECTION:
              isIn = thisIn && thatIn; break;
          return isIn ? +1 : -1;
        }
 
-       class SweepEvent {
+       var SweepEvent = function SweepEvent (point, left, otherEvent, isSubject, edgeType) {
 
+         /**
+          * Is left endpoint?
+          * @type {Boolean}
+          */
+         this.left = left;
 
          /**
-          * Sweepline event
-          *
-          * @class {SweepEvent}
-          * @param {Array.<Number>}  point
-          * @param {Boolean}         left
-          * @param {SweepEvent=}     otherEvent
-          * @param {Boolean}         isSubject
-          * @param {Number}          edgeType
+          * @type {Array.<Number>}
           */
-         constructor (point, left, otherEvent, isSubject, edgeType) {
+         this.point = point;
 
-           /**
-            * Is left endpoint?
-            * @type {Boolean}
-            */
-           this.left = left;
+         /**
+          * Other edge reference
+          * @type {SweepEvent}
+          */
+         this.otherEvent = otherEvent;
 
-           /**
-            * @type {Array.<Number>}
-            */
-           this.point = point;
+         /**
+          * Belongs to source or clipping polygon
+          * @type {Boolean}
+          */
+         this.isSubject = isSubject;
 
-           /**
-            * Other edge reference
-            * @type {SweepEvent}
-            */
-           this.otherEvent = otherEvent;
+         /**
+          * Edge contribution type
+          * @type {Number}
+          */
+         this.type = edgeType || NORMAL;
 
-           /**
-            * Belongs to source or clipping polygon
-            * @type {Boolean}
-            */
-           this.isSubject = isSubject;
 
-           /**
-            * Edge contribution type
-            * @type {Number}
-            */
-           this.type = edgeType || NORMAL;
+         /**
+          * In-out transition for the sweepline crossing polygon
+          * @type {Boolean}
+          */
+         this.inOut = false;
 
 
-           /**
-            * In-out transition for the sweepline crossing polygon
-            * @type {Boolean}
-            */
-           this.inOut = false;
+         /**
+          * @type {Boolean}
+          */
+         this.otherInOut = false;
 
+         /**
+          * Previous event in result?
+          * @type {SweepEvent}
+          */
+         this.prevInResult = null;
 
-           /**
-            * @type {Boolean}
-            */
-           this.otherInOut = false;
+         /**
+          * Type of result transition (0 = not in result, +1 = out-in, -1, in-out)
+          * @type {Number}
+          */
+         this.resultTransition = 0;
 
-           /**
-            * Previous event in result?
-            * @type {SweepEvent}
-            */
-           this.prevInResult = null;
+         // connection step
 
-           /**
-            * Type of result transition (0 = not in result, +1 = out-in, -1, in-out)
-            * @type {Number}
-            */
-           this.resultTransition = 0;
+         /**
+          * @type {Number}
+          */
+         this.otherPos = -1;
 
-           // connection step
+         /**
+          * @type {Number}
+          */
+         this.outputContourId = -1;
 
-           /**
-            * @type {Number}
-            */
-           this.otherPos = -1;
+         this.isExteriorRing = true; // TODO: Looks unused, remove?
+       };
 
-           /**
-            * @type {Number}
-            */
-           this.outputContourId = -1;
+       var prototypeAccessors$1 = { inResult: { configurable: true } };
 
-           this.isExteriorRing = true;   // TODO: Looks unused, remove?
-         }
 
+       /**
+        * @param{Array.<Number>}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;
+       };
 
-         /**
-          * @param  {Array.<Number>}  p
-          * @return {Boolean}
-          */
-         isBelow (p) {
-           const 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;
-         }
 
+       /**
+        * @param{Array.<Number>}p
+        * @return {Boolean}
+        */
+       SweepEvent.prototype.isAbove = function isAbove (p) {
+         return !this.isBelow(p);
+       };
 
-         /**
-          * @param  {Array.<Number>}  p
-          * @return {Boolean}
-          */
-         isAbove (p) {
-           return !this.isBelow(p);
-         }
 
+       /**
+        * @return {Boolean}
+        */
+       SweepEvent.prototype.isVertical = function isVertical () {
+         return this.point[0] === this.otherEvent.point[0];
+       };
 
-         /**
-          * @return {Boolean}
-          */
-         isVertical () {
-           return this.point[0] === this.otherEvent.point[0];
-         }
 
+       /**
+        * Does event belong to result?
+        * @return {Boolean}
+        */
+       prototypeAccessors$1.inResult.get = function () {
+         return this.resultTransition !== 0;
+       };
 
-         /**
-          * Does event belong to result?
-          * @return {Boolean}
-          */
-         get inResult() {
-           return this.resultTransition !== 0;
-         }
 
+       SweepEvent.prototype.clone = function clone () {
+         var copy = new SweepEvent(
+           this.point, this.left, this.otherEvent, this.isSubject, this.type);
 
-         clone () {
-           const copy = new SweepEvent(
-             this.point, this.left, this.otherEvent, this.isSubject, this.type);
+         copy.contourId      = this.contourId;
+         copy.resultTransition = this.resultTransition;
+         copy.prevInResult   = this.prevInResult;
+         copy.isExteriorRing = this.isExteriorRing;
+         copy.inOut          = this.inOut;
+         copy.otherInOut     = this.otherInOut;
 
-           copy.contourId        = this.contourId;
-           copy.resultTransition = this.resultTransition;
-           copy.prevInResult     = this.prevInResult;
-           copy.isExteriorRing   = this.isExteriorRing;
-           copy.inOut            = this.inOut;
-           copy.otherInOut       = this.otherInOut;
+         return copy;
+       };
 
-           return copy;
-         }
-       }
+       Object.defineProperties( SweepEvent.prototype, prototypeAccessors$1 );
 
        function equals(p1, p2) {
          if (p1[0] === p2[0]) {
        //   return abs(p1[0] - p2[0]) <= EPSILON && abs(p1[1] - p2[1]) <= EPSILON;
        // };
 
-       const epsilon$1 = 1.1102230246251565e-16;
-       const splitter = 134217729;
-       const resulterrbound = (3 + 8 * epsilon$1) * epsilon$1;
+       var epsilon$1 = 1.1102230246251565e-16;
+       var splitter = 134217729;
+       var resulterrbound = (3 + 8 * epsilon$1) * epsilon$1;
 
        // fast_expansion_sum_zeroelim routine from oritinal code
        function sum$1(elen, e, flen, f, h) {
-           let Q, Qnew, hh, bvirt;
-           let enow = e[0];
-           let fnow = f[0];
-           let eindex = 0;
-           let findex = 0;
+           var Q, Qnew, hh, bvirt;
+           var enow = e[0];
+           var fnow = f[0];
+           var eindex = 0;
+           var findex = 0;
            if ((fnow > enow) === (fnow > -enow)) {
                Q = enow;
                enow = e[++eindex];
                Q = fnow;
                fnow = f[++findex];
            }
-           let hindex = 0;
+           var hindex = 0;
            if (eindex < elen && findex < flen) {
                if ((fnow > enow) === (fnow > -enow)) {
                    Qnew = enow + Q;
        }
 
        function estimate(elen, e) {
-           let Q = e[0];
-           for (let i = 1; i < elen; i++) Q += e[i];
+           var Q = e[0];
+           for (var i = 1; i < elen; i++) { Q += e[i]; }
            return Q;
        }
 
            return new Float64Array(n);
        }
 
-       const ccwerrboundA = (3 + 16 * epsilon$1) * epsilon$1;
-       const ccwerrboundB = (2 + 12 * epsilon$1) * epsilon$1;
-       const ccwerrboundC = (9 + 64 * epsilon$1) * epsilon$1 * epsilon$1;
+       var ccwerrboundA = (3 + 16 * epsilon$1) * epsilon$1;
+       var ccwerrboundB = (2 + 12 * epsilon$1) * epsilon$1;
+       var ccwerrboundC = (9 + 64 * epsilon$1) * epsilon$1 * epsilon$1;
 
-       const B = vec(4);
-       const C1 = vec(8);
-       const C2 = vec(12);
-       const D = vec(16);
-       const u = vec(4);
+       var B = vec(4);
+       var C1 = vec(8);
+       var C2 = vec(12);
+       var D = vec(16);
+       var u = vec(4);
 
        function orient2dadapt(ax, ay, bx, by, cx, cy, detsum) {
-           let acxtail, acytail, bcxtail, bcytail;
-           let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;
+           var acxtail, acytail, bcxtail, bcytail;
+           var bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;
 
-           const acx = ax - cx;
-           const bcx = bx - cx;
-           const acy = ay - cy;
-           const bcy = by - cy;
+           var acx = ax - cx;
+           var bcx = bx - cx;
+           var acy = ay - cy;
+           var bcy = by - cy;
 
            s1 = acx * bcy;
            c = splitter * acx;
            B[2] = _j - (u3 - bvirt) + (_i - bvirt);
            B[3] = u3;
 
-           let det = estimate(4, B);
-           let errbound = ccwerrboundB * detsum;
+           var det = estimate(4, B);
+           var errbound = ccwerrboundB * detsum;
            if (det >= errbound || -det >= errbound) {
                return det;
            }
 
            errbound = ccwerrboundC * detsum + resulterrbound * Math.abs(det);
            det += (acx * bcytail + bcy * acxtail) - (acy * bcxtail + bcx * acytail);
-           if (det >= errbound || -det >= errbound) return det;
+           if (det >= errbound || -det >= errbound) { return det; }
 
            s1 = acxtail * bcy;
            c = splitter * acxtail;
            bvirt = u3 - _j;
            u[2] = _j - (u3 - bvirt) + (_i - bvirt);
            u[3] = u3;
-           const C1len = sum$1(4, B, 4, u, C1);
+           var C1len = sum$1(4, B, 4, u, C1);
 
            s1 = acx * bcytail;
            c = splitter * acx;
            bvirt = u3 - _j;
            u[2] = _j - (u3 - bvirt) + (_i - bvirt);
            u[3] = u3;
-           const C2len = sum$1(C1len, C1, 4, u, C2);
+           var C2len = sum$1(C1len, C1, 4, u, C2);
 
            s1 = acxtail * bcytail;
            c = splitter * acxtail;
            bvirt = u3 - _j;
            u[2] = _j - (u3 - bvirt) + (_i - bvirt);
            u[3] = u3;
-           const Dlen = sum$1(C2len, C2, 4, u, D);
+           var Dlen = sum$1(C2len, C2, 4, u, D);
 
            return D[Dlen - 1];
        }
 
        function orient2d(ax, ay, bx, by, cx, cy) {
-           const detleft = (ay - cy) * (bx - cx);
-           const detright = (ax - cx) * (by - cy);
-           const det = detleft - detright;
+           var detleft = (ay - cy) * (bx - cx);
+           var detright = (ax - cx) * (by - cy);
+           var det = detleft - detright;
 
-           if (detleft === 0 || detright === 0 || (detleft > 0) !== (detright > 0)) return det;
+           if (detleft === 0 || detright === 0 || (detleft > 0) !== (detright > 0)) { return det; }
 
-           const detsum = Math.abs(detleft + detright);
-           if (Math.abs(det) >= ccwerrboundA * detsum) return det;
+           var detsum = Math.abs(detleft + detright);
+           if (Math.abs(det) >= ccwerrboundA * detsum) { return det; }
 
            return -orient2dadapt(ax, ay, bx, by, cx, cy, detsum);
        }
         * @return {Number}
         */
        function signedArea(p0, p1, p2) {
-         const res = orient2d(p0[0], p0[1], p1[0], p1[1], p2[0], p2[1]);
-         if (res > 0) return -1;
-         if (res < 0) return 1;
+         var res = orient2d(p0[0], p0[1], p1[0], p1[1], p2[0], p2[1]);
+         if (res > 0) { return -1; }
+         if (res < 0) { return 1; }
          return 0;
        }
 
         * @return {Number}
         */
        function compareEvents(e1, e2) {
-         const p1 = e1.point;
-         const p2 = e2.point;
+         var p1 = e1.point;
+         var p2 = e2.point;
 
          // Different x-coordinate
-         if (p1[0] > p2[0]) return 1;
-         if (p1[0] < p2[0]) return -1;
+         if (p1[0] > p2[0]) { return 1; }
+         if (p1[0] < p2[0]) { return -1; }
 
          // Different points, but same x-coordinate
          // Event with lower y-coordinate is processed first
-         if (p1[1] !== p2[1]) return p1[1] > p2[1] ? 1 : -1;
+         if (p1[1] !== p2[1]) { return p1[1] > p2[1] ? 1 : -1; }
 
          return specialCases(e1, e2, p1);
        }
          // Same coordinates, but one is a left endpoint and the other is
          // a right endpoint. The right endpoint is processed first
          if (e1.left !== e2.left)
-           return e1.left ? 1 : -1;
+           { return e1.left ? 1 : -1; }
 
          // const p2 = e1.otherEvent.point, p3 = e2.otherEvent.point;
          // const sa = (p1[0] - p3[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p3[1])
         * @return {Queue}
         */
        function divideSegment(se, p, queue)  {
-         const r = new SweepEvent(p, false, se,            se.isSubject);
-         const l = new SweepEvent(p, true,  se.otherEvent, se.isSubject);
+         var r = new SweepEvent(p, false, se,            se.isSubject);
+         var l = new SweepEvent(p, true,  se.otherEvent, se.isSubject);
 
          /* eslint-disable no-console */
          if (equals(se.point, se.otherEvent.point)) {
          // vector, then, could be thought of as the distance (in x and y components)
          // from the first point to the second point.
          // So first, let's make our vectors:
-         const va = [a2[0] - a1[0], a2[1] - a1[1]];
-         const vb = [b2[0] - b1[0], b2[1] - b1[1]];
+         var va = [a2[0] - a1[0], a2[1] - a1[1]];
+         var vb = [b2[0] - b1[0], b2[1] - b1[1]];
          // We also define a function to convert back to regular point form:
 
          /* eslint-disable arrow-body-style */
          /* eslint-enable arrow-body-style */
 
          // The rest is pretty much a straight port of the algorithm.
-         const e = [b1[0] - a1[0], b1[1] - a1[1]];
-         let kross    = crossProduct(va, vb);
-         let sqrKross = kross * kross;
-         const sqrLenA  = dotProduct(va, va);
+         var e = [b1[0] - a1[0], b1[1] - a1[1]];
+         var kross    = crossProduct(va, vb);
+         var sqrKross = kross * kross;
+         var sqrLenA  = dotProduct(va, va);
          //const sqrLenB  = dotProduct(vb, vb);
 
          // Check for line intersection. This works because of the properties of the
            // If they're not parallel, then (because these are line segments) they
            // still might not actually intersect. This code checks that the
            // intersection point of the lines is actually on both line segments.
-           const s = crossProduct(e, vb) / kross;
+           var s = crossProduct(e, vb) / kross;
            if (s < 0 || s > 1) {
              // not on line segment a
              return null;
            }
-           const t = crossProduct(e, va) / kross;
+           var t = crossProduct(e, va) / kross;
            if (t < 0 || t > 1) {
              // not on line segment b
              return null;
            return null;
          }
 
-         const sa = dotProduct(va, e) / sqrLenA;
-         const sb = sa + dotProduct(va, vb) / sqrLenA;
-         const smin = Math.min(sa, sb);
-         const smax = Math.max(sa, sb);
+         var sa = dotProduct(va, e) / sqrLenA;
+         var sb = sa + dotProduct(va, vb) / sqrLenA;
+         var smin = Math.min(sa, sb);
+         var smax = Math.max(sa, sb);
 
          // this is, essentially, the FindIntersection acting on floats from
          // Schneider & Eberly, just inlined into this function.
              return noEndpointTouch ? null : [toPoint(a1, smax < 1 ? smax : 1, va)];
            }
 
-           if (noEndpointTouch && smin === 0 && smax === 1) return null;
+           if (noEndpointTouch && smin === 0 && smax === 1) { return null; }
 
            // There's overlap on a segment -- two points of intersection. Return both.
            return [
          // did cost us half a day, so I'll leave it
          // out of respect
          // if (se1.isSubject === se2.isSubject) return;
-         const inter = intersection(
+         var inter = intersection(
            se1.point, se1.otherEvent.point,
            se2.point, se2.otherEvent.point
          );
 
-         const nintersections = inter ? inter.length : 0;
-         if (nintersections === 0) return 0; // no intersection
+         var nintersections = inter ? inter.length : 0;
+         if (nintersections === 0) { return 0; } // no intersection
 
          // the line segments intersect at an endpoint of both line segments
          if ((nintersections === 1) &&
          }
 
          // The line segments associated to se1 and se2 overlap
-         const events        = [];
-         let leftCoincide  = false;
-         let rightCoincide = false;
+         var events        = [];
+         var leftCoincide  = false;
+         var rightCoincide = false;
 
          if (equals(se1.point, se2.point)) {
            leftCoincide = true; // linked
         * @return {Number}
         */
        function compareSegments(le1, le2) {
-         if (le1 === le2) return 0;
+         if (le1 === le2) { return 0; }
 
          // Segments are not collinear
          if (signedArea(le1.point, le1.otherEvent.point, le2.point) !== 0 ||
            signedArea(le1.point, le1.otherEvent.point, le2.otherEvent.point) !== 0) {
 
            // If they share their left endpoint use the right endpoint to sort
-           if (equals(le1.point, le2.point)) return le1.isBelow(le2.otherEvent.point) ? -1 : 1;
+           if (equals(le1.point, le2.point)) { return le1.isBelow(le2.otherEvent.point) ? -1 : 1; }
 
            // Different left endpoint: use the left endpoint to sort
-           if (le1.point[0] === le2.point[0]) return le1.point[1] < le2.point[1] ? -1 : 1;
+           if (le1.point[0] === le2.point[0]) { return le1.point[1] < le2.point[1] ? -1 : 1; }
 
            // has the line segment associated to e1 been inserted
            // into S after the line segment associated to e2 ?
-           if (compareEvents(le1, le2) === 1) return le2.isAbove(le1.point) ? -1 : 1;
+           if (compareEvents(le1, le2) === 1) { return le2.isAbove(le1.point) ? -1 : 1; }
 
            // The line segment associated to e2 has been inserted
            // into S after the line segment associated to e1
          }
 
          if (le1.isSubject === le2.isSubject) { // same polygon
-           let p1 = le1.point, p2 = le2.point;
+           var p1 = le1.point, p2 = le2.point;
            if (p1[0] === p2[0] && p1[1] === p2[1]/*equals(le1.point, le2.point)*/) {
              p1 = le1.otherEvent.point; p2 = le2.otherEvent.point;
-             if (p1[0] === p2[0] && p1[1] === p2[1]) return 0;
-             else return le1.contourId > le2.contourId ? 1 : -1;
+             if (p1[0] === p2[0] && p1[1] === p2[1]) { return 0; }
+             else { return le1.contourId > le2.contourId ? 1 : -1; }
            }
          } else { // Segments are collinear, but belong to separate polygons
            return le1.isSubject ? -1 : 1;
        }
 
        function subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation) {
-         const sweepLine = new SplayTree(compareSegments);
-         const sortedEvents = [];
+         var sweepLine = new SplayTree(compareSegments);
+         var sortedEvents = [];
 
-         const rightbound = Math.min(sbbox[2], cbbox[2]);
+         var rightbound = Math.min(sbbox[2], cbbox[2]);
 
-         let prev, next, begin;
+         var prev, next, begin;
 
          while (eventQueue.length !== 0) {
-           let event = eventQueue.pop();
+           var event = eventQueue.pop();
            sortedEvents.push(event);
 
            // optimization by bboxes for intersection and difference goes here
              next  = prev = sweepLine.insert(event);
              begin = sweepLine.minNode();
 
-             if (prev !== begin) prev = sweepLine.prev(prev);
-             else                prev = null;
+             if (prev !== begin) { prev = sweepLine.prev(prev); }
+             else                { prev = null; }
 
              next = sweepLine.next(next);
 
-             const prevEvent = prev ? prev.key : null;
-             let prevprevEvent;
+             var prevEvent = prev ? prev.key : null;
+             var prevprevEvent = (void 0);
              computeFields(event, prevEvent, operation);
              if (next) {
                if (possibleIntersection(event, next.key, eventQueue) === 2) {
 
              if (prev) {
                if (possibleIntersection(prev.key, event, eventQueue) === 2) {
-                 let prevprev = prev;
-                 if (prevprev !== begin) prevprev = sweepLine.prev(prevprev);
-                 else                    prevprev = null;
+                 var prevprev = prev;
+                 if (prevprev !== begin) { prevprev = sweepLine.prev(prevprev); }
+                 else                    { prevprev = null; }
 
                  prevprevEvent = prevprev ? prevprev.key : null;
                  computeFields(prevEvent, prevprevEvent, operation);
 
              if (prev && next) {
 
-               if (prev !== begin) prev = sweepLine.prev(prev);
-               else                prev = null;
+               if (prev !== begin) { prev = sweepLine.prev(prev); }
+               else                { prev = null; }
 
                next = sweepLine.next(next);
                sweepLine.remove(event);
          return sortedEvents;
        }
 
-       class Contour {
-
-         /**
-          * Contour
-          *
-          * @class {Contour}
-          */
-         constructor() {
-           this.points = [];
-           this.holeIds = [];
-           this.holeOf = null;
-           this.depth = null;
-         }
-
-         isExterior() {
-           return this.holeOf == null;
-         }
+       var Contour = function Contour() {
+         this.points = [];
+         this.holeIds = [];
+         this.holeOf = null;
+         this.depth = null;
+       };
 
-       }
+       Contour.prototype.isExterior = function isExterior () {
+         return this.holeOf == null;
+       };
 
        /**
         * @param  {Array.<SweepEvent>} sortedEvents
         * @return {Array.<SweepEvent>}
         */
        function orderEvents(sortedEvents) {
-         let event, i, len, tmp;
-         const resultEvents = [];
+         var event, i, len, tmp;
+         var resultEvents = [];
          for (i = 0, len = sortedEvents.length; i < len; i++) {
            event = sortedEvents[i];
            if ((event.left && event.inResult) ||
            }
          }
          // Due to overlapping edges the resultEvents array can be not wholly sorted
-         let sorted = false;
+         var sorted = false;
          while (!sorted) {
            sorted = true;
            for (i = 0, len = resultEvents.length; i < len; i++) {
         * @return {Number}
         */
        function nextPos(pos, resultEvents, processed, origPos) {
-         let newPos = pos + 1,
+         var newPos = pos + 1,
              p = resultEvents[pos].point,
              p1;
-         const length = resultEvents.length;
+         var length = resultEvents.length;
 
          if (newPos < length)
-           p1 = resultEvents[newPos].point;
+           { p1 = resultEvents[newPos].point; }
 
          while (newPos < length && p1[0] === p[0] && p1[1] === p[1]) {
            if (!processed[newPos]) {
 
 
        function initializeContourFromContext(event, contours, contourId) {
-         const contour = new Contour();
+         var contour = new Contour();
          if (event.prevInResult != null) {
-           const prevInResult = event.prevInResult;
+           var prevInResult = event.prevInResult;
            // Note that it is valid to query the "previous in result" for its output contour id,
            // because we must have already processed it (i.e., assigned an output contour id)
            // in an earlier iteration, otherwise it wouldn't be possible that it is "previous in
            // result".
-           const lowerContourId = prevInResult.outputContourId;
-           const lowerResultTransition = prevInResult.resultTransition;
+           var lowerContourId = prevInResult.outputContourId;
+           var lowerResultTransition = prevInResult.resultTransition;
            if (lowerResultTransition > 0) {
              // We are inside. Now we have to check if the thing below us is another hole or
              // an exterior contour.
-             const lowerContour = contours[lowerContourId];
+             var lowerContour = contours[lowerContourId];
              if (lowerContour.holeOf != null) {
                // The lower contour is a hole => Connect the new contour as a hole to its parent,
                // and use same depth.
-               const parentContourId = lowerContour.holeOf;
+               var parentContourId = lowerContour.holeOf;
                contours[parentContourId].holeIds.push(contourId);
                contour.holeOf = parentContourId;
                contour.depth = contours[lowerContourId].depth;
         * @return {Array.<*>} polygons
         */
        function connectEdges(sortedEvents) {
-         let i, len;
-         const resultEvents = orderEvents(sortedEvents);
+         var i, len;
+         var resultEvents = orderEvents(sortedEvents);
 
          // "false"-filled array
-         const processed = {};
-         const contours = [];
+         var processed = {};
+         var contours = [];
 
-         for (i = 0, len = resultEvents.length; i < len; i++) {
+         var loop = function (  ) {
 
            if (processed[i]) {
-             continue;
+             return;
            }
 
-           const contourId = contours.length;
-           const contour = initializeContourFromContext(resultEvents[i], contours, contourId);
+           var contourId = contours.length;
+           var contour = initializeContourFromContext(resultEvents[i], contours, contourId);
 
            // Helper function that combines marking an event as processed with assigning its output contour ID
-           const markAsProcessed = (pos) => {
+           var markAsProcessed = function (pos) {
              processed[pos] = true;
              resultEvents[pos].outputContourId = contourId;
            };
 
-           let pos = i;
-           let origPos = i;
+           var pos = i;
+           var origPos = i;
 
-           const initial = resultEvents[i].point;
+           var initial = resultEvents[i].point;
            contour.points.push(initial);
 
            /* eslint no-constant-condition: "off" */
            }
 
            contours.push(contour);
-         }
+         };
+
+         for (i = 0, len = resultEvents.length; i < len; i++) loop(  );
 
          return contours;
        }
        var _default$1 = TinyQueue;
 
        function TinyQueue(data, compare) {
-           if (!(this instanceof TinyQueue)) return new TinyQueue(data, compare);
+           if (!(this instanceof TinyQueue)) { return new TinyQueue(data, compare); }
 
            this.data = data || [];
            this.length = this.data.length;
            this.compare = compare || defaultCompare$1;
 
            if (this.length > 0) {
-               for (var i = (this.length >> 1) - 1; i >= 0; i--) this._down(i);
+               for (var i = (this.length >> 1) - 1; i >= 0; i--) { this._down(i); }
            }
        }
 
            },
 
            pop: function () {
-               if (this.length === 0) return undefined;
+               if (this.length === 0) { return undefined; }
 
                var top = this.data[0];
                this.length--;
                while (pos > 0) {
                    var parent = (pos - 1) >> 1;
                    var current = data[parent];
-                   if (compare(item, current) >= 0) break;
+                   if (compare(item, current) >= 0) { break; }
                    data[pos] = current;
                    pos = parent;
                }
                        left = right;
                        best = data[right];
                    }
-                   if (compare(best, item) >= 0) break;
+                   if (compare(best, item) >= 0) { break; }
 
                    data[pos] = best;
                    pos = left;
        };
        tinyqueue.default = _default$1;
 
-       const max$2 = Math.max;
-       const min = Math.min;
+       var max$2 = Math.max;
+       var min = Math.min;
 
-       let contourId = 0;
+       var contourId = 0;
 
 
        function processPolygon(contourOrHole, isSubject, depth, Q, bbox, isExteriorRing) {
-         let i, len, s1, s2, e1, e2;
+         var i, len, s1, s2, e1, e2;
          for (i = 0, len = contourOrHole.length - 1; i < len; i++) {
            s1 = contourOrHole[i];
            s2 = contourOrHole[i + 1];
              e1.left = true;
            }
 
-           const x = s1[0], y = s1[1];
+           var x = s1[0], y = s1[1];
            bbox[0] = min(bbox[0], x);
            bbox[1] = min(bbox[1], y);
            bbox[2] = max$2(bbox[2], x);
 
 
        function fillQueue(subject, clipping, sbbox, cbbox, operation) {
-         const eventQueue = new tinyqueue(null, compareEvents);
-         let polygonSet, isExteriorRing, i, ii, j, jj; //, k, kk;
+         var eventQueue = new tinyqueue(null, compareEvents);
+         var polygonSet, isExteriorRing, i, ii, j, jj; //, k, kk;
 
          for (i = 0, ii = subject.length; i < ii; i++) {
            polygonSet = subject[i];
            for (j = 0, jj = polygonSet.length; j < jj; j++) {
              isExteriorRing = j === 0;
-             if (isExteriorRing) contourId++;
+             if (isExteriorRing) { contourId++; }
              processPolygon(polygonSet[j], true, contourId, eventQueue, sbbox, isExteriorRing);
            }
          }
            polygonSet = clipping[i];
            for (j = 0, jj = polygonSet.length; j < jj; j++) {
              isExteriorRing = j === 0;
-             if (operation === DIFFERENCE) isExteriorRing = false;
-             if (isExteriorRing) contourId++;
+             if (operation === DIFFERENCE) { isExteriorRing = false; }
+             if (isExteriorRing) { contourId++; }
              processPolygon(polygonSet[j], false, contourId, eventQueue, cbbox, isExteriorRing);
            }
          }
          return eventQueue;
        }
 
-       const EMPTY = [];
+       var EMPTY = [];
 
 
        function trivialOperation(subject, clipping, operation) {
-         let result = null;
+         var result = null;
          if (subject.length * clipping.length === 0) {
            if        (operation === INTERSECTION) {
              result = EMPTY;
 
 
        function compareBBoxes(subject, clipping, sbbox, cbbox, operation) {
-         let result = null;
+         var result = null;
          if (sbbox[0] > cbbox[2] ||
              cbbox[0] > sbbox[2] ||
              sbbox[1] > cbbox[3] ||
          if (typeof clipping[0][0][0] === 'number') {
            clipping = [clipping];
          }
-         let trivial = trivialOperation(subject, clipping, operation);
+         var trivial = trivialOperation(subject, clipping, operation);
          if (trivial) {
            return trivial === EMPTY ? null : trivial;
          }
-         const sbbox = [Infinity, Infinity, -Infinity, -Infinity];
-         const cbbox = [Infinity, Infinity, -Infinity, -Infinity];
+         var sbbox = [Infinity, Infinity, -Infinity, -Infinity];
+         var cbbox = [Infinity, Infinity, -Infinity, -Infinity];
 
          // console.time('fill queue');
-         const eventQueue = fillQueue(subject, clipping, sbbox, cbbox, operation);
+         var eventQueue = fillQueue(subject, clipping, sbbox, cbbox, operation);
          //console.timeEnd('fill queue');
 
          trivial = compareBBoxes(subject, clipping, sbbox, cbbox, operation);
            return trivial === EMPTY ? null : trivial;
          }
          // console.time('subdivide edges');
-         const sortedEvents = subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation);
+         var sortedEvents = subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation);
          //console.timeEnd('subdivide edges');
 
          // console.time('connect vertices');
-         const contours = connectEdges(sortedEvents);
+         var contours = connectEdges(sortedEvents);
          //console.timeEnd('connect vertices');
 
          // Convert contours to polygons
-         const polygons = [];
-         for (let i = 0; i < contours.length; i++) {
-           let contour = contours[i];
+         var polygons = [];
+         for (var i = 0; i < contours.length; i++) {
+           var contour = contours[i];
            if (contour.isExterior()) {
              // The exterior ring goes first
-             let rings = [contour.points];
+             var rings = [contour.points];
              // Followed by holes if any
-             for (let j = 0; j < contour.holeIds.length; j++) {
-               let holeId = contour.holeIds[j];
+             for (var j = 0; j < contour.holeIds.length; j++) {
+               var holeId = contour.holeIds[j];
                rings.push(contours[holeId].points);
              }
              polygons.push(rings);
                    this.type = val & 0x7;
                    readField(tag, result, this);
 
-                   if (this.pos === startPos) this.skip(val);
+                   if (this.pos === startPos) { this.skip(val); }
                }
                return result;
            },
                var buf = this.buf,
                    val, b;
 
-               b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;
-               b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;
-               b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
-               b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
+               b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) { return val; }
+               b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) { return val; }
+               b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) { return val; }
+               b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) { return val; }
                b = buf[this.pos];   val |= (b & 0x0f) << 28;
 
                return readVarintRemainder(val, isSigned, this);
            // verbose for performance reasons; doesn't affect gzipped size
 
            readPackedVarint: function(arr, isSigned) {
-               if (this.type !== Pbf.Bytes) return arr.push(this.readVarint(isSigned));
+               if (this.type !== Pbf.Bytes) { return arr.push(this.readVarint(isSigned)); }
                var end = readPackedEnd(this);
                arr = arr || [];
-               while (this.pos < end) arr.push(this.readVarint(isSigned));
+               while (this.pos < end) { arr.push(this.readVarint(isSigned)); }
                return arr;
            },
            readPackedSVarint: function(arr) {
-               if (this.type !== Pbf.Bytes) return arr.push(this.readSVarint());
+               if (this.type !== Pbf.Bytes) { return arr.push(this.readSVarint()); }
                var end = readPackedEnd(this);
                arr = arr || [];
-               while (this.pos < end) arr.push(this.readSVarint());
+               while (this.pos < end) { arr.push(this.readSVarint()); }
                return arr;
            },
            readPackedBoolean: function(arr) {
-               if (this.type !== Pbf.Bytes) return arr.push(this.readBoolean());
+               if (this.type !== Pbf.Bytes) { return arr.push(this.readBoolean()); }
                var end = readPackedEnd(this);
                arr = arr || [];
-               while (this.pos < end) arr.push(this.readBoolean());
+               while (this.pos < end) { arr.push(this.readBoolean()); }
                return arr;
            },
            readPackedFloat: function(arr) {
-               if (this.type !== Pbf.Bytes) return arr.push(this.readFloat());
+               if (this.type !== Pbf.Bytes) { return arr.push(this.readFloat()); }
                var end = readPackedEnd(this);
                arr = arr || [];
-               while (this.pos < end) arr.push(this.readFloat());
+               while (this.pos < end) { arr.push(this.readFloat()); }
                return arr;
            },
            readPackedDouble: function(arr) {
-               if (this.type !== Pbf.Bytes) return arr.push(this.readDouble());
+               if (this.type !== Pbf.Bytes) { return arr.push(this.readDouble()); }
                var end = readPackedEnd(this);
                arr = arr || [];
-               while (this.pos < end) arr.push(this.readDouble());
+               while (this.pos < end) { arr.push(this.readDouble()); }
                return arr;
            },
            readPackedFixed32: function(arr) {
-               if (this.type !== Pbf.Bytes) return arr.push(this.readFixed32());
+               if (this.type !== Pbf.Bytes) { return arr.push(this.readFixed32()); }
                var end = readPackedEnd(this);
                arr = arr || [];
-               while (this.pos < end) arr.push(this.readFixed32());
+               while (this.pos < end) { arr.push(this.readFixed32()); }
                return arr;
            },
            readPackedSFixed32: function(arr) {
-               if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed32());
+               if (this.type !== Pbf.Bytes) { return arr.push(this.readSFixed32()); }
                var end = readPackedEnd(this);
                arr = arr || [];
-               while (this.pos < end) arr.push(this.readSFixed32());
+               while (this.pos < end) { arr.push(this.readSFixed32()); }
                return arr;
            },
            readPackedFixed64: function(arr) {
-               if (this.type !== Pbf.Bytes) return arr.push(this.readFixed64());
+               if (this.type !== Pbf.Bytes) { return arr.push(this.readFixed64()); }
                var end = readPackedEnd(this);
                arr = arr || [];
-               while (this.pos < end) arr.push(this.readFixed64());
+               while (this.pos < end) { arr.push(this.readFixed64()); }
                return arr;
            },
            readPackedSFixed64: function(arr) {
-               if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed64());
+               if (this.type !== Pbf.Bytes) { return arr.push(this.readSFixed64()); }
                var end = readPackedEnd(this);
                arr = arr || [];
-               while (this.pos < end) arr.push(this.readSFixed64());
+               while (this.pos < end) { arr.push(this.readSFixed64()); }
                return arr;
            },
 
            skip: function(val) {
                var type = val & 0x7;
-               if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
-               else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
-               else if (type === Pbf.Fixed32) this.pos += 4;
-               else if (type === Pbf.Fixed64) this.pos += 8;
-               else throw new Error('Unimplemented type: ' + type);
+               if (type === Pbf.Varint) { while (this.buf[this.pos++] > 0x7f) {} }
+               else if (type === Pbf.Bytes) { this.pos = this.readVarint() + this.pos; }
+               else if (type === Pbf.Fixed32) { this.pos += 4; }
+               else if (type === Pbf.Fixed64) { this.pos += 8; }
+               else { throw new Error('Unimplemented type: ' + type); }
            },
 
            // === WRITING =================================================================
            realloc: function(min) {
                var length = this.length || 16;
 
-               while (length < this.pos + min) length *= 2;
+               while (length < this.pos + min) { length *= 2; }
 
                if (length !== this.length) {
                    var buf = new Uint8Array(length);
 
                this.realloc(4);
 
-               this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
-               this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
-               this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
+               this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) { return; }
+               this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) { return; }
+               this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) { return; }
                this.buf[this.pos++] =   (val >>> 7) & 0x7f;
            },
 
                this.pos = writeUtf8(this.buf, str, this.pos);
                var len = this.pos - startPos;
 
-               if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
+               if (len >= 0x80) { makeRoomForExtraLength(startPos, len, this); }
 
                // finally, write the message length in the reserved place and restore the position
                this.pos = startPos - 1;
                var len = buffer.length;
                this.writeVarint(len);
                this.realloc(len);
-               for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
+               for (var i = 0; i < len; i++) { this.buf[this.pos++] = buffer[i]; }
            },
 
            writeRawMessage: function(fn, obj) {
                fn(obj, this);
                var len = this.pos - startPos;
 
-               if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
+               if (len >= 0x80) { makeRoomForExtraLength(startPos, len, this); }
 
                // finally, write the message length in the reserved place and restore the position
                this.pos = startPos - 1;
                this.writeRawMessage(fn, obj);
            },
 
-           writePackedVarint:   function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedVarint, arr);   },
-           writePackedSVarint:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSVarint, arr);  },
-           writePackedBoolean:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedBoolean, arr);  },
-           writePackedFloat:    function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFloat, arr);    },
-           writePackedDouble:   function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedDouble, arr);   },
-           writePackedFixed32:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed32, arr);  },
-           writePackedSFixed32: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed32, arr); },
-           writePackedFixed64:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed64, arr);  },
-           writePackedSFixed64: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed64, arr); },
+           writePackedVarint:   function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedVarint, arr); }   },
+           writePackedSVarint:  function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedSVarint, arr); }  },
+           writePackedBoolean:  function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedBoolean, arr); }  },
+           writePackedFloat:    function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedFloat, arr); }    },
+           writePackedDouble:   function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedDouble, arr); }   },
+           writePackedFixed32:  function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedFixed32, arr); }  },
+           writePackedSFixed32: function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedSFixed32, arr); } },
+           writePackedFixed64:  function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedFixed64, arr); }  },
+           writePackedSFixed64: function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedSFixed64, arr); } },
 
            writeBytesField: function(tag, buffer) {
                this.writeTag(tag, Pbf.Bytes);
            var buf = p.buf,
                h, b;
 
-           b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) return toNum(l, h, s);
-           b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) return toNum(l, h, s);
-           b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
-           b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
-           b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
-           b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
+           b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) { return toNum(l, h, s); }
+           b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) { return toNum(l, h, s); }
+           b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) { return toNum(l, h, s); }
+           b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) { return toNum(l, h, s); }
+           b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) { return toNum(l, h, s); }
+           b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) { return toNum(l, h, s); }
 
            throw new Error('Expected varint not more than 10 bytes');
        }
        function writeBigVarintHigh(high, pbf) {
            var lsb = (high & 0x07) << 4;
 
-           pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
-           pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
-           pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
-           pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
-           pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
+           pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) { return; }
+           pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; }
+           pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; }
+           pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; }
+           pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; }
            pbf.buf[pbf.pos++]  = high & 0x7f;
        }
 
 
            // if 1 byte isn't enough for encoding message length, shift the data to the right
            pbf.realloc(extraLen);
-           for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
+           for (var i = pbf.pos - 1; i >= startPos; i--) { pbf.buf[i + extraLen] = pbf.buf[i]; }
        }
 
-       function writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }
-       function writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }
-       function writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }
-       function writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }
-       function writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }
-       function writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }
-       function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
-       function writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }
-       function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
+       function writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) { pbf.writeVarint(arr[i]); }   }
+       function writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) { pbf.writeSVarint(arr[i]); }  }
+       function writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) { pbf.writeFloat(arr[i]); }    }
+       function writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) { pbf.writeDouble(arr[i]); }   }
+       function writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) { pbf.writeBoolean(arr[i]); }  }
+       function writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) { pbf.writeFixed32(arr[i]); }  }
+       function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeSFixed32(arr[i]); } }
+       function writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) { pbf.writeFixed64(arr[i]); }  }
+       function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeSFixed64(arr[i]); } }
 
        // Buffer code below from https://github.com/feross/buffer, MIT-licensed
 
                    b0 > 0xDF ? 3 :
                    b0 > 0xBF ? 2 : 1;
 
-               if (i + bytesPerSequence > end) break;
+               if (i + bytesPerSequence > end) { break; }
 
                var b1, b2, b3;
 
        }
 
        function readFeature(tag, feature, pbf) {
-           if (tag == 1) feature.id = pbf.readVarint();
-           else if (tag == 2) readTag(pbf, feature);
-           else if (tag == 3) feature.type = pbf.readVarint();
-           else if (tag == 4) feature._geometry = pbf.pos;
+           if (tag == 1) { feature.id = pbf.readVarint(); }
+           else if (tag == 2) { readTag(pbf, feature); }
+           else if (tag == 3) { feature.type = pbf.readVarint(); }
+           else if (tag == 4) { feature._geometry = pbf.pos; }
        }
 
        function readTag(pbf, feature) {
                    y += pbf.readSVarint();
 
                    if (cmd === 1) { // moveTo
-                       if (line) lines.push(line);
+                       if (line) { lines.push(line); }
                        line = [];
                    }
 
                }
            }
 
-           if (line) lines.push(line);
+           if (line) { lines.push(line); }
 
            return lines;
        };
                if (cmd === 1 || cmd === 2) {
                    x += pbf.readSVarint();
                    y += pbf.readSVarint();
-                   if (x < x1) x1 = x;
-                   if (x > x2) x2 = x;
-                   if (y < y1) y1 = y;
-                   if (y > y2) y2 = y;
+                   if (x < x1) { x1 = x; }
+                   if (x > x2) { x2 = x; }
+                   if (y < y1) { y1 = y; }
+                   if (y > y2) { y2 = y; }
 
                } else if (cmd !== 7) {
                    throw new Error('unknown command ' + cmd);
        function classifyRings(rings) {
            var len = rings.length;
 
-           if (len <= 1) return [rings];
+           if (len <= 1) { return [rings]; }
 
            var polygons = [],
                polygon,
 
            for (var i = 0; i < len; i++) {
                var area = signedArea$1(rings[i]);
-               if (area === 0) continue;
+               if (area === 0) { continue; }
 
-               if (ccw === undefined) ccw = area < 0;
+               if (ccw === undefined) { ccw = area < 0; }
 
                if (ccw === area < 0) {
-                   if (polygon) polygons.push(polygon);
+                   if (polygon) { polygons.push(polygon); }
                    polygon = [rings[i]];
 
                } else {
                    polygon.push(rings[i]);
                }
            }
-           if (polygon) polygons.push(polygon);
+           if (polygon) { polygons.push(polygon); }
 
            return polygons;
        }
        }
 
        function readLayer(tag, layer, pbf) {
-           if (tag === 15) layer.version = pbf.readVarint();
-           else if (tag === 1) layer.name = pbf.readString();
-           else if (tag === 5) layer.extent = pbf.readVarint();
-           else if (tag === 2) layer._features.push(pbf.pos);
-           else if (tag === 3) layer._keys.push(pbf.readString());
-           else if (tag === 4) layer._values.push(readValueMessage(pbf));
+           if (tag === 15) { layer.version = pbf.readVarint(); }
+           else if (tag === 1) { layer.name = pbf.readString(); }
+           else if (tag === 5) { layer.extent = pbf.readVarint(); }
+           else if (tag === 2) { layer._features.push(pbf.pos); }
+           else if (tag === 3) { layer._keys.push(pbf.readString()); }
+           else if (tag === 4) { layer._values.push(readValueMessage(pbf)); }
        }
 
        function readValueMessage(pbf) {
 
        // return feature `i` from this layer as a `VectorTileFeature`
        VectorTileLayer.prototype.feature = function(i) {
-           if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');
+           if (i < 0 || i >= this._features.length) { throw new Error('feature index out of bounds'); }
 
            this._pbf.pos = this._features[i];
 
        function readTile(tag, layers, pbf) {
            if (tag === 3) {
                var layer = new vectortilelayer(pbf, pbf.readVarint() + pbf.pos);
-               if (layer.length) layers[layer.name] = layer;
+               if (layer.length) { layers[layer.name] = layer; }
            }
        }
 
                                // feature = featureClip;
                                isClipped = true;
                            }
-                           if (!feature.geometry.coordinates.length) continue;   // not actually on this tile
-                           if (!feature.geometry.coordinates[0].length) continue;   // not actually on this tile
+                           if (!feature.geometry.coordinates.length) { continue; }   // not actually on this tile
+                           if (!feature.geometry.coordinates[0].length) { continue; }   // not actually on this tile
                        }
 
                        // Generate some unique IDs and add some metadata
 
 
        function loadTile(source, tile) {
-           if (source.loaded[tile.id] || source.inflight[tile.id]) return;
+           if (source.loaded[tile.id] || source.inflight[tile.id]) { return; }
 
            var url = source.template
                .replace('{x}', tile.xyz[0])
 
            data: function(sourceID, projection) {
                var source = _vtCache[sourceID];
-               if (!source) return [];
+               if (!source) { return []; }
 
                var tiles = tiler$7.getTiles(projection);
                var seen = {};
 
                for (var i = 0; i < tiles.length; i++) {
                    var features = source.loaded[tiles[i].id];
-                   if (!features || !features.length) continue;
+                   if (!features || !features.length) { continue; }
 
                    for (var j = 0; j < features.length; j++) {
                        var feature = features[j];
                        var hash = feature.__featurehash__;
-                       if (seen[hash]) continue;
+                       if (seen[hash]) { continue; }
                        seen[hash] = true;
 
                        // return a shallow copy, because the hash may change
            // Search for Wikidata items matching the query
            itemsForSearchQuery: function(query, callback) {
                if (!query) {
-                   if (callback) callback('No query', {});
+                   if (callback) { callback('No query', {}); }
                    return;
                }
 
                        if (result && result.error) {
                            throw new Error(result.error);
                        }
-                       if (callback) callback(null, result.search || {});
+                       if (callback) { callback(null, result.search || {}); }
                    })
                    .catch(function(err) {
-                       if (callback) callback(err.message, {});
+                       if (callback) { callback(err.message, {}); }
                    });
            },
 
            // return an array of corresponding Wikidata entities.
            itemsByTitle: function(lang, title, callback) {
                if (!title) {
-                   if (callback) callback('No title', {});
+                   if (callback) { callback('No title', {}); }
                    return;
                }
 
                        if (result && result.error) {
                            throw new Error(result.error);
                        }
-                       if (callback) callback(null, result.entities || {});
+                       if (callback) { callback(null, result.entities || {}); }
                    })
                    .catch(function(err) {
-                       if (callback) callback(err.message, {});
+                       if (callback) { callback(err.message, {}); }
                    });
            },
 
                var localeCode = _mainLocalizer.localeCode().toLowerCase();
                // HACK: en-us isn't a wikidata language. We should really be filtering by
                // the languages known to be supported by wikidata.
-               if (localeCode === 'en-us') localeCode = 'en';
+               if (localeCode === 'en-us') { localeCode = 'en'; }
                return utilArrayUniq([
                    localeCode,
                    _mainLocalizer.languageCode().toLowerCase(),
                    return;
                }
                if (_wikidataCache[qid]) {
-                   if (callback) callback(null, _wikidataCache[qid]);
+                   if (callback) { callback(null, _wikidataCache[qid]); }
                    return;
                }
 
                        if (result && result.error) {
                            throw new Error(result.error);
                        }
-                       if (callback) callback(null, result.entities[qid] || {});
+                       if (callback) { callback(null, result.entities[qid] || {}); }
                    })
                    .catch(function(err) {
-                       if (callback) callback(err.message, {});
+                       if (callback) { callback(err.message, {}); }
                    });
            },
 
 
            search: function(lang, query, callback) {
                if (!query) {
-                   if (callback) callback('No Query', []);
+                   if (callback) { callback('No Query', []); }
                    return;
                }
 
                        }
                    })
                    .catch(function(err) {
-                       if (callback) callback(err, []);
+                       if (callback) { callback(err, []); }
                    });
            },
 
 
            suggestions: function(lang, query, callback) {
                if (!query) {
-                   if (callback) callback('', []);
+                   if (callback) { callback('', []); }
                    return;
                }
 
                        } else if (!result || result.length < 2) {
                            throw new Error('No Results');
                        }
-                       if (callback) callback(null, result[1] || []);
+                       if (callback) { callback(null, result[1] || []); }
                    })
                    .catch(function(err) {
-                       if (callback) callback(err.message, []);
+                       if (callback) { callback(err.message, []); }
                    });
            },
 
 
            translations: function(lang, title, callback) {
                if (!title) {
-                   if (callback) callback('No Title');
+                   if (callback) { callback('No Title'); }
                    return;
                }
 
                        }
                    })
                    .catch(function(err) {
-                       if (callback) callback(err.message);
+                       if (callback) { callback(err.message); }
                    });
            }
 
 
 
            function noteComments(selection) {
-               if (_note.isNew()) return; // don't draw .comments-container
+               if (_note.isNew()) { return; } // don't draw .comments-container
 
                var comments = selection.selectAll('.comments-container')
                    .data([0]);
            function replaceAvatars(selection) {
                var showThirdPartyIcons = corePreferences('preferences.privacy.thirdpartyicons') || 'true';
                var osm = services.osm;
-               if (showThirdPartyIcons !== 'true' || !osm) return;
+               if (showThirdPartyIcons !== 'true' || !osm) { return; }
 
                var uids = {};  // gather uids in the comment thread
                _note.comments.forEach(function(d) {
-                   if (d.uid) uids[d.uid] = true;
+                   if (d.uid) { uids[d.uid] = true; }
                });
 
                Object.keys(uids).forEach(function(uid) {
                    osm.loadUser(uid, function(err, user) {
-                       if (!user || !user.image_url) return;
+                       if (!user || !user.image_url) { return; }
 
                        selection.selectAll('.comment-avatar.user-' + uid)
                            .html('')
 
 
            function localeDateString(s) {
-               if (!s) return null;
+               if (!s) { return null; }
                var options = { day: 'numeric', month: 'short', year: 'numeric' };
                s = s.replace(/-/g, '/'); // fix browser-specific Date() issues
                var d = new Date(s);
-               if (isNaN(d.getTime())) return null;
+               if (isNaN(d.getTime())) { return null; }
                return d.toLocaleDateString(_mainLocalizer.localeCode(), options);
            }
 
 
            noteComments.note = function(val) {
-               if (!arguments.length) return _note;
+               if (!arguments.length) { return _note; }
                _note = val;
                return noteComments;
            };
 
 
            noteHeader.note = function(val) {
-               if (!arguments.length) return _note;
+               if (!arguments.length) { return _note; }
                _note = val;
                return noteHeader;
            };
 
 
            noteReport.note = function(val) {
-               if (!arguments.length) return _note;
+               if (!arguments.length) { return _note; }
                _note = val;
                return noteReport;
            };
 
 
            viewOnOSM.what = function(_) {
-               if (!arguments.length) return _what;
+               if (!arguments.length) { return _what; }
                _what = _;
                return viewOnOSM;
            };
 
                // fast submit if user presses cmd+enter
                function keydown() {
-                   if (!(event.keyCode === 13 && event.metaKey)) return;
+                   if (!(event.keyCode === 13 && event.metaKey)) { return; }
 
                    var osm = services.osm;
-                   if (!osm) return;
+                   if (!osm) { return; }
 
                    var hasAuth = osm.authenticated();
-                   if (!hasAuth) return;
+                   if (!hasAuth) { return; }
 
-                   if (!_note.newComment) return;
+                   if (!_note.newComment) { return; }
 
                    event.preventDefault();
 
                    .merge(detailSection);
 
                var osm = services.osm;
-               if (!osm) return;
+               if (!osm) { return; }
 
                // Add warning if user is not logged in
                var hasAuth = osm.authenticated();
                    .merge(prose);
 
                osm.userDetails(function(err, user) {
-                   if (err) return;
+                   if (err) { return; }
 
                    var userLink = select(document.createElement('div'));
 
 
 
            noteEditor.note = function(val) {
-               if (!arguments.length) return _note;
+               if (!arguments.length) { return _note; }
                _note = val;
                return noteEditor;
            };
 
            noteEditor.newNote = function(val) {
-               if (!arguments.length) return _newNote;
+               if (!arguments.length) { return _newNote; }
                _newNote = val;
                return noteEditor;
            };
                .on('change', function() {
                    context.map().pan([0,0]);  // trigger a redraw
                    var note = checkSelectedID();
-                   if (!note) return;
+                   if (!note) { return; }
                    context.ui().sidebar
                        .show(_noteEditor.note(note));
                });
 
 
            function checkSelectedID() {
-               if (!services.osm) return;
+               if (!services.osm) { return; }
                var note = services.osm.getNote(selectedNoteID);
                if (!note) {
                    context.enter(modeBrowse(context));
 
            // class the note as selected, or return to browse mode if the note is gone
            function selectNote(drawn) {
-               if (!checkSelectedID()) return;
+               if (!checkSelectedID()) { return; }
 
                var selection = context.surface().selectAll('.layer-notes .note-' + selectedNoteID);
 
 
 
            function esc() {
-               if (context.container().select('.combobox').size()) return;
+               if (context.container().select('.combobox').size()) { return; }
                context.enter(modeBrowse(context));
            }
 
 
            mode.zoomToSelected = function() {
-               if (!services.osm) return;
+               if (!services.osm) { return; }
                var note = services.osm.getNote(selectedNoteID);
                if (note) {
                    context.map().centerZoomEase(note.loc, 20);
 
 
            mode.newFeature = function(val) {
-               if (!arguments.length) return _newFeature;
+               if (!arguments.length) { return _newFeature; }
                _newFeature = val;
                return mode;
            };
 
            mode.enter = function() {
                var note = checkSelectedID();
-               if (!note) return;
+               if (!note) { return; }
 
                _behaviors.forEach(context.install);
 
 
 
            function startNudge(nudge) {
-               if (_nudgeInterval) window.clearInterval(_nudgeInterval);
+               if (_nudgeInterval) { window.clearInterval(_nudgeInterval); }
                _nudgeInterval = window.setInterval(function() {
                    context.map().pan(nudge);
                    doMove(nudge);
 
 
            dataHeader.datum = function(val) {
-               if (!arguments.length) return _datum;
+               if (!arguments.length) { return _datum; }
                _datum = val;
                return this;
            };
            };
 
            var combobox = function(input, attachTo) {
-               if (!input || input.empty()) return;
+               if (!input || input.empty()) { return; }
 
                input
                    .classed('combobox-input', true)
 
 
                function mousedown() {
-                   if (event.button !== 0) return;    // left click only
+                   if (event.button !== 0) { return; }    // left click only
                    _tDown = +new Date();
 
                    // clear selection
 
                function mouseup() {
                    input.on('mouseup.combo-input', null);
-                   if (event.button !== 0) return;    // left click only
-                   if (input.node() !== document.activeElement) return;   // exit if this input is not focused
+                   if (event.button !== 0) { return; }    // left click only
+                   if (input.node() !== document.activeElement) { return; }   // exit if this input is not focused
 
                    var start = input.property('selectionStart');
                    var end = input.property('selectionEnd');
-                   if (start !== end) return;  // exit if user is selecting
+                   if (start !== end) { return; }  // exit if user is selecting
 
                    // not showing or showing for a different field - try to show it.
                    var combo = container.selectAll('.combobox');
                    if (combo.empty() || combo.datum() !== input.node()) {
                        var tOrig = _tDown;
                        window.setTimeout(function() {
-                           if (tOrig !== _tDown) return;   // exit if user double clicked
+                           if (tOrig !== _tDown) { return; }   // exit if user double clicked
                            fetchComboData('', function() {
                                show();
                                render();
                            break;
 
                        case 38:  // ↑ Up arrow
-                           if (tagName === 'textarea' && !shown) return;
+                           if (tagName === 'textarea' && !shown) { return; }
                            event.preventDefault();
                            if (tagName === 'input' && !shown) {
                                show();
                            break;
 
                        case 40:  // ↓ Down arrow
-                           if (tagName === 'textarea' && !shown) return;
+                           if (tagName === 'textarea' && !shown) { return; }
                            event.preventDefault();
                            if (tagName === 'input' && !shown) {
                                show();
 
                function ensureVisible() {
                    var combo = container.selectAll('.combobox');
-                   if (combo.empty()) return;
+                   if (combo.empty()) { return; }
 
                    var containerRect = container.node().getBoundingClientRect();
                    var comboRect = combo.node().getBoundingClientRect();
 
                    _fetcher.call(input, v, function(results) {
                        // already chose a value, don't overwrite or autocomplete it
-                       if (_cancelFetch) return;
+                       if (_cancelFetch) { return; }
 
                        _suggestions = results;
                        results.forEach(function(d) { _fetched[d.value] = d; });
 
 
                function tryAutocomplete() {
-                   if (!_canAutocomplete) return;
+                   if (!_canAutocomplete) { return; }
 
                    var val = _caseSensitive ? value() : value().toLowerCase();
-                   if (!val) return;
+                   if (!val) { return; }
 
                    // Don't autocomplete if user is typing a number - #4935
-                   if (!isNaN(parseFloat(val)) && isFinite(val)) return;
+                   if (!isNaN(parseFloat(val)) && isFinite(val)) { return; }
 
                    var bestIndex = -1;
                    for (var i = 0; i < _suggestions.length; i++) {
                    }
 
                    var shown = !container.selectAll('.combobox').empty();
-                   if (!shown) return;
+                   if (!shown) { return; }
 
                    var combo = container.selectAll('.combobox');
                    var options = combo.selectAll('.combobox-option')
 
 
            combobox.canAutocomplete = function(val) {
-               if (!arguments.length) return _canAutocomplete;
+               if (!arguments.length) { return _canAutocomplete; }
                _canAutocomplete = val;
                return combobox;
            };
 
            combobox.caseSensitive = function(val) {
-               if (!arguments.length) return _caseSensitive;
+               if (!arguments.length) { return _caseSensitive; }
                _caseSensitive = val;
                return combobox;
            };
 
            combobox.data = function(val) {
-               if (!arguments.length) return _data;
+               if (!arguments.length) { return _data; }
                _data = val;
                return combobox;
            };
 
            combobox.fetcher = function(val) {
-               if (!arguments.length) return _fetcher;
+               if (!arguments.length) { return _fetcher; }
                _fetcher = val;
                return combobox;
            };
 
            combobox.minItems = function(val) {
-               if (!arguments.length) return _minItems;
+               if (!arguments.length) { return _minItems; }
                _minItems = val;
                return combobox;
            };
 
            combobox.itemsMouseEnter = function(val) {
-               if (!arguments.length) return _mouseEnterHandler;
+               if (!arguments.length) { return _mouseEnterHandler; }
                _mouseEnterHandler = val;
                return combobox;
            };
 
            combobox.itemsMouseLeave = function(val) {
-               if (!arguments.length) return _mouseLeaveHandler;
+               if (!arguments.length) { return _mouseLeaveHandler; }
                _mouseLeaveHandler = val;
                return combobox;
            };
                        select(this)
                            .classed('hide', !show)
                            .style('opacity', null);
-                       if (callback) callback.apply(this);
+                       if (callback) { callback.apply(this); }
                    });
            };
        }
 
 
            disclosure.title = function(val) {
-               if (!arguments.length) return _title;
+               if (!arguments.length) { return _title; }
                _title = utilFunctor(val);
                return disclosure;
            };
 
 
            disclosure.expanded = function(val) {
-               if (!arguments.length) return _expanded;
+               if (!arguments.length) { return _expanded; }
                _expanded = val;
                return disclosure;
            };
 
 
            disclosure.updatePreference = function(val) {
-               if (!arguments.length) return _updatePreference;
+               if (!arguments.length) { return _updatePreference; }
                _updatePreference = val;
                return disclosure;
            };
 
 
            disclosure.content = function(val) {
-               if (!arguments.length) return _content;
+               if (!arguments.length) { return _content; }
                _content = val;
                return disclosure;
            };
            };
 
            section.classes = function(val) {
-               if (!arguments.length) return _classes;
+               if (!arguments.length) { return _classes; }
                _classes = utilFunctor(val);
                return section;
            };
 
            section.title = function(val) {
-               if (!arguments.length) return _title;
+               if (!arguments.length) { return _title; }
                _title = utilFunctor(val);
                return section;
            };
 
            section.expandedByDefault = function(val) {
-               if (!arguments.length) return _expandedByDefault;
+               if (!arguments.length) { return _expandedByDefault; }
                _expandedByDefault = utilFunctor(val);
                return section;
            };
 
            section.shouldDisplay = function(val) {
-               if (!arguments.length) return _shouldDisplay;
+               if (!arguments.length) { return _shouldDisplay; }
                _shouldDisplay = utilFunctor(val);
                return section;
            };
 
            section.content = function(val) {
-               if (!arguments.length) return _content;
+               if (!arguments.length) { return _content; }
                _content = val;
                return section;
            };
 
            section.disclosureContent = function(val) {
-               if (!arguments.length) return _disclosureContent;
+               if (!arguments.length) { return _disclosureContent; }
                _disclosureContent = val;
                return section;
            };
 
            section.disclosureExpanded = function(val) {
-               if (!arguments.length) return _disclosureExpanded;
+               if (!arguments.length) { return _disclosureExpanded; }
                _disclosureExpanded = val;
                return section;
            };
 
 
            function load() {
-               if (!wikibase) return;
+               if (!wikibase) { return; }
 
                _button
                    .classed('tag-reference-loading', true);
 
 
            tagReference.showing = function(val) {
-               if (!arguments.length) return _showing;
+               if (!arguments.length) { return _showing; }
                _showing = val;
                return tagReference;
            };
            }
 
            function setTextareaHeight() {
-               if (_tagView !== 'text') return;
+               if (_tagView !== 'text') { return; }
 
                var selection = select(this);
                selection.style('height', null);
                    .filter(function(row) { return row.key && row.key.trim() !== ''; })
                    .map(function(row) {
                        var rawVal = row.value;
-                       if (typeof rawVal !== 'string') rawVal = '*';
+                       if (typeof rawVal !== 'string') { rawVal = '*'; }
                        var val = rawVal ? stringify(rawVal) : '';
                        return stringify(row.key) + '=' + val;
                    })
                });
 
                var tagDiff = utilTagDiff(_tags, newTags);
-               if (!tagDiff.length) return;
+               if (!tagDiff.length) { return; }
 
                _pendingChange  = _pendingChange || {};
 
                tagDiff.forEach(function(change) {
-                   if (isReadOnly({ key: change.key })) return;
+                   if (isReadOnly({ key: change.key })) { return; }
 
                    // skip unchanged multiselection placeholders
-                   if (change.newVal === '*' && typeof change.oldVal !== 'string') return;
+                   if (change.newVal === '*' && typeof change.oldVal !== 'string') { return; }
 
                    if (change.type === '-') {
                        _pendingChange[change.key] = undefined;
            }
 
            function bindTypeahead(key, value) {
-               if (isReadOnly(key.datum())) return;
+               if (isReadOnly(key.datum())) { return; }
 
                if (Array.isArray(value.datum().value)) {
                    value.call(uiCombobox(context, 'tag-value')
                        .minItems(1)
                        .fetcher(function(value, callback) {
                            var keyString = utilGetSetValue(key);
-                           if (!_tags[keyString]) return;
+                           if (!_tags[keyString]) { return; }
                            var data = _tags[keyString].filter(Boolean).map(function(tagValue) {
                                return {
                                    value: tagValue,
                            geometry: geometry,
                            query: value
                        }, function(err, data) {
-                           if (!err) callback(sort(value, data));
+                           if (!err) { callback(sort(value, data)); }
                        });
                    }));
 
            }
 
            function keyChange(d) {
-               if (select(this).attr('readonly')) return;
+               if (select(this).attr('readonly')) { return; }
 
                var kOld = d.key;
 
                // exit if we are currently about to delete this row anyway - #6366
-               if (_pendingChange && _pendingChange.hasOwnProperty(kOld) && _pendingChange[kOld] === undefined) return;
+               if (_pendingChange && _pendingChange.hasOwnProperty(kOld) && _pendingChange[kOld] === undefined) { return; }
 
                var kNew = context.cleanTagKey(this.value.trim());
 
 
                // update the ordered key index so this row doesn't change position
                var existingKeyIndex = _orderedKeys.indexOf(kOld);
-               if (existingKeyIndex !== -1) _orderedKeys[existingKeyIndex] = kNew;
+               if (existingKeyIndex !== -1) { _orderedKeys[existingKeyIndex] = kNew; }
 
                d.key = kNew;    // update datum to avoid exit/enter on tag update
                d.value = vNew;
            }
 
            function valueChange(d) {
-               if (isReadOnly(d)) return;
+               if (isReadOnly(d)) { return; }
 
                // exit if this is a multiselection and no value was entered
-               if (typeof d.value !== 'string' && !this.value) return;
+               if (typeof d.value !== 'string' && !this.value) { return; }
 
                // exit if we are currently about to delete this row anyway - #6366
-               if (_pendingChange && _pendingChange.hasOwnProperty(d.key) && _pendingChange[d.key] === undefined) return;
+               if (_pendingChange && _pendingChange.hasOwnProperty(d.key) && _pendingChange[d.key] === undefined) { return; }
 
                _pendingChange = _pendingChange || {};
 
            }
 
            function removeTag(d) {
-               if (isReadOnly(d)) return;
+               if (isReadOnly(d)) { return; }
 
                if (d.key === '') {    // removing the blank row
                    _showBlank = false;
 
                // Delay change in case this change is blurring an edited combo. - #5878
                window.setTimeout(function() {
-                   if (!_pendingChange) return;
+                   if (!_pendingChange) { return; }
 
                    dispatch$1.call('change', this, entityIDs, _pendingChange);
                    _pendingChange = null;
 
 
            section.state = function(val) {
-               if (!arguments.length) return _state;
+               if (!arguments.length) { return _state; }
                if (_state !== val) {
                    _orderedKeys = [];
                    _state = val;
 
 
            section.presets = function(val) {
-               if (!arguments.length) return _presets;
+               if (!arguments.length) { return _presets; }
                _presets = val;
                if (_presets && _presets.length && _presets[0].isFallback()) {
                    section.disclosureExpanded(true);
 
 
            section.tags = function(val) {
-               if (!arguments.length) return _tags;
+               if (!arguments.length) { return _tags; }
                _tags = val;
                return section;
            };
 
 
            section.entityIDs = function(val) {
-               if (!arguments.length) return _entityIDs;
+               if (!arguments.length) { return _entityIDs; }
                if (!_entityIDs || !val || !utilArrayIdentical(_entityIDs, val)) {
                    _entityIDs = val;
                    _orderedKeys = [];
 
            // pass an array of regular expressions to test against the tag key
            section.readOnlyTags = function(val) {
-               if (!arguments.length) return _readOnlyTags;
+               if (!arguments.length) { return _readOnlyTags; }
                _readOnlyTags = val;
                return section;
            };
 
 
            dataEditor.datum = function(val) {
-               if (!arguments.length) return _datum;
+               if (!arguments.length) { return _datum; }
                _datum = val;
                return this;
            };
 
 
            function esc() {
-               if (context.container().select('.combobox').size()) return;
+               if (context.container().select('.combobox').size()) { return; }
                context.enter(modeBrowse(context));
            }
 
        }
 
        function uiImproveOsmComments() {
-         let _qaItem;
+         var _qaItem;
 
          function issueComments(selection) {
            // make the div immediately so it appears above the buttons
-           let comments = selection.selectAll('.comments-container')
+           var comments = selection.selectAll('.comments-container')
              .data([0]);
 
            comments = comments.enter()
 
            // must retrieve comments from API before they can be displayed
            services.improveOSM.getComments(_qaItem)
-             .then(d => {
-               if (!d.comments) return; // nothing to do here
+             .then(function (d) {
+               if (!d.comments) { return; } // nothing to do here
 
-               const commentEnter = comments.selectAll('.comment')
+               var commentEnter = comments.selectAll('.comment')
                  .data(d.comments)
                  .enter()
                  .append('div')
                    .attr('class', 'comment-avatar')
                    .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
 
-               const mainEnter = commentEnter
+               var mainEnter = commentEnter
                  .append('div')
                  .attr('class', 'comment-main');
 
-               const metadataEnter = mainEnter
+               var metadataEnter = mainEnter
                  .append('div')
                    .attr('class', 'comment-metadata');
 
                  .append('div')
                    .attr('class', 'comment-author')
                    .each(function(d) {
-                     const osm = services.osm;
-                     let selection = select(this);
+                     var osm = services.osm;
+                     var selection = select(this);
                      if (osm && d.username) {
                        selection = selection
                          .append('a')
                          .attr('target', '_blank');
                      }
                      selection
-                       .text(d => d.username);
+                       .text(function (d) { return d.username; });
                    });
 
                metadataEnter
                  .append('div')
                    .attr('class', 'comment-date')
-                   .text(d => _t('note.status.commented', { when: localeDateString(d.timestamp) }));
+                   .text(function (d) { return _t('note.status.commented', { when: localeDateString(d.timestamp) }); });
 
                mainEnter
                  .append('div')
                    .attr('class', 'comment-text')
                  .append('p')
-                   .text(d => d.text);
+                   .text(function (d) { return d.text; });
            })
-           .catch(err => {
+           .catch(function (err) {
              console.log(err); // eslint-disable-line no-console
            });
          }
 
          function localeDateString(s) {
-           if (!s) return null;
-           const options = { day: 'numeric', month: 'short', year: 'numeric' };
-           const d = new Date(s * 1000); // timestamp is served in seconds, date takes ms
-           if (isNaN(d.getTime())) return null;
+           if (!s) { return null; }
+           var options = { day: 'numeric', month: 'short', year: 'numeric' };
+           var d = new Date(s * 1000); // timestamp is served in seconds, date takes ms
+           if (isNaN(d.getTime())) { return null; }
            return d.toLocaleDateString(_mainLocalizer.localeCode(), options);
          }
 
          issueComments.issue = function(val) {
-           if (!arguments.length) return _qaItem;
+           if (!arguments.length) { return _qaItem; }
            _qaItem = val;
            return issueComments;
          };
        }
 
        function uiImproveOsmDetails(context) {
-         let _qaItem;
+         var _qaItem;
 
 
          function issueDetail(d) {
-           if (d.desc) return d.desc;
-           const issueKey = d.issueKey;
+           if (d.desc) { return d.desc; }
+           var issueKey = d.issueKey;
            d.replacements = d.replacements || {};
            d.replacements.default = _t('inspector.unknown');  // special key `default` works as a fallback string
-           return _t(`QA.improveOSM.error_types.${issueKey}.description`, d.replacements);
+           return _t(("QA.improveOSM.error_types." + issueKey + ".description"), d.replacements);
          }
 
 
          function improveOsmDetails(selection) {
-           const details = selection.selectAll('.error-details')
+           var details = selection.selectAll('.error-details')
              .data(
                (_qaItem ? [_qaItem] : []),
-               d => `${d.id}-${d.status || 0}`
+               function (d) { return ((d.id) + "-" + (d.status || 0)); }
              );
 
            details.exit()
              .remove();
 
-           const detailsEnter = details.enter()
+           var detailsEnter = details.enter()
              .append('div')
                .attr('class', 'error-details qa-details-container');
 
 
            // description
-           const descriptionEnter = detailsEnter
+           var descriptionEnter = detailsEnter
              .append('div')
                .attr('class', 'qa-details-subsection');
 
            descriptionEnter
              .append('h4')
-               .text(() => _t('QA.keepRight.detail_description'));
+               .text(function () { return _t('QA.keepRight.detail_description'); });
 
            descriptionEnter
              .append('div')
                .html(issueDetail);
 
            // If there are entity links in the error message..
-           let relatedEntities = [];
+           var relatedEntities = [];
            descriptionEnter.selectAll('.error_entity_link, .error_object_link')
              .each(function() {
-               const link = select(this);
-               const isObjectLink = link.classed('error_object_link');
-               const entityID = isObjectLink ?
+               var link = select(this);
+               var isObjectLink = link.classed('error_object_link');
+               var entityID = isObjectLink ?
                  (utilEntityRoot(_qaItem.objectType) + _qaItem.objectId)
                  : this.textContent;
-               const entity = context.hasEntity(entityID);
+               var entity = context.hasEntity(entityID);
 
                relatedEntities.push(entityID);
 
                // Add click handler
                link
-                 .on('mouseenter', () => {
+                 .on('mouseenter', function () {
                    utilHighlightEntities([entityID], true, context);
                  })
-                 .on('mouseleave', () => {
+                 .on('mouseleave', function () {
                    utilHighlightEntities([entityID], false, context);
                  })
-                 .on('click', () => {
+                 .on('click', function () {
                    event.preventDefault();
 
                    utilHighlightEntities([entityID], false, context);
 
-                   const osmlayer = context.layers().layer('osm');
+                   var osmlayer = context.layers().layer('osm');
                    if (!osmlayer.enabled()) {
                      osmlayer.enabled(true);
                    }
                    if (entity) {
                      context.enter(modeSelect(context, [entityID]));
                    } else {
-                     context.loadEntity(entityID, () => {
+                     context.loadEntity(entityID, function () {
                        context.enter(modeSelect(context, [entityID]));
                      });
                    }
                // Replace with friendly name if possible
                // (The entity may not yet be loaded into the graph)
                if (entity) {
-                 let name = utilDisplayName(entity);  // try to use common name
+                 var name = utilDisplayName(entity);  // try to use common name
 
                  if (!name && !isObjectLink) {
-                   const preset = _mainPresetIndex.match(entity, context.graph());
+                   var preset = _mainPresetIndex.match(entity, context.graph());
                    name = preset && !preset.isFallback() && preset.name();  // fallback to preset name
                  }
 
          }
 
          improveOsmDetails.issue = function(val) {
-           if (!arguments.length) return _qaItem;
+           if (!arguments.length) { return _qaItem; }
            _qaItem = val;
            return improveOsmDetails;
          };
        }
 
        function uiImproveOsmHeader() {
-         let _qaItem;
+         var _qaItem;
 
 
          function issueTitle(d) {
-           const issueKey = d.issueKey;
+           var issueKey = d.issueKey;
            d.replacements = d.replacements || {};
            d.replacements.default = _t('inspector.unknown');  // special key `default` works as a fallback string
-           return _t(`QA.improveOSM.error_types.${issueKey}.title`, d.replacements);
+           return _t(("QA.improveOSM.error_types." + issueKey + ".title"), d.replacements);
          }
 
 
          function improveOsmHeader(selection) {
-           const header = selection.selectAll('.qa-header')
+           var header = selection.selectAll('.qa-header')
              .data(
                (_qaItem ? [_qaItem] : []),
-               d => `${d.id}-${d.status || 0}`
+               function (d) { return ((d.id) + "-" + (d.status || 0)); }
              );
 
            header.exit()
              .remove();
 
-           const headerEnter = header.enter()
+           var headerEnter = header.enter()
              .append('div')
                .attr('class', 'qa-header');
 
-           const svgEnter = headerEnter
+           var svgEnter = headerEnter
              .append('div')
                .attr('class', 'qa-header-icon')
-               .classed('new', d => d.id < 0)
+               .classed('new', function (d) { return d.id < 0; })
              .append('svg')
                .attr('width', '20px')
                .attr('height', '30px')
                .attr('viewbox', '0 0 20 30')
-               .attr('class', d => `preset-icon-28 qaItem ${d.service} itemId-${d.id} itemType-${d.itemType}`);
+               .attr('class', function (d) { return ("preset-icon-28 qaItem " + (d.service) + " itemId-" + (d.id) + " itemType-" + (d.itemType)); });
 
            svgEnter
              .append('polygon')
                .attr('width', '13px')
                .attr('height', '13px')
                .attr('transform', 'translate(3.5, 5)')
-               .attr('xlink:href', d => {
-                 const picon = d.icon;
+               .attr('xlink:href', function (d) {
+                 var picon = d.icon;
                  if (!picon) {
                    return '';
                  } else {
-                   const isMaki = /^maki-/.test(picon);
-                   return `#${picon}${isMaki ? '-11' : ''}`;
+                   var isMaki = /^maki-/.test(picon);
+                   return ("#" + picon + (isMaki ? '-11' : ''));
                  }
                });
 
          }
 
          improveOsmHeader.issue = function(val) {
-           if (!arguments.length) return _qaItem;
+           if (!arguments.length) { return _qaItem; }
            _qaItem = val;
            return improveOsmHeader;
          };
        }
 
        function uiImproveOsmEditor(context) {
-         const dispatch$1 = dispatch('change');
-         const qaDetails = uiImproveOsmDetails(context);
-         const qaComments = uiImproveOsmComments();
-         const qaHeader = uiImproveOsmHeader();
+         var dispatch$1 = dispatch('change');
+         var qaDetails = uiImproveOsmDetails(context);
+         var qaComments = uiImproveOsmComments();
+         var qaHeader = uiImproveOsmHeader();
 
-         let _qaItem;
+         var _qaItem;
 
          function improveOsmEditor(selection) {
 
-           const headerEnter = selection.selectAll('.header')
+           var headerEnter = selection.selectAll('.header')
              .data([0])
              .enter()
              .append('div')
            headerEnter
              .append('button')
                .attr('class', 'close')
-               .on('click', () => context.enter(modeBrowse(context)))
+               .on('click', function () { return context.enter(modeBrowse(context)); })
                .call(svgIcon('#iD-icon-close'));
 
            headerEnter
              .append('h3')
                .text(_t('QA.improveOSM.title'));
 
-           let body = selection.selectAll('.body')
+           var body = selection.selectAll('.body')
              .data([0]);
 
            body = body.enter()
                .attr('class', 'body')
              .merge(body);
 
-           const editor = body.selectAll('.qa-editor')
+           var editor = body.selectAll('.qa-editor')
              .data([0]);
 
            editor.enter()
          }
 
          function improveOsmSaveSection(selection) {
-           const isSelected = (_qaItem && _qaItem.id === context.selectedErrorID());
-           const isShown = (_qaItem && (isSelected || _qaItem.newComment || _qaItem.comment));
-           let saveSection = selection.selectAll('.qa-save')
+           var isSelected = (_qaItem && _qaItem.id === context.selectedErrorID());
+           var isShown = (_qaItem && (isSelected || _qaItem.newComment || _qaItem.comment));
+           var saveSection = selection.selectAll('.qa-save')
              .data(
                (isShown ? [_qaItem] : []),
-               d => `${d.id}-${d.status || 0}`
+               function (d) { return ((d.id) + "-" + (d.status || 0)); }
              );
 
            // exit
              .remove();
 
            // enter
-           const saveSectionEnter = saveSection.enter()
+           var saveSectionEnter = saveSection.enter()
              .append('div')
                .attr('class', 'qa-save save-section cf');
 
                .attr('class', 'new-comment-input')
                .attr('placeholder', _t('QA.keepRight.comment_placeholder'))
                .attr('maxlength', 1000)
-               .property('value', d => d.newComment)
+               .property('value', function (d) { return d.newComment; })
                .call(utilNoAuto)
                .on('input', changeInput)
                .on('blur', changeInput);
                .call(qaSaveButtons);
 
            function changeInput() {
-             const input = select(this);
-             let val = input.property('value').trim();
+             var input = select(this);
+             var val = input.property('value').trim();
 
              if (val === '') {
                val = undefined;
              // store the unsaved comment with the issue itself
              _qaItem = _qaItem.update({ newComment: val });
 
-             const qaService = services.improveOSM;
+             var qaService = services.improveOSM;
              if (qaService) {
                qaService.replaceItem(_qaItem);
              }
          }
 
          function qaSaveButtons(selection) {
-           const isSelected = (_qaItem && _qaItem.id === context.selectedErrorID());
-           let buttonSection = selection.selectAll('.buttons')
-             .data((isSelected ? [_qaItem] : []), d => d.status + d.id);
+           var isSelected = (_qaItem && _qaItem.id === context.selectedErrorID());
+           var buttonSection = selection.selectAll('.buttons')
+             .data((isSelected ? [_qaItem] : []), function (d) { return d.status + d.id; });
 
            // exit
            buttonSection.exit()
              .remove();
 
            // enter
-           const buttonEnter = buttonSection.enter()
+           var buttonEnter = buttonSection.enter()
              .append('div')
                .attr('class', 'buttons');
 
              .merge(buttonEnter);
 
            buttonSection.select('.comment-button')
-             .attr('disabled', d => d.newComment ? null : true)
+             .attr('disabled', function (d) { return d.newComment ? null : true; })
              .on('click.comment', function(d) {
                this.blur();    // avoid keeping focus on the button - #4641
-               const qaService = services.improveOSM;
+               var qaService = services.improveOSM;
                if (qaService) {
-                 qaService.postUpdate(d, (err, item) => dispatch$1.call('change', item));
+                 qaService.postUpdate(d, function (err, item) { return dispatch$1.call('change', item); });
                }
              });
 
            buttonSection.select('.close-button')
-             .text(d => {
-               const andComment = (d.newComment ? '_comment' : '');
-               return _t(`QA.keepRight.close${andComment}`);
+             .text(function (d) {
+               var andComment = (d.newComment ? '_comment' : '');
+               return _t(("QA.keepRight.close" + andComment));
              })
              .on('click.close', function(d) {
                this.blur();    // avoid keeping focus on the button - #4641
-               const qaService = services.improveOSM;
+               var qaService = services.improveOSM;
                if (qaService) {
                  d.newStatus = 'SOLVED';
-                 qaService.postUpdate(d, (err, item) => dispatch$1.call('change', item));
+                 qaService.postUpdate(d, function (err, item) { return dispatch$1.call('change', item); });
                }
              });
 
            buttonSection.select('.ignore-button')
-             .text(d => {
-               const andComment = (d.newComment ? '_comment' : '');
-               return _t(`QA.keepRight.ignore${andComment}`);
+             .text(function (d) {
+               var andComment = (d.newComment ? '_comment' : '');
+               return _t(("QA.keepRight.ignore" + andComment));
              })
              .on('click.ignore', function(d) {
                this.blur();    // avoid keeping focus on the button - #4641
-               const qaService = services.improveOSM;
+               var qaService = services.improveOSM;
                if (qaService) {
                  d.newStatus = 'INVALID';
-                 qaService.postUpdate(d, (err, item) => dispatch$1.call('change', item));
+                 qaService.postUpdate(d, function (err, item) { return dispatch$1.call('change', item); });
                }
              });
          }
 
          // NOTE: Don't change method name until UI v3 is merged
          improveOsmEditor.error = function(val) {
-           if (!arguments.length) return _qaItem;
+           if (!arguments.length) { return _qaItem; }
            _qaItem = val;
            return improveOsmEditor;
          };
        }
 
        function uiKeepRightDetails(context) {
-         let _qaItem;
+         var _qaItem;
 
 
          function issueDetail(d) {
-           const { itemType, parentIssueType } = d;
-           const unknown = _t('inspector.unknown');
-           let replacements = d.replacements || {};
+           var itemType = d.itemType;
+           var parentIssueType = d.parentIssueType;
+           var unknown = _t('inspector.unknown');
+           var replacements = d.replacements || {};
            replacements.default = unknown;  // special key `default` works as a fallback string
 
-           let detail = _t(`QA.keepRight.errorTypes.${itemType}.description`, replacements);
+           var detail = _t(("QA.keepRight.errorTypes." + itemType + ".description"), replacements);
            if (detail === unknown) {
-             detail = _t(`QA.keepRight.errorTypes.${parentIssueType}.description`, replacements);
+             detail = _t(("QA.keepRight.errorTypes." + parentIssueType + ".description"), replacements);
            }
            return detail;
          }
 
 
          function keepRightDetails(selection) {
-           const details = selection.selectAll('.error-details')
+           var details = selection.selectAll('.error-details')
              .data(
                (_qaItem ? [_qaItem] : []),
-               d => `${d.id}-${d.status || 0}`
+               function (d) { return ((d.id) + "-" + (d.status || 0)); }
              );
 
            details.exit()
              .remove();
 
-           const detailsEnter = details.enter()
+           var detailsEnter = details.enter()
              .append('div')
                .attr('class', 'error-details qa-details-container');
 
            // description
-           const descriptionEnter = detailsEnter
+           var descriptionEnter = detailsEnter
              .append('div')
                .attr('class', 'qa-details-subsection');
 
            descriptionEnter
              .append('h4')
-               .text(() => _t('QA.keepRight.detail_description'));
+               .text(function () { return _t('QA.keepRight.detail_description'); });
 
            descriptionEnter
              .append('div')
                .html(issueDetail);
 
            // If there are entity links in the error message..
-           let relatedEntities = [];
+           var relatedEntities = [];
            descriptionEnter.selectAll('.error_entity_link, .error_object_link')
              .each(function() {
-               const link = select(this);
-               const isObjectLink = link.classed('error_object_link');
-               const entityID = isObjectLink ?
+               var link = select(this);
+               var isObjectLink = link.classed('error_object_link');
+               var entityID = isObjectLink ?
                  (utilEntityRoot(_qaItem.objectType) + _qaItem.objectId)
                  : this.textContent;
-               const entity = context.hasEntity(entityID);
+               var entity = context.hasEntity(entityID);
 
                relatedEntities.push(entityID);
 
                // Add click handler
                link
-                 .on('mouseenter', () => {
+                 .on('mouseenter', function () {
                    utilHighlightEntities([entityID], true, context);
                  })
-                 .on('mouseleave', () => {
+                 .on('mouseleave', function () {
                    utilHighlightEntities([entityID], false, context);
                  })
-                 .on('click', () => {
+                 .on('click', function () {
                    event.preventDefault();
 
                    utilHighlightEntities([entityID], false, context);
 
-                   const osmlayer = context.layers().layer('osm');
+                   var osmlayer = context.layers().layer('osm');
                    if (!osmlayer.enabled()) {
                      osmlayer.enabled(true);
                    }
                    if (entity) {
                      context.enter(modeSelect(context, [entityID]));
                    } else {
-                     context.loadEntity(entityID, () => {
+                     context.loadEntity(entityID, function () {
                        context.enter(modeSelect(context, [entityID]));
                      });
                    }
                // Replace with friendly name if possible
                // (The entity may not yet be loaded into the graph)
                if (entity) {
-                 let name = utilDisplayName(entity);  // try to use common name
+                 var name = utilDisplayName(entity);  // try to use common name
 
                  if (!name && !isObjectLink) {
-                   const preset = _mainPresetIndex.match(entity, context.graph());
+                   var preset = _mainPresetIndex.match(entity, context.graph());
                    name = preset && !preset.isFallback() && preset.name();  // fallback to preset name
                  }
 
          }
 
          keepRightDetails.issue = function(val) {
-           if (!arguments.length) return _qaItem;
+           if (!arguments.length) { return _qaItem; }
            _qaItem = val;
            return keepRightDetails;
          };
        }
 
        function uiKeepRightHeader() {
-         let _qaItem;
+         var _qaItem;
 
 
          function issueTitle(d) {
-           const { itemType, parentIssueType } = d;
-           const unknown = _t('inspector.unknown');
-           let replacements = d.replacements || {};
+           var itemType = d.itemType;
+           var parentIssueType = d.parentIssueType;
+           var unknown = _t('inspector.unknown');
+           var replacements = d.replacements || {};
            replacements.default = unknown;  // special key `default` works as a fallback string
 
-           let title = _t(`QA.keepRight.errorTypes.${itemType}.title`, replacements);
+           var title = _t(("QA.keepRight.errorTypes." + itemType + ".title"), replacements);
            if (title === unknown) {
-             title = _t(`QA.keepRight.errorTypes.${parentIssueType}.title`, replacements);
+             title = _t(("QA.keepRight.errorTypes." + parentIssueType + ".title"), replacements);
            }
            return title;
          }
 
 
          function keepRightHeader(selection) {
-           const header = selection.selectAll('.qa-header')
+           var header = selection.selectAll('.qa-header')
              .data(
                (_qaItem ? [_qaItem] : []),
-               d => `${d.id}-${d.status || 0}`
+               function (d) { return ((d.id) + "-" + (d.status || 0)); }
              );
 
            header.exit()
              .remove();
 
-           const headerEnter = header.enter()
+           var headerEnter = header.enter()
              .append('div')
                .attr('class', 'qa-header');
 
-           const iconEnter = headerEnter
+           var iconEnter = headerEnter
              .append('div')
                .attr('class', 'qa-header-icon')
-               .classed('new', d => d.id < 0);
+               .classed('new', function (d) { return d.id < 0; });
 
            iconEnter
              .append('div')
-               .attr('class', d => `preset-icon-28 qaItem ${d.service} itemId-${d.id} itemType-${d.parentIssueType}`)
+               .attr('class', function (d) { return ("preset-icon-28 qaItem " + (d.service) + " itemId-" + (d.id) + " itemType-" + (d.parentIssueType)); })
                .call(svgIcon('#iD-icon-bolt', 'qaItem-fill'));
 
            headerEnter
 
 
          keepRightHeader.issue = function(val) {
-           if (!arguments.length) return _qaItem;
+           if (!arguments.length) { return _qaItem; }
            _qaItem = val;
            return keepRightHeader;
          };
        }
 
        function uiViewOnKeepRight() {
-         let _qaItem;
+         var _qaItem;
 
          function viewOnKeepRight(selection) {
-           let url;
+           var url;
            if (services.keepRight && (_qaItem instanceof QAItem)) {
              url = services.keepRight.issueURL(_qaItem);
            }
 
-           const link = selection.selectAll('.view-on-keepRight')
+           var link = selection.selectAll('.view-on-keepRight')
              .data(url ? [url] : []);
 
            // exit
              .remove();
 
            // enter
-           const linkEnter = link.enter()
+           var linkEnter = link.enter()
              .append('a')
                .attr('class', 'view-on-keepRight')
                .attr('target', '_blank')
                .attr('rel', 'noopener') // security measure
-               .attr('href', d => d)
+               .attr('href', function (d) { return d; })
                .call(svgIcon('#iD-icon-out-link', 'inline'));
 
            linkEnter
          }
 
          viewOnKeepRight.what = function(val) {
-           if (!arguments.length) return _qaItem;
+           if (!arguments.length) { return _qaItem; }
            _qaItem = val;
            return viewOnKeepRight;
          };
        }
 
        function uiKeepRightEditor(context) {
-         const dispatch$1 = dispatch('change');
-         const qaDetails = uiKeepRightDetails(context);
-         const qaHeader = uiKeepRightHeader();
+         var dispatch$1 = dispatch('change');
+         var qaDetails = uiKeepRightDetails(context);
+         var qaHeader = uiKeepRightHeader();
 
-         let _qaItem;
+         var _qaItem;
 
          function keepRightEditor(selection) {
 
-           const headerEnter = selection.selectAll('.header')
+           var headerEnter = selection.selectAll('.header')
              .data([0])
              .enter()
              .append('div')
            headerEnter
              .append('button')
                .attr('class', 'close')
-               .on('click', () => context.enter(modeBrowse(context)))
+               .on('click', function () { return context.enter(modeBrowse(context)); })
                .call(svgIcon('#iD-icon-close'));
 
            headerEnter
                .text(_t('QA.keepRight.title'));
 
 
-           let body = selection.selectAll('.body')
+           var body = selection.selectAll('.body')
              .data([0]);
 
            body = body.enter()
                .attr('class', 'body')
              .merge(body);
 
-           const editor = body.selectAll('.qa-editor')
+           var editor = body.selectAll('.qa-editor')
              .data([0]);
 
            editor.enter()
                .call(keepRightSaveSection);
 
 
-           const footer = selection.selectAll('.footer')
+           var footer = selection.selectAll('.footer')
              .data([0]);
 
            footer.enter()
 
 
          function keepRightSaveSection(selection) {
-           const isSelected = (_qaItem && _qaItem.id === context.selectedErrorID());
-           const isShown = (_qaItem && (isSelected || _qaItem.newComment || _qaItem.comment));
-           let saveSection = selection.selectAll('.qa-save')
+           var isSelected = (_qaItem && _qaItem.id === context.selectedErrorID());
+           var isShown = (_qaItem && (isSelected || _qaItem.newComment || _qaItem.comment));
+           var saveSection = selection.selectAll('.qa-save')
              .data(
                (isShown ? [_qaItem] : []),
-               d => `${d.id}-${d.status || 0}`
+               function (d) { return ((d.id) + "-" + (d.status || 0)); }
              );
 
            // exit
              .remove();
 
            // enter
-           const saveSectionEnter = saveSection.enter()
+           var saveSectionEnter = saveSection.enter()
              .append('div')
                .attr('class', 'qa-save save-section cf');
 
                .attr('class', 'new-comment-input')
                .attr('placeholder', _t('QA.keepRight.comment_placeholder'))
                .attr('maxlength', 1000)
-               .property('value', d => d.newComment || d.comment)
+               .property('value', function (d) { return d.newComment || d.comment; })
                .call(utilNoAuto)
                .on('input', changeInput)
                .on('blur', changeInput);
                .call(qaSaveButtons);
 
            function changeInput() {
-             const input = select(this);
-             let val = input.property('value').trim();
+             var input = select(this);
+             var val = input.property('value').trim();
 
              if (val === _qaItem.comment) {
                val = undefined;
              // store the unsaved comment with the issue itself
              _qaItem = _qaItem.update({ newComment: val });
 
-             const qaService = services.keepRight;
+             var qaService = services.keepRight;
              if (qaService) {
                qaService.replaceItem(_qaItem);  // update keepright cache
              }
 
 
          function qaSaveButtons(selection) {
-           const isSelected = (_qaItem && _qaItem.id === context.selectedErrorID());
-           let buttonSection = selection.selectAll('.buttons')
-             .data((isSelected ? [_qaItem] : []), d => d.status + d.id);
+           var isSelected = (_qaItem && _qaItem.id === context.selectedErrorID());
+           var buttonSection = selection.selectAll('.buttons')
+             .data((isSelected ? [_qaItem] : []), function (d) { return d.status + d.id; });
 
            // exit
            buttonSection.exit()
              .remove();
 
            // enter
-           const buttonEnter = buttonSection.enter()
+           var buttonEnter = buttonSection.enter()
              .append('div')
                .attr('class', 'buttons');
 
              .merge(buttonEnter);
 
            buttonSection.select('.comment-button')   // select and propagate data
-             .attr('disabled', d => d.newComment ? null : true)
+             .attr('disabled', function (d) { return d.newComment ? null : true; })
              .on('click.comment', function(d) {
                this.blur();    // avoid keeping focus on the button - #4641
-               const qaService = services.keepRight;
+               var qaService = services.keepRight;
                if (qaService) {
-                 qaService.postUpdate(d, (err, item) => dispatch$1.call('change', item));
+                 qaService.postUpdate(d, function (err, item) { return dispatch$1.call('change', item); });
                }
              });
 
            buttonSection.select('.close-button')   // select and propagate data
-             .text(d => {
-               const andComment = (d.newComment ? '_comment' : '');
-               return _t(`QA.keepRight.close${andComment}`);
+             .text(function (d) {
+               var andComment = (d.newComment ? '_comment' : '');
+               return _t(("QA.keepRight.close" + andComment));
              })
              .on('click.close', function(d) {
                this.blur();    // avoid keeping focus on the button - #4641
-               const qaService = services.keepRight;
+               var qaService = services.keepRight;
                if (qaService) {
                  d.newStatus = 'ignore_t';   // ignore temporarily (item fixed)
-                 qaService.postUpdate(d, (err, item) => dispatch$1.call('change', item));
+                 qaService.postUpdate(d, function (err, item) { return dispatch$1.call('change', item); });
                }
              });
 
            buttonSection.select('.ignore-button')   // select and propagate data
-             .text(d => {
-               const andComment = (d.newComment ? '_comment' : '');
-               return _t(`QA.keepRight.ignore${andComment}`);
+             .text(function (d) {
+               var andComment = (d.newComment ? '_comment' : '');
+               return _t(("QA.keepRight.ignore" + andComment));
              })
              .on('click.ignore', function(d) {
                this.blur();    // avoid keeping focus on the button - #4641
-               const qaService = services.keepRight;
+               var qaService = services.keepRight;
                if (qaService) {
                  d.newStatus = 'ignore';   // ignore permanently (false positive)
-                 qaService.postUpdate(d, (err, item) => dispatch$1.call('change', item));
+                 qaService.postUpdate(d, function (err, item) { return dispatch$1.call('change', item); });
                }
              });
          }
 
          // NOTE: Don't change method name until UI v3 is merged
          keepRightEditor.error = function(val) {
-           if (!arguments.length) return _qaItem;
+           if (!arguments.length) { return _qaItem; }
            _qaItem = val;
            return keepRightEditor;
          };
        }
 
        function uiOsmoseDetails(context) {
-         let _qaItem;
+         var _qaItem;
 
          function issueString(d, type) {
-           if (!d) return '';
+           if (!d) { return ''; }
 
            // Issue strings are cached from Osmose API
-           const s = services.osmose.getStrings(d.itemType);
+           var s = services.osmose.getStrings(d.itemType);
            return (type in s) ? s[type] : '';
          }
 
 
          function osmoseDetails(selection) {
-           const details = selection.selectAll('.error-details')
+           var details = selection.selectAll('.error-details')
              .data(
                _qaItem ? [_qaItem] : [],
-               d => `${d.id}-${d.status || 0}`
+               function (d) { return ((d.id) + "-" + (d.status || 0)); }
              );
 
            details.exit()
              .remove();
 
-           const detailsEnter = details.enter()
+           var detailsEnter = details.enter()
              .append('div')
                .attr('class', 'error-details qa-details-container');
 
 
            // Description
            if (issueString(_qaItem, 'detail')) {
-             const div = detailsEnter
+             var div = detailsEnter
                .append('div')
                  .attr('class', 'qa-details-subsection');
 
              div
                .append('h4')
-                 .text(() => _t('QA.keepRight.detail_description'));
+                 .text(function () { return _t('QA.keepRight.detail_description'); });
 
              div
                .append('p')
                  .attr('class', 'qa-details-description-text')
-                 .html(d => issueString(d, 'detail'))
+                 .html(function (d) { return issueString(d, 'detail'); })
                .selectAll('a')
                  .attr('rel', 'noopener')
                  .attr('target', '_blank');
            }
 
            // Elements (populated later as data is requested)
-           const detailsDiv = detailsEnter
+           var detailsDiv = detailsEnter
              .append('div')
                .attr('class', 'qa-details-subsection');
 
-           const elemsDiv = detailsEnter
+           var elemsDiv = detailsEnter
              .append('div')
                .attr('class', 'qa-details-subsection');
 
            // Suggested Fix (musn't exist for every issue type)
            if (issueString(_qaItem, 'fix')) {
-             const div = detailsEnter
+             var div$1 = detailsEnter
                .append('div')
                  .attr('class', 'qa-details-subsection');
 
-             div
+             div$1
                .append('h4')
-                 .text(() => _t('QA.osmose.fix_title'));
+                 .text(function () { return _t('QA.osmose.fix_title'); });
 
-             div
+             div$1
                .append('p')
-                 .html(d => issueString(d, 'fix'))
+                 .html(function (d) { return issueString(d, 'fix'); })
                .selectAll('a')
                  .attr('rel', 'noopener')
                  .attr('target', '_blank');
 
            // Common Pitfalls (musn't exist for every issue type)
            if (issueString(_qaItem, 'trap')) {
-             const div = detailsEnter
+             var div$2 = detailsEnter
                .append('div')
                  .attr('class', 'qa-details-subsection');
 
-             div
+             div$2
                .append('h4')
-                 .text(() => _t('QA.osmose.trap_title'));
+                 .text(function () { return _t('QA.osmose.trap_title'); });
 
-             div
+             div$2
                .append('p')
-                 .html(d => issueString(d, 'trap'))
+                 .html(function (d) { return issueString(d, 'trap'); })
                .selectAll('a')
                  .attr('rel', 'noopener')
                  .attr('target', '_blank');
            }
 
            // Save current item to check if UI changed by time request resolves
-           const thisItem = _qaItem;
+           var thisItem = _qaItem;
            services.osmose.loadIssueDetail(_qaItem)
-             .then(d => {
+             .then(function (d) {
                // No details to add if there are no associated issue elements
-               if (!d.elems || d.elems.length === 0) return;
+               if (!d.elems || d.elems.length === 0) { return; }
 
                // Do nothing if UI has moved on by the time this resolves
                if (
                  context.selectedErrorID() !== thisItem.id
-                 && context.container().selectAll(`.qaItem.osmose.hover.itemId-${thisItem.id}`).empty()
-               ) return;
+                 && context.container().selectAll((".qaItem.osmose.hover.itemId-" + (thisItem.id))).empty()
+               ) { return; }
 
                // Things like keys and values are dynamically added to a subtitle string
                if (d.detail) {
                  detailsDiv
                    .append('h4')
-                     .text(() => _t('QA.osmose.detail_title'));
+                     .text(function () { return _t('QA.osmose.detail_title'); });
 
                  detailsDiv
                    .append('p')
-                     .html(d => d.detail)
+                     .html(function (d) { return d.detail; })
                    .selectAll('a')
                      .attr('rel', 'noopener')
                      .attr('target', '_blank');
                // Create list of linked issue elements
                elemsDiv
                  .append('h4')
-                   .text(() => _t('QA.osmose.elems_title'));
+                   .text(function () { return _t('QA.osmose.elems_title'); });
 
                elemsDiv
                  .append('ul').selectAll('li')
                  .append('li')
                  .append('a')
                    .attr('class', 'error_entity_link')
-                   .text(d => d)
+                   .text(function (d) { return d; })
                    .each(function() {
-                     const link = select(this);
-                     const entityID = this.textContent;
-                     const entity = context.hasEntity(entityID);
+                     var link = select(this);
+                     var entityID = this.textContent;
+                     var entity = context.hasEntity(entityID);
 
                      // Add click handler
                      link
-                       .on('mouseenter', () => {
+                       .on('mouseenter', function () {
                          utilHighlightEntities([entityID], true, context);
                        })
-                       .on('mouseleave', () => {
+                       .on('mouseleave', function () {
                          utilHighlightEntities([entityID], false, context);
                        })
-                       .on('click', () => {
+                       .on('click', function () {
                          event.preventDefault();
 
                          utilHighlightEntities([entityID], false, context);
 
-                         const osmlayer = context.layers().layer('osm');
+                         var osmlayer = context.layers().layer('osm');
                          if (!osmlayer.enabled()) {
                            osmlayer.enabled(true);
                          }
                          if (entity) {
                            context.enter(modeSelect(context, [entityID]));
                          } else {
-                           context.loadEntity(entityID, () => {
+                           context.loadEntity(entityID, function () {
                              context.enter(modeSelect(context, [entityID]));
                            });
                          }
                      // Replace with friendly name if possible
                      // (The entity may not yet be loaded into the graph)
                      if (entity) {
-                       let name = utilDisplayName(entity);  // try to use common name
+                       var name = utilDisplayName(entity);  // try to use common name
 
                        if (!name) {
-                         const preset = _mainPresetIndex.match(entity, context.graph());
+                         var preset = _mainPresetIndex.match(entity, context.graph());
                          name = preset && !preset.isFallback() && preset.name();  // fallback to preset name
                        }
 
                context.features().forceVisible(d.elems);
                context.map().pan([0,0]);  // trigger a redraw
              })
-             .catch(err => {
+             .catch(function (err) {
                console.log(err); // eslint-disable-line no-console
              });
          }
 
 
          osmoseDetails.issue = function(val) {
-           if (!arguments.length) return _qaItem;
+           if (!arguments.length) { return _qaItem; }
            _qaItem = val;
            return osmoseDetails;
          };
        }
 
        function uiOsmoseHeader() {
-         let _qaItem;
+         var _qaItem;
 
          function issueTitle(d) {
-           const unknown = _t('inspector.unknown');
+           var unknown = _t('inspector.unknown');
 
-           if (!d) return unknown;
+           if (!d) { return unknown; }
 
            // Issue titles supplied by Osmose
-           const s = services.osmose.getStrings(d.itemType);
+           var s = services.osmose.getStrings(d.itemType);
            return ('title' in s) ? s.title : unknown;
          }
 
          function osmoseHeader(selection) {
-           const header = selection.selectAll('.qa-header')
+           var header = selection.selectAll('.qa-header')
              .data(
                (_qaItem ? [_qaItem] : []),
-               d => `${d.id}-${d.status || 0}`
+               function (d) { return ((d.id) + "-" + (d.status || 0)); }
              );
 
            header.exit()
              .remove();
 
-           const headerEnter = header.enter()
+           var headerEnter = header.enter()
              .append('div')
                .attr('class', 'qa-header');
 
-           const svgEnter = headerEnter
+           var svgEnter = headerEnter
              .append('div')
                .attr('class', 'qa-header-icon')
-               .classed('new', d => d.id < 0)
+               .classed('new', function (d) { return d.id < 0; })
              .append('svg')
                .attr('width', '20px')
                .attr('height', '30px')
                .attr('viewbox', '0 0 20 30')
-               .attr('class', d => `preset-icon-28 qaItem ${d.service} itemId-${d.id} itemType-${d.itemType}`);
+               .attr('class', function (d) { return ("preset-icon-28 qaItem " + (d.service) + " itemId-" + (d.id) + " itemType-" + (d.itemType)); });
 
            svgEnter
              .append('polygon')
-               .attr('fill', d => services.osmose.getColor(d.item))
+               .attr('fill', function (d) { return services.osmose.getColor(d.item); })
                .attr('class', 'qaItem-fill')
                .attr('points', '16,3 4,3 1,6 1,17 4,20 7,20 10,27 13,20 16,20 19,17.033 19,6');
 
                .attr('width', '13px')
                .attr('height', '13px')
                .attr('transform', 'translate(3.5, 5)')
-               .attr('xlink:href', d => {
-                 const picon = d.icon;
+               .attr('xlink:href', function (d) {
+                 var picon = d.icon;
 
                  if (!picon) {
                    return '';
                  } else {
-                   const isMaki = /^maki-/.test(picon);
-                   return `#${picon}${isMaki ? '-11' : ''}`;
+                   var isMaki = /^maki-/.test(picon);
+                   return ("#" + picon + (isMaki ? '-11' : ''));
                  }
                });
 
          }
 
          osmoseHeader.issue = function(val) {
-           if (!arguments.length) return _qaItem;
+           if (!arguments.length) { return _qaItem; }
            _qaItem = val;
            return osmoseHeader;
          };
        }
 
        function uiViewOnOsmose() {
-         let _qaItem;
+         var _qaItem;
 
          function viewOnOsmose(selection) {
-           let url;
+           var url;
            if (services.osmose && (_qaItem instanceof QAItem)) {
              url = services.osmose.itemURL(_qaItem);
            }
 
-           const link = selection.selectAll('.view-on-osmose')
+           var link = selection.selectAll('.view-on-osmose')
              .data(url ? [url] : []);
 
            // exit
              .remove();
 
            // enter
-           const linkEnter = link.enter()
+           var linkEnter = link.enter()
              .append('a')
                .attr('class', 'view-on-osmose')
                .attr('target', '_blank')
                .attr('rel', 'noopener') // security measure
-               .attr('href', d => d)
+               .attr('href', function (d) { return d; })
                .call(svgIcon('#iD-icon-out-link', 'inline'));
 
            linkEnter
          }
 
          viewOnOsmose.what = function(val) {
-           if (!arguments.length) return _qaItem;
+           if (!arguments.length) { return _qaItem; }
            _qaItem = val;
            return viewOnOsmose;
          };
        }
 
        function uiOsmoseEditor(context) {
-         const dispatch$1 = dispatch('change');
-         const qaDetails = uiOsmoseDetails(context);
-         const qaHeader = uiOsmoseHeader();
+         var dispatch$1 = dispatch('change');
+         var qaDetails = uiOsmoseDetails(context);
+         var qaHeader = uiOsmoseHeader();
 
-         let _qaItem;
+         var _qaItem;
 
          function osmoseEditor(selection) {
 
-           const header = selection.selectAll('.header')
+           var header = selection.selectAll('.header')
              .data([0]);
 
-           const headerEnter = header.enter()
+           var headerEnter = header.enter()
              .append('div')
                .attr('class', 'header fillL');
 
            headerEnter
              .append('button')
                .attr('class', 'close')
-               .on('click', () => context.enter(modeBrowse(context)))
+               .on('click', function () { return context.enter(modeBrowse(context)); })
                .call(svgIcon('#iD-icon-close'));
 
            headerEnter
              .append('h3')
                .text(_t('QA.osmose.title'));
 
-           let body = selection.selectAll('.body')
+           var body = selection.selectAll('.body')
              .data([0]);
 
            body = body.enter()
                .attr('class', 'body')
              .merge(body);
 
-           let editor = body.selectAll('.qa-editor')
+           var editor = body.selectAll('.qa-editor')
              .data([0]);
 
            editor.enter()
                .call(qaDetails.issue(_qaItem))
                .call(osmoseSaveSection);
 
-           const footer = selection.selectAll('.footer')
+           var footer = selection.selectAll('.footer')
              .data([0]);
 
            footer.enter()
          }
 
          function osmoseSaveSection(selection) {
-           const isSelected = (_qaItem && _qaItem.id === context.selectedErrorID());
-           const isShown = (_qaItem && isSelected);
-           let saveSection = selection.selectAll('.qa-save')
+           var isSelected = (_qaItem && _qaItem.id === context.selectedErrorID());
+           var isShown = (_qaItem && isSelected);
+           var saveSection = selection.selectAll('.qa-save')
              .data(
                (isShown ? [_qaItem] : []),
-               d => `${d.id}-${d.status || 0}`
+               function (d) { return ((d.id) + "-" + (d.status || 0)); }
              );
 
            // exit
              .remove();
 
            // enter
-           const saveSectionEnter = saveSection.enter()
+           var saveSectionEnter = saveSection.enter()
              .append('div')
                .attr('class', 'qa-save save-section cf');
 
          }
 
          function qaSaveButtons(selection) {
-           const isSelected = (_qaItem && _qaItem.id === context.selectedErrorID());
-           let buttonSection = selection.selectAll('.buttons')
-             .data((isSelected ? [_qaItem] : []), d => d.status + d.id);
+           var isSelected = (_qaItem && _qaItem.id === context.selectedErrorID());
+           var buttonSection = selection.selectAll('.buttons')
+             .data((isSelected ? [_qaItem] : []), function (d) { return d.status + d.id; });
 
            // exit
            buttonSection.exit()
              .remove();
 
            // enter
-           const buttonEnter = buttonSection.enter()
+           var buttonEnter = buttonSection.enter()
              .append('div')
                .attr('class', 'buttons');
 
              .merge(buttonEnter);
 
            buttonSection.select('.close-button')
-             .text(() => _t('QA.keepRight.close'))
+             .text(function () { return _t('QA.keepRight.close'); })
              .on('click.close', function(d) {
                this.blur();    // avoid keeping focus on the button - #4641
-               const qaService = services.osmose;
+               var qaService = services.osmose;
                if (qaService) {
                  d.newStatus = 'done';
-                 qaService.postUpdate(d, (err, item) => dispatch$1.call('change', item));
+                 qaService.postUpdate(d, function (err, item) { return dispatch$1.call('change', item); });
                }
              });
 
            buttonSection.select('.ignore-button')
-             .text(() => _t('QA.keepRight.ignore'))
+             .text(function () { return _t('QA.keepRight.ignore'); })
              .on('click.ignore', function(d) {
                this.blur();    // avoid keeping focus on the button - #4641
-               const qaService = services.osmose;
+               var qaService = services.osmose;
                if (qaService) {
                  d.newStatus = 'false';
-                 qaService.postUpdate(d, (err, item) => dispatch$1.call('change', item));
+                 qaService.postUpdate(d, function (err, item) { return dispatch$1.call('change', item); });
                }
              });
          }
 
          // NOTE: Don't change method name until UI v3 is merged
          osmoseEditor.error = function(val) {
-           if (!arguments.length) return _qaItem;
+           if (!arguments.length) { return _qaItem; }
            _qaItem = val;
            return osmoseEditor;
          };
                    .on('change', function() {
                        context.map().pan([0,0]);  // trigger a redraw
                        var error = checkSelectedID();
-                       if (!error) return;
+                       if (!error) { return; }
                        context.ui().sidebar
                            .show(errorEditor.error(error));
                    });
                    .on('change', function() {
                        context.map().pan([0,0]);  // trigger a redraw
                        var error = checkSelectedID();
-                       if (!error) return;
+                       if (!error) { return; }
                        context.ui().sidebar
                            .show(errorEditor.error(error));
                    });
                    .on('change', function() {
                        context.map().pan([0,0]);  // trigger a redraw
                        var error = checkSelectedID();
-                       if (!error) return;
+                       if (!error) { return; }
                        context.ui().sidebar
                            .show(errorEditor.error(error));
                    });
 
 
            function checkSelectedID() {
-               if (!errorService) return;
+               if (!errorService) { return; }
                var error = errorService.getError(selectedErrorID);
                if (!error) {
                    context.enter(modeBrowse(context));
 
 
            mode.zoomToSelected = function() {
-               if (!errorService) return;
+               if (!errorService) { return; }
                var error = errorService.getError(selectedErrorID);
                if (error) {
                    context.map().centerZoomEase(error.loc, 20);
 
            mode.enter = function() {
                var error = checkSelectedID();
-               if (!error) return;
+               if (!error) { return; }
 
                behaviors.forEach(context.install);
                keybinding
 
                // class the error as selected, or return to browse mode if the error is gone
                function selectError(drawn) {
-                   if (!checkSelectedID()) return;
+                   if (!checkSelectedID()) { return; }
 
                    var selection = context.surface()
                        .selectAll('.itemId-' + selectedErrorID + '.' + selectedErrorService);
                }
 
                function esc() {
-                   if (context.container().select('.combobox').size()) return;
+                   if (context.container().select('.combobox').size()) { return; }
                    context.enter(modeBrowse(context));
                }
            };
                if (event.keyCode === 32) {
                    // don't react to spacebar events during text input
                    var activeNode = document.activeElement;
-                   if (activeNode && new Set(['INPUT', 'TEXTAREA']).has(activeNode.nodeName)) return;
+                   if (activeNode && new Set(['INPUT', 'TEXTAREA']).has(activeNode.nodeName)) { return; }
                }
 
                if (event.keyCode === 93 ||  // context menu key
                    event.preventDefault();
                }
 
-               if (event.repeat) return; // ignore repeated events for held keys
+               if (event.repeat) { return; } // ignore repeated events for held keys
 
                // if any key is pressed the user is probably doing something other than long-pressing
                cancelLongPress();
                    if (pointer) {
                        delete _downPointers.spacebar;
 
-                       if (pointer.done) return;
+                       if (pointer.done) { return; }
 
                        event.preventDefault();
                        _lastInteractionType = 'spacebar';
 
                cancelLongPress();
 
-               if (event.buttons && event.buttons !== 1) return;
+               if (event.buttons && event.buttons !== 1) { return; }
 
                context.ui().closeEditMenu();
 
 
            function didLongPress(id, interactionType) {
                var pointer = _downPointers[id];
-               if (!pointer) return;
+               if (!pointer) { return; }
 
                for (var i in _downPointers) {
                    // don't allow this or any currently down pointer to trigger another click
            function pointerup() {
                var id = (event.pointerId || 'mouse').toString();
                var pointer = _downPointers[id];
-               if (!pointer) return;
+               if (!pointer) { return; }
 
                delete _downPointers[id];
 
                    _multiselectionPointerId = null;
                }
 
-               if (pointer.done) return;
+               if (pointer.done) { return; }
 
                click(pointer.firstEvent, event, id);
            }
 
            function pointercancel() {
                var id = (event.pointerId || 'mouse').toString();
-               if (!_downPointers[id]) return;
+               if (!_downPointers[id]) { return; }
 
                delete _downPointers[id];
 
                    var mode = context.mode();
                    var selectedIDs = mode.id === 'select' ? mode.selectedIDs() : [];
                    for (var pointerId in _downPointers) {
-                       if (pointerId === 'spacebar' || pointerId === skipPointerId) continue;
+                       if (pointerId === 'spacebar' || pointerId === skipPointerId) { continue; }
 
                        var pointerInfo = _downPointers[pointerId];
 
                        var p1 = pointGetter(pointerInfo.firstEvent);
                        var p2 = pointGetter(pointerInfo.lastEvent);
-                       if (geoVecLength(p1, p2) > _tolerancePx) continue;
+                       if (geoVecLength(p1, p2) > _tolerancePx) { continue; }
 
                        var datum = pointerInfo.firstEvent.target.__data__;
                        var entity = (datum && datum.properties && datum.properties.entity) || datum;
-                       if (context.graph().hasEntity(entity.id)) return {
+                       if (context.graph().hasEntity(entity.id)) return {
                            pointerId: pointerId,
                            entityId: entity.id,
                            selected: selectedIDs.indexOf(entity.id) !== -1
-                       };
+                       }; }
                    }
                    return null;
                }
                var interactionType = _lastInteractionType;
 
                var entity = datum && datum.properties && datum.properties.entity;
-               if (entity) datum = entity;
+               if (entity) { datum = entity; }
 
                if (datum && datum.type === 'midpoint') {
                    // treat targeting midpoints as if targeting the parent way
                            selectedIDs.length <= 1 ||
                            selectedIDs.indexOf(datum.id) === -1) {
 
-                           if (alsoSelectId === datum.id) alsoSelectId = null;
+                           if (alsoSelectId === datum.id) { alsoSelectId = null; }
 
                            selectedIDs = (alsoSelectId ? [alsoSelectId] : []).concat([datum.id]);
                            // always enter modeSelect even if the entity is already
                context.ui().closeEditMenu();
 
                // always request to show the edit menu in case the mode needs it
-               if (showMenu) context.ui().showEditMenu(point, interactionType);
+               if (showMenu) { context.ui().showEditMenu(point, interactionType); }
 
                resetProperties();
            }
 
 
            function cancelLongPress() {
-               if (_longPressTimeout) window.clearTimeout(_longPressTimeout);
+               if (_longPressTimeout) { window.clearTimeout(_longPressTimeout); }
                _longPressTimeout = null;
            }
 
 
                var loc = context.map().mouseCoordinates();
 
-               if (!_drawNode) createDrawNode(loc);
+               if (!_drawNode) { createDrawNode(loc); }
 
                context.surface().classed('nope-disabled', event.altKey);
 
                } else { // discount the draw node
 
                    if (parentWay.isClosed()) {
-                       if (nodes.length < 3) return false;
-                       if (_drawNode) nodes.splice(-2, 1);
+                       if (nodes.length < 3) { return false; }
+                       if (_drawNode) { nodes.splice(-2, 1); }
                        testNode = nodes[nodes.length - 2];
                    } else {
                        // there's nothing we need to test if we ignore the draw node on open ways
 
 
            function setActiveElements() {
-               if (!_drawNode) return;
+               if (!_drawNode) { return; }
 
                context.surface().selectAll('.' + _drawNode.id)
                    .classed('active', true);
                        move.apply(this, arguments);
                    })
                    .on('downcancel', function() {
-                       if (_drawNode) removeDrawNode();
+                       if (_drawNode) { removeDrawNode(); }
                    })
                    .on('click', drawWay.add)
                    .on('clickWay', drawWay.addWay)
 
 
            drawWay.nodeIndex = function(val) {
-               if (!arguments.length) return _nodeIndex;
+               if (!arguments.length) { return _nodeIndex; }
                _nodeIndex = val;
                return drawWay;
            };
 
 
            drawWay.activeID = function() {
-               if (!arguments.length) return _drawNode && _drawNode.id;
+               if (!arguments.length) { return _drawNode && _drawNode.id; }
                // no assign
                return drawWay;
            };
                            if (way.nodes.indexOf(node.id) !== -1) {
                                count += 1;
                            }
-                           if (count > 1) break;
+                           if (count > 1) { break; }
                        }
 
                        if (count > 1) {
 
 
            operation.available = function() {
-               if (_actions.length === 0) return false;
-               if (_otherIDs.length !== 0) return false;
+               if (_actions.length === 0) { return false; }
+               if (_otherIDs.length !== 0) { return false; }
 
                if (_vertexIDs.length !== 0 && _wayIDs.length !== 0 && !_wayIDs.every(function(wayID) {
                    return _vertexIDs.some(function(vertexID) {
                        var way = context.entity(wayID);
                        return way.nodes.indexOf(vertexID) !== -1;
                    });
-               })) return false;
+               })) { return false; }
 
                return true;
            };
                var reason;
                for (var actionIndex in _actions) {
                    reason = _actions[actionIndex].disabled(context.graph());
-                   if (reason) return reason;
+                   if (reason) { return reason; }
                }
 
                if (_extent && _extent.percentContainedIn(context.map().extent()) < 0.8) {
 
 
                function someMissing() {
-                   if (context.inIntro()) return false;
+                   if (context.inIntro()) { return false; }
                    var osm = context.connection();
                    if (osm) {
                        var missing = _coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
                var entity = graph.entity(entityID);
                var preset = _mainPresetIndex.match(entity, graph);
 
-               if (!preset || preset.isFallback()) return null;
+               if (!preset || preset.isFallback()) { return null; }
 
                if (entity.type === 'node' &&
                    preset.id !== 'address' &&
                    for (var i in selectedIDs) {
                        var entityID = selectedIDs[i];
                        var type = downgradeTypeForEntityID(entityID);
-                       if (!type) continue;
+                       if (!type) { continue; }
 
                        var tags = Object.assign({}, graph.entity(entityID).tags);  // shallow copy
                        for (var key in tags) {
-                           if (type === 'address' && addressKeysToKeep.indexOf(key) !== -1) continue;
+                           if (type === 'address' && addressKeysToKeep.indexOf(key) !== -1) { continue; }
                            if (type === 'building') {
                                if (buildingKeysToKeep.indexOf(key) !== -1 ||
                                    key.match(/^building:.{1,}/) ||
-                                   key.match(/^roof:.{1,}/)) continue;
+                                   key.match(/^roof:.{1,}/)) { continue; }
                            }
                            // keep address tags for buildings too
-                           if (key.match(/^addr:.{1,}/)) continue;
+                           if (key.match(/^addr:.{1,}/)) { continue; }
 
                            delete tags[key];
                        }
            var _actions = selectedIDs.map(function(entityID) {
                var graph = context.graph();
                var entity = graph.hasEntity(entityID);
-               if (!entity || !entity.hasInterestingTags()) return;
+               if (!entity || !entity.hasInterestingTags()) { return; }
 
-               if (entity.type === 'node' && graph.parentWays(entity).length === 0) return;
+               if (entity.type === 'node' && graph.parentWays(entity).length === 0) { return; }
 
                if (entity.type !== 'node') {
                    var preset = _mainPresetIndex.match(entity, graph);
                    // only allow extraction from ways/relations if the preset supports points
-                   if (preset.geometry.indexOf('point') === -1) return;
+                   if (preset.geometry.indexOf('point') === -1) { return; }
                }
 
                _extent = _extent ? _extent.extend(entity.extent(graph)) : entity.extent(graph);
            function getAction() {
                // prefer a non-disabled action first
                var join = actionJoin(selectedIDs);
-               if (!join.disabled(context.graph())) return join;
+               if (!join.disabled(context.graph())) { return join; }
 
                var merge = actionMerge(selectedIDs);
-               if (!merge.disabled(context.graph())) return merge;
+               if (!merge.disabled(context.graph())) { return merge; }
 
                var mergePolygon = actionMergePolygon(selectedIDs);
-               if (!mergePolygon.disabled(context.graph())) return mergePolygon;
+               if (!mergePolygon.disabled(context.graph())) { return mergePolygon; }
 
                var mergeNodes = actionMergeNodes(selectedIDs);
-               if (!mergeNodes.disabled(context.graph())) return mergeNodes;
+               if (!mergeNodes.disabled(context.graph())) { return mergeNodes; }
 
                // otherwise prefer an action with an interesting disabled reason
-               if (join.disabled(context.graph()) !== 'not_eligible') return join;
-               if (merge.disabled(context.graph()) !== 'not_eligible') return merge;
-               if (mergePolygon.disabled(context.graph()) !== 'not_eligible') return mergePolygon;
+               if (join.disabled(context.graph()) !== 'not_eligible') { return join; }
+               if (merge.disabled(context.graph()) !== 'not_eligible') { return merge; }
+               if (mergePolygon.disabled(context.graph()) !== 'not_eligible') { return mergePolygon; }
 
                return mergeNodes;
            }
 
            var operation = function() {
 
-               if (operation.disabled()) return;
+               if (operation.disabled()) { return; }
 
                context.perform(_action, operation.annotation());
 
                    var interestingIDs = resultIDs.filter(function(id) {
                        return context.entity(id).hasInterestingTags();
                    });
-                   if (interestingIDs.length) resultIDs = interestingIDs;
+                   if (interestingIDs.length) { resultIDs = interestingIDs; }
                }
                context.enter(modeSelect(context, resultIDs));
            };
 
            operation.disabled = function() {
                var actionDisabled = _action.disabled(context.graph());
-               if (actionDisabled) return actionDisabled;
+               if (actionDisabled) { return actionDisabled; }
 
                var osm = context.connection();
                if (osm &&
 
            var operation = function() {
 
-               if (!_pastePoint) return;
+               if (!_pastePoint) { return; }
 
                var oldIDs = context.copyIDs();
-               if (!oldIDs.length) return;
+               if (!oldIDs.length) { return; }
 
                var projection = context.projection;
                var extent = geoExtent();
            function actions(situation) {
                return selectedIDs.map(function(entityID) {
                    var entity = context.hasEntity(entityID);
-                   if (!entity) return;
+                   if (!entity) { return; }
 
                    if (situation === 'toolbar') {
                        if (entity.type === 'way' &&
-                           (!entity.isOneWay() && !entity.isSided())) return;
+                           (!entity.isOneWay() && !entity.isSided())) { return; }
                    }
 
                    var geometry = entity.geometry(context.graph());
-                   if (entity.type !== 'node' && geometry !== 'line') return;
+                   if (entity.type !== 'node' && geometry !== 'line') { return; }
 
                    var action = actionReverse(entityID);
-                   if (action.disabled(context.graph())) return;
+                   if (action.disabled(context.graph())) { return; }
 
                    return action;
                }).filter(Boolean);
                    return entity && entity.type === 'node';
                }).length;
                var typeID = nodeActionCount === 0 ? 'line' : (nodeActionCount === acts.length ? 'point' : 'features');
-               if (typeID !== 'features' && acts.length > 1) typeID += 's';
+               if (typeID !== 'features' && acts.length > 1) { typeID += 's'; }
                return typeID;
            }
 
 
                    // Ensure all ways are connected (i.e. only 2 unique endpoints/startpoints)
                    if (utilArrayDifference(startNodeIDs, endNodeIDs).length +
-                       utilArrayDifference(endNodeIDs, startNodeIDs).length !== 2) return null;
+                       utilArrayDifference(endNodeIDs, startNodeIDs).length !== 2) { return null; }
 
                    // Ensure path contains at least 3 unique nodes
                    var wayNodeIDs = utilGetAllNodes(_wayIDs, context.graph())
                        .map(function(node) { return node.id; });
-                   if (wayNodeIDs.length <= 2) return null;
+                   if (wayNodeIDs.length <= 2) { return null; }
 
                    // If range of 2 selected nodes is supplied, ensure nodes lie on the selected path
                    if (_nodeIDs.length === 2 && (
                        wayNodeIDs.indexOf(_nodeIDs[0]) === -1 || wayNodeIDs.indexOf(_nodeIDs[1]) === -1
-                   )) return null;
+                   )) { return null; }
 
                    if (_nodeIDs.length) {
                        // If we're only straightenting between two points, we only need that extent visible
 
 
            function operation() {
-               if (!_action) return;
+               if (!_action) { return; }
 
                context.perform(_action, operation.annotation());
 
 
 
                function someMissing() {
-                   if (context.inIntro()) return false;
+                   if (context.inIntro()) { return false; }
                    var osm = context.connection();
                    if (osm) {
                        var missing = _coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
 
 
            mode.selectedIDs = function(val) {
-               if (!arguments.length) return selectedIDs;
+               if (!arguments.length) { return selectedIDs; }
                selectedIDs = val;
                return mode;
            };
 
 
            mode.newFeature = function(val) {
-               if (!arguments.length) return _newFeature;
+               if (!arguments.length) { return _newFeature; }
                _newFeature = val;
                return mode;
            };
 
 
            mode.selectBehavior = function(val) {
-               if (!arguments.length) return _selectBehavior;
+               if (!arguments.length) { return _selectBehavior; }
                _selectBehavior = val;
                return mode;
            };
 
 
            mode.follow = function(val) {
-               if (!arguments.length) return _follow;
+               if (!arguments.length) { return _follow; }
                _follow = val;
                return mode;
            };
 
 
            mode.enter = function() {
-               if (!checkSelectedIDs()) return;
+               if (!checkSelectedIDs()) { return; }
 
                context.features().forceVisible(selectedIDs);
 
                loadOperations();
 
                if (!_behaviors.length) {
-                   if (!_selectBehavior) _selectBehavior = behaviorSelect(context);
+                   if (!_selectBehavior) { _selectBehavior = behaviorSelect(context); }
 
                    _behaviors = [
                        behaviorPaste(context),
 
                    var loc = extent.center();
                    context.map().centerEase(loc);
+                   // we could enter the mode multiple times, so reset follow for next time
+                   _follow = false;
                }
 
 
                function nudgeSelection(delta) {
                    return function() {
                        // prevent nudging during low zoom selection
-                       if (!context.map().withinEditableZoom()) return;
+                       if (!context.map().withinEditableZoom()) { return; }
 
                        var moveOp = operationMove(context, selectedIDs);
                        if (moveOp.disabled()) {
 
 
                function didDoubleUp(loc) {
-                   if (!context.map().withinEditableZoom()) return;
+                   if (!context.map().withinEditableZoom()) { return; }
 
                    var target = select(event.target);
 
                    var datum = target.datum();
                    var entity = datum && datum.properties && datum.properties.entity;
-                   if (!entity) return;
+                   if (!entity) { return; }
 
                    if (entity instanceof osmWay && target.classed('target')) {
                        var choice = geoChooseEdge(context.graph().childNodes(entity), loc, context.projection);
 
 
                function selectElements() {
-                   if (!checkSelectedIDs()) return;
+                   if (!checkSelectedIDs()) { return; }
 
                    var surface = context.surface();
 
 
 
                function esc() {
-                   if (context.container().select('.combobox').size()) return;
+                   if (context.container().select('.combobox').size()) { return; }
                    context.enter(modeBrowse(context));
                }
 
                function previousVertex() {
                    event.preventDefault();
                    var parent = singularParent();
-                   if (!parent) return;
+                   if (!parent) { return; }
 
                    var way = context.entity(parent);
                    var length = way.nodes.length;
                function nextVertex() {
                    event.preventDefault();
                    var parent = singularParent();
-                   if (!parent) return;
+                   if (!parent) { return; }
 
                    var way = context.entity(parent);
                    var length = way.nodes.length;
                function nextParent() {
                    event.preventDefault();
                    var parents = commonParents();
-                   if (!parents || parents.length < 2) return;
+                   if (!parents || parents.length < 2) { return; }
 
                    var index = parents.indexOf(_relatedParent);
                    if (index < 0 || index > parents.length - 2) {
 
 
            lasso.p = function(_) {
-               if (!arguments.length) return lasso;
+               if (!arguments.length) { return lasso; }
                lasso.coordinates.push(_);
                draw();
                return lasso;
 
 
                function lassoed() {
-                   if (!lasso) return [];
+                   if (!lasso) { return []; }
 
                    var graph = context.graph();
                    var limitToNodes;
                        .on(_pointerPrefix + 'move.lasso', null)
                        .on(_pointerPrefix + 'up.lasso', null);
 
-                   if (!lasso) return;
+                   if (!lasso) { return; }
 
                    var ids = lassoed();
                    lasso.close();
 
 
            mode.selectBehavior = function(val) {
-               if (!arguments.length) return _selectBehavior;
+               if (!arguments.length) { return _selectBehavior; }
                _selectBehavior = val;
                return mode;
            };
 
            mode.enter = function() {
                if (!_behaviors.length) {
-                   if (!_selectBehavior) _selectBehavior = behaviorSelect(context);
+                   if (!_selectBehavior) { _selectBehavior = behaviorSelect(context); }
                    _behaviors = [
                        behaviorPaste(context),
                        behaviorHover(context).on('hover', context.ui().sidebar.hover),
 
 
            mode.sidebar = function(_) {
-               if (!arguments.length) return sidebar;
+               if (!arguments.length) { return sidebar; }
                sidebar = _;
                return mode;
            };
            }
 
            function updateTitle(includeChangeCount) {
-               if (!context.setsDocumentTitle()) return;
+               if (!context.setsDocumentTitle()) { return; }
 
                var newTitle = computedTitle(includeChangeCount);
                if (document.title !== newTitle) {
            }
 
            function updateHashIfNeeded() {
-               if (context.inIntro()) return;
+               if (context.inIntro()) { return; }
 
                var latestHash = computedHash();
                if (_cachedHash !== latestHash) {
            function hashchange() {
 
                // ignore spurious hashchange events
-               if (window.location.hash === _cachedHash) return;
+               if (window.location.hash === _cachedHash) { return; }
 
                _cachedHash = window.location.hash;
 
 
                } else {
                    // don't update if the new hash already reflects the state of iD
-                   if (_cachedHash === computedHash()) return;
+                   if (_cachedHash === computedHash()) { return; }
 
                    var mode = context.mode();
 
                var h = head.entities[id];
                var b = base.entities[id];
 
-               if (h === b) return;
-               if (_changes[id]) return;
+               if (h === b) { return; }
+               if (_changes[id]) { return; }
 
                if (!h && b) {
                    _changes[id] = { base: b, head: h };
                    if (extent &&
                        (!h || !h.intersects(extent, head)) &&
                        (!b || !b.intersects(extent, base)))
-                       continue;
+                       { continue; }
 
                    result[id] = h;
 
                        var ids = utilArrayUnion(mh, mb);
                        for (i = 0; i < ids.length; i++) {
                            var member = head.hasEntity(ids[i]);
-                           if (!member) continue;   // not downloaded
-                           if (extent && !member.intersects(extent, head)) continue;   // not visible
+                           if (!member) { continue; }   // not downloaded
+                           if (extent && !member.intersects(extent, head)) { continue; }   // not visible
                            result[ids[i]] = member;
                        }
                    }
                function addParents(parents, result) {
                    for (var i = 0; i < parents.length; i++) {
                        var parent = parents[i];
-                       if (parent.id in result) continue;
+                       if (parent.id in result) { continue; }
 
                        result[parent.id] = parent;
                        addParents(head.parentRelations(parent), result);
            function segmentBBox(segment) {
                var extent = segment.extent(head);
                // extent can be null if the node entites aren't in the graph for some reason
-               if (!extent) return null;
+               if (!extent) { return null; }
 
                var bbox = extent.bbox();
                bbox.segment = segment;
                        segments = segments.concat(entitySegments);
                    }
                });
-               if (segments.length) _segmentsRTree.load(segments.map(segmentBBox).filter(Boolean));
+               if (segments.length) { _segmentsRTree.load(segments.map(segmentBBox).filter(Boolean)); }
            }
 
 
                });
 
                head.parentRelations(entity).forEach(function(relation) {
-                   if (memo[entity.id]) return;
+                   if (memo[entity.id]) { return; }
                    memo[entity.id] = true;
                    if (_bboxes[relation.id]) {
                        removeEntity(relation);
 
                for (var i = 0; i < entities.length; i++) {
                    var entity = entities[i];
-                   if (!entity.visible) continue;
+                   if (!entity.visible) { continue; }
 
                    if (head.entities.hasOwnProperty(entity.id) || _bboxes[entity.id]) {
                        if (!force) {
 
 
            function updateToGraph(graph) {
-               if (graph === head) return;
+               if (graph === head) { return; }
 
                var diff = coreDifference(head, graph);
 
                head = graph;
 
                var changed = diff.didChange;
-               if (!changed.addition && !changed.deletion && !changed.geometry) return;
+               if (!changed.addition && !changed.deletion && !changed.geometry) { return; }
 
                var insertions = {};
 
        }
 
        function uiModal(selection, blocking) {
-         let keybinding = utilKeybinding('modal');
-         let previous = selection.select('div.modal');
-         let animate = previous.empty();
+         var this$1 = this;
+
+         var keybinding = utilKeybinding('modal');
+         var previous = selection.select('div.modal');
+         var animate = previous.empty();
 
          previous.transition()
            .duration(200)
            .style('opacity', 0)
            .remove();
 
-         let shaded = selection
+         var shaded = selection
            .append('div')
            .attr('class', 'shaded')
            .style('opacity', 0);
 
-         shaded.close = () => {
+         shaded.close = function () {
            shaded
              .transition()
              .duration(200)
          };
 
 
-         let modal = shaded
+         var modal = shaded
            .append('div')
            .attr('class', 'modal fillL');
 
          if (!blocking) {
-           shaded.on('click.remove-modal', () => {
-             if (event.target === this) {
+           shaded.on('click.remove-modal', function () {
+             if (event.target === this$1) {
                shaded.close();
              }
            });
        }
 
        function uiLoading(context) {
-         let _modalSelection = select(null);
-         let _message = '';
-         let _blocking = false;
+         var _modalSelection = select(null);
+         var _message = '';
+         var _blocking = false;
 
 
-         let loading = (selection) => {
+         var loading = function (selection) {
            _modalSelection = uiModal(selection, _blocking);
 
-           let loadertext = _modalSelection.select('.content')
+           var loadertext = _modalSelection.select('.content')
              .classed('loading-modal', true)
              .append('div')
              .attr('class', 'modal-section fillL');
 
 
          loading.message = function(val) {
-           if (!arguments.length) return _message;
+           if (!arguments.length) { return _message; }
            _message = val;
            return loading;
          };
 
 
          loading.blocking = function(val) {
-           if (!arguments.length) return _blocking;
+           if (!arguments.length) { return _blocking; }
            _blocking = val;
            return loading;
          };
 
 
-         loading.close = () => {
+         loading.close = function () {
            _modalSelection.remove();
          };
 
 
-         loading.isShown = () => {
+         loading.isShown = function () {
            return _modalSelection && !_modalSelection.empty() && _modalSelection.node().parentNode;
          };
 
                            .ease(linear$1)
                            .tween('history.tween', function() {
                                return function(t) {
-                                   if (t < 1) _overwrite([action0], t);
+                                   if (t < 1) { _overwrite([action0], t); }
                                };
                            })
                            .on('start', function() {
                    var previous = previousStack.graph;
                    while (_index > 0) {
                        _index--;
-                       if (_stack[_index].annotation) break;
+                       if (_stack[_index].annotation) { break; }
                    }
 
                    dispatch$1.call('undone', this, _stack[_index], previousStack);
                undoAnnotation: function() {
                    var i = _index;
                    while (i >= 0) {
-                       if (_stack[i].annotation) return _stack[i].annotation;
+                       if (_stack[i].annotation) { return _stack[i].annotation; }
                        i--;
                    }
                },
                redoAnnotation: function() {
                    var i = _index + 1;
                    while (i <= _stack.length - 1) {
-                       if (_stack[i].annotation) return _stack[i].annotation;
+                       if (_stack[i].annotation) { return _stack[i].annotation; }
                        i++;
                    }
                },
 
 
                toJSON: function() {
-                   if (!this.hasChanges()) return;
+                   if (!this.hasChanges()) { return; }
 
                    var allEntities = {};
                    var baseEntities = {};
 
                        var x = {};
 
-                       if (modified.length) x.modified = modified;
-                       if (deleted.length) x.deleted = deleted;
-                       if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
-                       if (i.photoOverlaysUsed) x.photoOverlaysUsed = i.photoOverlaysUsed;
-                       if (i.annotation) x.annotation = i.annotation;
-                       if (i.transform) x.transform = i.transform;
-                       if (i.selectedIDs) x.selectedIDs = i.selectedIDs;
+                       if (modified.length) { x.modified = modified; }
+                       if (deleted.length) { x.deleted = deleted; }
+                       if (i.imageryUsed) { x.imageryUsed = i.imageryUsed; }
+                       if (i.photoOverlaysUsed) { x.photoOverlaysUsed = i.photoOverlaysUsed; }
+                       if (i.annotation) { x.annotation = i.annotation; }
+                       if (i.transform) { x.transform = i.transform; }
+                       if (i.selectedIDs) { x.selectedIDs = i.selectedIDs; }
 
                        return x;
                    });
                    if (lock.locked()) {
                        _hasUnresolvedRestorableChanges = false;
                        var json = this.savedHistoryJSON();
-                       if (json) history.fromJSON(json, true);
+                       if (json) { history.fromJSON(json, true); }
                    }
                },
 
         * Look for roads that can be connected to other roads with a short extension
         */
        function validationAlmostJunction(context) {
-         const type = 'almost_junction';
-         const EXTEND_TH_METERS = 5;
-         const WELD_TH_METERS = 0.75;
+         var type = 'almost_junction';
+         var EXTEND_TH_METERS = 5;
+         var WELD_TH_METERS = 0.75;
          // Comes from considering bounding case of parallel ways
-         const CLOSE_NODE_TH = EXTEND_TH_METERS - WELD_TH_METERS;
+         var CLOSE_NODE_TH = EXTEND_TH_METERS - WELD_TH_METERS;
          // Comes from considering bounding case of perpendicular ways
-         const SIG_ANGLE_TH = Math.atan(WELD_TH_METERS / EXTEND_TH_METERS);
+         var SIG_ANGLE_TH = Math.atan(WELD_TH_METERS / EXTEND_TH_METERS);
 
          function isHighway(entity) {
            return entity.type === 'way'
          }
 
 
-         const validation = function checkAlmostJunction(entity, graph) {
-           if (!isHighway(entity)) return [];
-           if (entity.isDegenerate()) return [];
+         var validation = function checkAlmostJunction(entity, graph) {
+           if (!isHighway(entity)) { return []; }
+           if (entity.isDegenerate()) { return []; }
 
-           const tree = context.history().tree();
-           const extendableNodeInfos = findConnectableEndNodesByExtension(entity);
+           var tree = context.history().tree();
+           var extendableNodeInfos = findConnectableEndNodesByExtension(entity);
 
-           let issues = [];
+           var issues = [];
 
-           extendableNodeInfos.forEach(extendableNodeInfo => {
+           extendableNodeInfos.forEach(function (extendableNodeInfo) {
              issues.push(new validationIssue({
-               type,
+               type: type,
                subtype: 'highway-highway',
                severity: 'warning',
-               message(context) {
-                 const entity1 = context.hasEntity(this.entityIds[0]);
+               message: function message(context) {
+                 var entity1 = context.hasEntity(this.entityIds[0]);
                  if (this.entityIds[0] === this.entityIds[2]) {
                    return entity1 ? _t('issues.almost_junction.self.message', {
                      feature: utilDisplayLabel(entity1, context.graph())
                    }) : '';
                  } else {
-                   const entity2 = context.hasEntity(this.entityIds[2]);
+                   var entity2 = context.hasEntity(this.entityIds[2]);
                    return (entity1 && entity2) ? _t('issues.almost_junction.message', {
                      feature: utilDisplayLabel(entity1, context.graph()),
                      feature2: utilDisplayLabel(entity2, context.graph())
                entityIds: [
                  entity.id,
                  extendableNodeInfo.node.id,
-                 extendableNodeInfo.wid,
-               ],
+                 extendableNodeInfo.wid ],
                loc: extendableNodeInfo.node.loc,
                hash: JSON.stringify(extendableNodeInfo.node.loc),
                data: {
            return issues;
 
            function makeFixes(context) {
-             let fixes = [new validationIssueFix({
+             var fixes = [new validationIssueFix({
                icon: 'iD-icon-abutment',
                title: _t('issues.fix.connect_features.title'),
-               onClick(context) {
-                 const annotation = _t('issues.fix.connect_almost_junction.annotation');
-                 const [, endNodeId, crossWayId] = this.issue.entityIds;
-                 const midNode = context.entity(this.issue.data.midId);
-                 const endNode = context.entity(endNodeId);
-                 const crossWay = context.entity(crossWayId);
+               onClick: function onClick(context) {
+                 var annotation = _t('issues.fix.connect_almost_junction.annotation');
+                 var ref = this.issue.entityIds;
+                 var endNodeId = ref[1];
+                 var crossWayId = ref[2];
+                 var midNode = context.entity(this.issue.data.midId);
+                 var endNode = context.entity(endNodeId);
+                 var crossWay = context.entity(crossWayId);
 
                  // When endpoints are close, just join if resulting small change in angle (#7201)
-                 const nearEndNodes = findNearbyEndNodes(endNode, crossWay);
+                 var nearEndNodes = findNearbyEndNodes(endNode, crossWay);
                  if (nearEndNodes.length > 0) {
-                   const collinear = findSmallJoinAngle(midNode, endNode, nearEndNodes);
+                   var collinear = findSmallJoinAngle(midNode, endNode, nearEndNodes);
                    if (collinear) {
                      context.perform(
                        actionMergeNodes([collinear.id, endNode.id], collinear.loc),
                    }
                  }
 
-                 const targetEdge = this.issue.data.edge;
-                 const crossLoc = this.issue.data.cross_loc;
-                 const edgeNodes = [context.entity(targetEdge[0]), context.entity(targetEdge[1])];
-                 const closestNodeInfo = geoSphericalClosestNode(edgeNodes, crossLoc);
+                 var targetEdge = this.issue.data.edge;
+                 var crossLoc = this.issue.data.cross_loc;
+                 var edgeNodes = [context.entity(targetEdge[0]), context.entity(targetEdge[1])];
+                 var closestNodeInfo = geoSphericalClosestNode(edgeNodes, crossLoc);
 
                  // already a point nearby, just connect to that
                  if (closestNodeInfo.distance < WELD_TH_METERS) {
                }
              })];
 
-             const node = context.hasEntity(this.entityIds[1]);
+             var node = context.hasEntity(this.entityIds[1]);
              if (node && !node.hasInterestingTags()) {
                // node has no descriptive tags, suggest noexit fix
                fixes.push(new validationIssueFix({
                  icon: 'maki-barrier',
                  title: _t('issues.fix.tag_as_disconnected.title'),
-                 onClick(context) {
-                   const nodeID = this.issue.entityIds[1];
-                   const tags = Object.assign({}, context.entity(nodeID).tags);
+                 onClick: function onClick(context) {
+                   var nodeID = this.issue.entityIds[1];
+                   var tags = Object.assign({}, context.entity(nodeID).tags);
                    tags.noexit = 'yes';
                    context.perform(
                      actionChangeTags(nodeID, tags),
 
            function isExtendableCandidate(node, way) {
              // can not accurately test vertices on tiles not downloaded from osm - #5938
-             const osm = services.osm;
+             var osm = services.osm;
              if (osm && !osm.isDataLoaded(node.loc)) {
                return false;
              }
                return false;
              }
 
-             let occurences = 0;
-             for (const index in way.nodes) {
+             var occurences = 0;
+             for (var index in way.nodes) {
                if (way.nodes[index] === node.id) {
                  occurences += 1;
                  if (occurences > 1) {
            }
 
            function findConnectableEndNodesByExtension(way) {
-             let results = [];
-             if (way.isClosed()) return results;
+             var results = [];
+             if (way.isClosed()) { return results; }
 
-             let testNodes;
-             const indices = [0, way.nodes.length - 1];
-             indices.forEach(nodeIndex => {
-               const nodeID = way.nodes[nodeIndex];
-               const node = graph.entity(nodeID);
+             var testNodes;
+             var indices = [0, way.nodes.length - 1];
+             indices.forEach(function (nodeIndex) {
+               var nodeID = way.nodes[nodeIndex];
+               var node = graph.entity(nodeID);
 
-               if (!isExtendableCandidate(node, way)) return;
+               if (!isExtendableCandidate(node, way)) { return; }
 
-               const connectionInfo = canConnectByExtend(way, nodeIndex);
-               if (!connectionInfo) return;
+               var connectionInfo = canConnectByExtend(way, nodeIndex);
+               if (!connectionInfo) { return; }
 
                testNodes = graph.childNodes(way).slice();   // shallow copy
                testNodes[nodeIndex] = testNodes[nodeIndex].move(connectionInfo.cross_loc);
 
                // don't flag issue if connecting the ways would cause self-intersection
-               if (geoHasSelfIntersections(testNodes, nodeID)) return;
+               if (geoHasSelfIntersections(testNodes, nodeID)) { return; }
 
                results.push(connectionInfo);
              });
              return [
                way.nodes[0],
                way.nodes[way.nodes.length - 1]
-             ].map(d => graph.entity(d))
-             .filter(d => {
+             ].map(function (d) { return graph.entity(d); })
+             .filter(function (d) {
                // Node cannot be near to itself, but other endnode of same way could be
                return d.id !== node.id
                  && geoSphericalDistance(node.loc, d.loc) <= CLOSE_NODE_TH;
 
            function findSmallJoinAngle(midNode, tipNode, endNodes) {
              // Both nodes could be close, so want to join whichever is closest to collinear
-             let joinTo;
-             let minAngle = Infinity;
+             var joinTo;
+             var minAngle = Infinity;
 
              // Checks midNode -> tipNode -> endNode for collinearity
-             endNodes.forEach(endNode => {
-               const a1 = geoAngle(midNode, tipNode, context.projection) + Math.PI;
-               const a2 = geoAngle(midNode, endNode, context.projection) + Math.PI;
-               const diff = Math.max(a1, a2) - Math.min(a1, a2);
+             endNodes.forEach(function (endNode) {
+               var a1 = geoAngle(midNode, tipNode, context.projection) + Math.PI;
+               var a2 = geoAngle(midNode, endNode, context.projection) + Math.PI;
+               var diff = Math.max(a1, a2) - Math.min(a1, a2);
 
                if (diff < minAngle) {
                  joinTo = endNode;
 
              /* Threshold set by considering right angle triangle
              based on node joining threshold and extension distance */
-             if (minAngle <= SIG_ANGLE_TH) return joinTo;
+             if (minAngle <= SIG_ANGLE_TH) { return joinTo; }
 
              return null;
            }
            function canConnectWays(way, way2) {
 
              // allow self-connections
-             if (way.id === way2.id) return true;
+             if (way.id === way2.id) { return true; }
 
              // if one is bridge or tunnel, both must be bridge or tunnel
              if ((hasTag(way.tags, 'bridge') || hasTag(way2.tags, 'bridge')) &&
-               !(hasTag(way.tags, 'bridge') && hasTag(way2.tags, 'bridge'))) return false;
+               !(hasTag(way.tags, 'bridge') && hasTag(way2.tags, 'bridge'))) { return false; }
              if ((hasTag(way.tags, 'tunnel') || hasTag(way2.tags, 'tunnel')) &&
-               !(hasTag(way.tags, 'tunnel') && hasTag(way2.tags, 'tunnel'))) return false;
+               !(hasTag(way.tags, 'tunnel') && hasTag(way2.tags, 'tunnel'))) { return false; }
 
              // must have equivalent layers and levels
-             const layer1 = way.tags.layer || '0',
+             var layer1 = way.tags.layer || '0',
                layer2 = way2.tags.layer || '0';
-             if (layer1 !== layer2) return false;
+             if (layer1 !== layer2) { return false; }
 
-             const level1 = way.tags.level || '0',
+             var level1 = way.tags.level || '0',
                level2 = way2.tags.level || '0';
-             if (level1 !== level2) return false;
+             if (level1 !== level2) { return false; }
 
              return true;
            }
 
            function canConnectByExtend(way, endNodeIdx) {
-             const tipNid = way.nodes[endNodeIdx];  // the 'tip' node for extension point
-             const midNid = endNodeIdx === 0 ? way.nodes[1] : way.nodes[way.nodes.length - 2];  // the other node of the edge
-             const tipNode = graph.entity(tipNid);
-             const midNode = graph.entity(midNid);
-             const lon = tipNode.loc[0];
-             const lat = tipNode.loc[1];
-             const lon_range = geoMetersToLon(EXTEND_TH_METERS, lat) / 2;
-             const lat_range = geoMetersToLat(EXTEND_TH_METERS) / 2;
-             const queryExtent = geoExtent([
+             var tipNid = way.nodes[endNodeIdx];  // the 'tip' node for extension point
+             var midNid = endNodeIdx === 0 ? way.nodes[1] : way.nodes[way.nodes.length - 2];  // the other node of the edge
+             var tipNode = graph.entity(tipNid);
+             var midNode = graph.entity(midNid);
+             var lon = tipNode.loc[0];
+             var lat = tipNode.loc[1];
+             var lon_range = geoMetersToLon(EXTEND_TH_METERS, lat) / 2;
+             var lat_range = geoMetersToLat(EXTEND_TH_METERS) / 2;
+             var queryExtent = geoExtent([
                [lon - lon_range, lat - lat_range],
                [lon + lon_range, lat + lat_range]
              ]);
 
              // first, extend the edge of [midNode -> tipNode] by EXTEND_TH_METERS and find the "extended tip" location
-             const edgeLen = geoSphericalDistance(midNode.loc, tipNode.loc);
-             const t = EXTEND_TH_METERS / edgeLen + 1.0;
-             const extTipLoc = geoVecInterp(midNode.loc, tipNode.loc, t);
+             var edgeLen = geoSphericalDistance(midNode.loc, tipNode.loc);
+             var t = EXTEND_TH_METERS / edgeLen + 1.0;
+             var extTipLoc = geoVecInterp(midNode.loc, tipNode.loc, t);
 
              // then, check if the extension part [tipNode.loc -> extTipLoc] intersects any other ways
-             const segmentInfos = tree.waySegments(queryExtent, graph);
-             for (let i = 0; i < segmentInfos.length; i++) {
-               let segmentInfo = segmentInfos[i];
+             var segmentInfos = tree.waySegments(queryExtent, graph);
+             for (var i = 0; i < segmentInfos.length; i++) {
+               var segmentInfo = segmentInfos[i];
 
-               let way2 = graph.entity(segmentInfo.wayId);
+               var way2 = graph.entity(segmentInfo.wayId);
 
-               if (!isHighway(way2)) continue;
+               if (!isHighway(way2)) { continue; }
 
-               if (!canConnectWays(way, way2)) continue;
+               if (!canConnectWays(way, way2)) { continue; }
 
-               let nAid = segmentInfo.nodes[0],
+               var nAid = segmentInfo.nodes[0],
                  nBid = segmentInfo.nodes[1];
 
-               if (nAid === tipNid || nBid === tipNid) continue;
+               if (nAid === tipNid || nBid === tipNid) { continue; }
 
-               let nA = graph.entity(nAid),
+               var nA = graph.entity(nAid),
                  nB = graph.entity(nBid);
-               let crossLoc = geoLineIntersection([tipNode.loc, extTipLoc], [nA.loc, nB.loc]);
+               var crossLoc = geoLineIntersection([tipNode.loc, extTipLoc], [nA.loc, nB.loc]);
                if (crossLoc) {
                  return {
                    mid: midNode,
 
                function wayTypeFor(way) {
 
-                   if (way.tags.boundary && way.tags.boundary !== 'no') return 'boundary';
-                   if (way.tags.indoor && way.tags.indoor !== 'no') return 'indoor';
+                   if (way.tags.boundary && way.tags.boundary !== 'no') { return 'boundary'; }
+                   if (way.tags.indoor && way.tags.indoor !== 'no') { return 'indoor'; }
                    if ((way.tags.building && way.tags.building !== 'no') ||
-                       (way.tags['building:part'] && way.tags['building:part'] !== 'no')) return 'building';
-                   if (osmPathHighwayTagValues[way.tags.highway]) return 'path';
+                       (way.tags['building:part'] && way.tags['building:part'] !== 'no')) { return 'building'; }
+                   if (osmPathHighwayTagValues[way.tags.highway]) { return 'path'; }
 
                    var parentRelations = graph.parentRelations(way);
                    for (var i in parentRelations) {
                        var relation = parentRelations[i];
 
-                       if (relation.tags.type === 'boundary') return 'boundary';
+                       if (relation.tags.type === 'boundary') { return 'boundary'; }
 
                        if (relation.isMultipolygon()) {
-                           if (relation.tags.indoor && relation.tags.indoor !== 'no') return 'indoor';
+                           if (relation.tags.indoor && relation.tags.indoor !== 'no') { return 'indoor'; }
                            if ((relation.tags.building && relation.tags.building !== 'no') ||
-                               (relation.tags['building:part'] && relation.tags['building:part'] !== 'no')) return 'building';
+                               (relation.tags['building:part'] && relation.tags['building:part'] !== 'no')) { return 'building'; }
                        }
                    }
 
 
                    // don't flag issues where merging would create degenerate ways
                    if (way.nodes.length <= 2 ||
-                       (way.isClosed() && way.nodes.length <= 4)) return false;
+                       (way.isClosed() && way.nodes.length <= 4)) { return false; }
 
                    var bbox = way.extent(graph).bbox();
                    var hypotenuseMeters = geoSphericalDistance([bbox.minX, bbox.minY], [bbox.maxX, bbox.maxY]);
                    // don't flag close nodes in very small ways
-                   if (hypotenuseMeters < 1.5) return false;
+                   if (hypotenuseMeters < 1.5) { return false; }
 
                    return true;
                }
 
                function getIssuesForWay(way) {
-                   if (!shouldCheckWay(way)) return [];
+                   if (!shouldCheckWay(way)) { return []; }
 
                    var issues = [],
                        nodes = graph.childNodes(way);
                        var node2 = nodes[i+1];
 
                        var issue = getWayIssueIfAny(node1, node2, way);
-                       if (issue) issues.push(issue);
+                       if (issue) { issues.push(issue); }
                    }
                    return issues;
                }
 
                    function checkForCloseness(node1, node2, way) {
                        var issue = getWayIssueIfAny(node1, node2, way);
-                       if (issue) issues.push(issue);
+                       if (issue) { issues.push(issue); }
                    }
 
                    for (var i = 0; i < parentWays.length; i++) {
                        var parentWay = parentWays[i];
 
-                       if (!shouldCheckWay(parentWay)) continue;
+                       if (!shouldCheckWay(parentWay)) { continue; }
 
                        var lastIndex = parentWay.nodes.length - 1;
                        for (var j = 0; j < parentWay.nodes.length; j++) {
                }
 
                function thresholdMetersForWay(way) {
-                   if (!shouldCheckWay(way)) return 0;
+                   if (!shouldCheckWay(way)) { return 0; }
 
                    var wayType = wayTypeFor(way);
 
                    // don't flag boundaries since they might be highly detailed and can't be easily verified
-                   if (wayType === 'boundary') return 0;
+                   if (wayType === 'boundary') { return 0; }
                    // expect some features to be mapped with higher levels of detail
-                   if (wayType === 'indoor') return 0.01;
-                   if (wayType === 'building') return 0.05;
-                   if (wayType === 'path') return 0.1;
+                   if (wayType === 'indoor') { return 0.01; }
+                   if (wayType === 'building') { return 0.05; }
+                   if (wayType === 'path') { return 0.1; }
                    return 0.2;
                }
 
                    for (var j = 0; j < intersected.length; j++) {
                        var nearby = intersected[j];
 
-                       if (nearby.id === node.id) continue;
-                       if (nearby.type !== 'node' || nearby.geometry(graph) !== 'point') continue;
+                       if (nearby.id === node.id) { continue; }
+                       if (nearby.type !== 'node' || nearby.geometry(graph) !== 'point') { continue; }
 
                        if (nearby.loc === node.loc ||
                            geoSphericalDistance(node.loc, nearby.loc) < pointThresholdMeters) {
                                    break;
                                }
                            }
-                           if (zAxisDifferentiates) continue;
+                           if (zAxisDifferentiates) { continue; }
 
                            issues.push(new validationIssue({
                                type: type,
                            return thresholdMetersForWay(parentWay);
                        });
 
-                       var threshold = Math.min(...thresholds);
+                       var threshold = Math.min.apply(Math, thresholds);
                        var distance = geoSphericalDistance(node1.loc, node2.loc);
-                       if (distance > threshold) return null;
+                       if (distance > threshold) { return null; }
                    }
 
                    return new validationIssue({
            function getFeatureType(entity, graph) {
 
                var geometry = entity.geometry(graph);
-               if (geometry !== 'line' && geometry !== 'area') return null;
+               if (geometry !== 'line' && geometry !== 'area') { return null; }
 
                var tags = entity.tags;
 
-               if (hasTag(tags, 'building') && !ignoredBuildings[tags.building]) return 'building';
-               if (hasTag(tags, 'highway') && osmRoutableHighwayTagValues[tags.highway]) return 'highway';
+               if (hasTag(tags, 'building') && !ignoredBuildings[tags.building]) { return 'building'; }
+               if (hasTag(tags, 'highway') && osmRoutableHighwayTagValues[tags.highway]) { return 'highway'; }
 
                // don't check railway or waterway areas
-               if (geometry !== 'line') return null;
+               if (geometry !== 'line') { return null; }
 
-               if (hasTag(tags, 'railway') && osmRailwayTrackTagValues[tags.railway]) return 'railway';
-               if (hasTag(tags, 'waterway') && osmFlowingWaterwayTagValues[tags.waterway]) return 'waterway';
+               if (hasTag(tags, 'railway') && osmRailwayTrackTagValues[tags.railway]) { return 'railway'; }
+               if (hasTag(tags, 'waterway') && osmFlowingWaterwayTagValues[tags.waterway]) { return 'waterway'; }
 
                return null;
            }
                var layer2 = tags2.layer || '0';
 
                if (allowsBridge(featureType1) && allowsBridge(featureType2)) {
-                   if (hasTag(tags1, 'bridge') && !hasTag(tags2, 'bridge')) return true;
-                   if (!hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge')) return true;
+                   if (hasTag(tags1, 'bridge') && !hasTag(tags2, 'bridge')) { return true; }
+                   if (!hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge')) { return true; }
                    // crossing bridges must use different layers
-                   if (hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge') && layer1 !== layer2) return true;
-               } else if (allowsBridge(featureType1) && hasTag(tags1, 'bridge')) return true;
-               else if (allowsBridge(featureType2) && hasTag(tags2, 'bridge')) return true;
+                   if (hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge') && layer1 !== layer2) { return true; }
+               } else if (allowsBridge(featureType1) && hasTag(tags1, 'bridge')) { return true; }
+               else if (allowsBridge(featureType2) && hasTag(tags2, 'bridge')) { return true; }
 
                if (allowsTunnel(featureType1) && allowsTunnel(featureType2)) {
-                   if (hasTag(tags1, 'tunnel') && !hasTag(tags2, 'tunnel')) return true;
-                   if (!hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel')) return true;
+                   if (hasTag(tags1, 'tunnel') && !hasTag(tags2, 'tunnel')) { return true; }
+                   if (!hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel')) { return true; }
                    // crossing tunnels must use different layers
-                   if (hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel') && layer1 !== layer2) return true;
-               } else if (allowsTunnel(featureType1) && hasTag(tags1, 'tunnel')) return true;
-               else if (allowsTunnel(featureType2) && hasTag(tags2, 'tunnel')) return true;
+                   if (hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel') && layer1 !== layer2) { return true; }
+               } else if (allowsTunnel(featureType1) && hasTag(tags1, 'tunnel')) { return true; }
+               else if (allowsTunnel(featureType2) && hasTag(tags2, 'tunnel')) { return true; }
 
                // don't flag crossing waterways and pier/highways
-               if (featureType1 === 'waterway' && featureType2 === 'highway' && tags2.man_made === 'pier') return true;
-               if (featureType2 === 'waterway' && featureType1 === 'highway' && tags1.man_made === 'pier') return true;
+               if (featureType1 === 'waterway' && featureType2 === 'highway' && tags2.man_made === 'pier') { return true; }
+               if (featureType2 === 'waterway' && featureType1 === 'highway' && tags1.man_made === 'pier') { return true; }
 
                if (featureType1 === 'building' || featureType2 === 'building') {
                    // for building crossings, different layers are enough
-                   if (layer1 !== layer2) return true;
+                   if (layer1 !== layer2) { return true; }
                }
                return false;
            }
                        }
                        return {};
                    }
-                   if (featureType1 === 'waterway') return {};
-                   if (featureType1 === 'railway') return {};
+                   if (featureType1 === 'waterway') { return {}; }
+                   if (featureType1 === 'railway') { return {}; }
 
                } else {
                    var featureTypes = [featureType1, featureType2];
 
                        if (featureTypes.indexOf('waterway') !== -1) {
                            // do not allow fords on structures
-                           if (hasTag(entity1.tags, 'tunnel') && hasTag(entity2.tags, 'tunnel')) return null;
-                           if (hasTag(entity1.tags, 'bridge') && hasTag(entity2.tags, 'bridge')) return null;
+                           if (hasTag(entity1.tags, 'tunnel') && hasTag(entity2.tags, 'tunnel')) { return null; }
+                           if (hasTag(entity1.tags, 'bridge') && hasTag(entity2.tags, 'bridge')) { return null; }
 
                            if (highwaysDisallowingFords[entity1.tags.highway] ||
                                highwaysDisallowingFords[entity2.tags.highway]) {
 
            function findCrossingsByWay(way1, graph, tree) {
                var edgeCrossInfos = [];
-               if (way1.type !== 'way') return edgeCrossInfos;
+               if (way1.type !== 'way') { return edgeCrossInfos; }
 
                var way1FeatureType = getFeatureTypeForCrossingCheck(way1, graph);
-               if (way1FeatureType === null) return edgeCrossInfos;
+               if (way1FeatureType === null) { return edgeCrossInfos; }
 
                var checkedSingleCrossingWays = {};
 
                        segment2Info = segmentInfos[j];
 
                        // don't check for self-intersection in this validation
-                       if (segment2Info.wayId === way1.id) continue;
+                       if (segment2Info.wayId === way1.id) { continue; }
 
                        // skip if this way was already checked and only one issue is needed
-                       if (checkedSingleCrossingWays[segment2Info.wayId]) continue;
+                       if (checkedSingleCrossingWays[segment2Info.wayId]) { continue; }
 
                        // mark this way as checked even if there are no crossings
                        comparedWays[segment2Info.wayId] = true;
 
                        way2 = graph.hasEntity(segment2Info.wayId);
-                       if (!way2) continue;
+                       if (!way2) { continue; }
 
                        // only check crossing highway, waterway, building, and railway
                        way2FeatureType = getFeatureTypeForCrossingCheck(way2, graph);
                            continue;
                        }
                        nA = graph.hasEntity(nAId);
-                       if (!nA) continue;
+                       if (!nA) { continue; }
                        nB = graph.hasEntity(nBId);
-                       if (!nB) continue;
+                       if (!nB) { continue; }
 
                        segment1 = [n1.loc, n2.loc];
                        segment2 = [nA.loc, nB.loc];
 
            function waysToCheck(entity, graph) {
                var featureType = getFeatureType(entity, graph);
-               if (!featureType) return [];
+               if (!featureType) { return []; }
 
                if (entity.type === 'way') {
                    return [entity];
                    loc: crossing.crossPoint,
                    dynamicFixes: function(context) {
                        var mode = context.mode();
-                       if (!mode || mode.id !== 'select' || mode.selectedIDs().length !== 1) return [];
+                       if (!mode || mode.id !== 'select' || mode.selectedIDs().length !== 1) { return []; }
 
                        var selectedIndex = this.entityIds[0] === mode.selectedIDs()[0] ? 0 : 1;
                        var selectedFeatureType = this.data.featureTypes[selectedIndex];
                    title: _t('issues.fix.' + fixTitleID + '.title'),
                    onClick: function(context) {
                        var mode = context.mode();
-                       if (!mode || mode.id !== 'select') return;
+                       if (!mode || mode.id !== 'select') { return; }
 
                        var selectedIDs = mode.selectedIDs();
-                       if (selectedIDs.length !== 1) return;
+                       if (selectedIDs.length !== 1) { return; }
 
                        var selectedWayID = selectedIDs[0];
-                       if (!context.hasEntity(selectedWayID)) return;
+                       if (!context.hasEntity(selectedWayID)) { return; }
 
                        var resultWayIDs = [selectedWayID];
 
                            var a1 = geoAngle(edgeNodes[0], edgeNodes[1], projection) + Math.PI;
                            var a2 = geoAngle(graph.entity(crossedEdge[0]), graph.entity(crossedEdge[1]), projection) + Math.PI;
                            var crossingAngle = Math.max(a1, a2) - Math.min(a1, a2);
-                           if (crossingAngle > Math.PI) crossingAngle -= Math.PI;
+                           if (crossingAngle > Math.PI) { crossingAngle -= Math.PI; }
                            // lengthen the structure to account for the angle of the crossing
                            structLengthMeters = ((structLengthMeters / 2) / Math.sin(crossingAngle)) * 2;
 
 
                                // if the edge is too short to subdivide as desired, then
                                // just bound the structure at the existing end node
-                               if (!newNode) newNode = endNode;
+                               if (!newNode) { newNode = endNode; }
 
                                var splitAction = actionSplit(newNode.id)
                                    .limitWays(resultWayIDs); // only split selected or created ways
                    onClick: function(context) {
 
                        var mode = context.mode();
-                       if (!mode || mode.id !== 'select') return;
+                       if (!mode || mode.id !== 'select') { return; }
 
                        var selectedIDs = mode.selectedIDs();
-                       if (selectedIDs.length !== 1) return;
+                       if (selectedIDs.length !== 1) { return; }
 
                        var selectedID = selectedIDs[0];
                        if (!this.issue.entityIds.some(function(entityId) {
                            return entityId === selectedID;
-                       })) return;
+                       })) { return; }
 
                        var entity = context.hasEntity(selectedID);
-                       if (!entity) return;
+                       if (!entity) { return; }
 
                        var tags = Object.assign({}, entity.tags);   // shallow copy
                        var layer = tags.layer && Number(tags.layer);
            var validation = function checkDisconnectedWay(entity, graph) {
 
                var routingIslandWays = routingIslandForEntity(entity);
-               if (!routingIslandWays) return [];
+               if (!routingIslandWays) { return []; }
 
                return [new validationIssue({
                    type: type,
                            var textDirection = _mainLocalizer.textDirection();
 
                            var startFix = makeContinueDrawingFixIfAllowed(textDirection, singleEntity.first(), 'start');
-                           if (startFix) fixes.push(startFix);
+                           if (startFix) { fixes.push(startFix); }
 
                            var endFix = makeContinueDrawingFixIfAllowed(textDirection, singleEntity.last(), 'end');
-                           if (endFix) fixes.push(endFix);
+                           if (endFix) { fixes.push(endFix); }
                        }
                        if (!fixes.length) {
                            fixes.push(new validationIssueFix({
                function isConnectedVertex(vertex) {
                    // assume ways overlapping unloaded tiles are connected to the wider road network  - #5938
                    var osm = services.osm;
-                   if (osm && !osm.isDataLoaded(vertex.loc)) return true;
+                   if (osm && !osm.isDataLoaded(vertex.loc)) { return true; }
 
                    // entrances are considered connected
                    if (vertex.tags.entrance &&
-                       vertex.tags.entrance !== 'no') return true;
-                   if (vertex.tags.amenity === 'parking_entrance') return true;
+                       vertex.tags.entrance !== 'no') { return true; }
+                   if (vertex.tags.amenity === 'parking_entrance') { return true; }
 
                    return false;
                }
 
                function isRoutableNode(node) {
                    // treat elevators as distinct features in the highway network
-                   if (node.tags.highway === 'elevator') return true;
+                   if (node.tags.highway === 'elevator') { return true; }
                    return false;
                }
 
                function isRoutableWay(way, ignoreInnerWays) {
-                   if (isTaggedAsHighway(way) || way.tags.route === 'ferry') return true;
+                   if (isTaggedAsHighway(way) || way.tags.route === 'ferry') { return true; }
 
                    return graph.parentRelations(way).some(function(parentRelation) {
                        if (parentRelation.tags.type === 'route' &&
-                           parentRelation.tags.route === 'ferry') return true;
+                           parentRelation.tags.route === 'ferry') { return true; }
 
                        if (parentRelation.isMultipolygon() &&
                            isTaggedAsHighway(parentRelation) &&
-                           (!ignoreInnerWays || parentRelation.memberById(way.id).role !== 'inner')) return true;
+                           (!ignoreInnerWays || parentRelation.memberById(way.id).role !== 'inner')) { return true; }
                    });
                }
 
                function makeContinueDrawingFixIfAllowed(textDirection, vertexID, whichEnd) {
                    var vertex = graph.hasEntity(vertexID);
-                   if (!vertex || vertex.tags.noexit === 'yes') return null;
+                   if (!vertex || vertex.tags.noexit === 'yes') { return null; }
 
                    var useLeftContinue = (whichEnd === 'start' && textDirection === 'ltr') ||
                        (whichEnd === 'end' && textDirection === 'rtl');
                            var vertexId = this.entityIds[0];
                            var vertex = context.hasEntity(vertexId);
 
-                           if (!way || !vertex) return;
+                           if (!way || !vertex) { return; }
 
                            // make sure the vertex is actually visible and editable
                            var map = context.map();
 
            var validation = function checkFixmeTag(entity) {
 
-               if (!entity.tags.fixme) return [];
+               if (!entity.tags.fixme) { return []; }
 
                // don't flag fixmes on features added by the user
-               if (entity.version === undefined) return [];
+               if (entity.version === undefined) { return []; }
 
                if (entity.v !== undefined) {
                    var baseEntity = context.history().base().hasEntity(entity.id);
                    // don't flag fixmes added by the user on existing features
-                   if (!baseEntity || !baseEntity.tags.fixme) return [];
+                   if (!baseEntity || !baseEntity.tags.fixme) { return []; }
                }
 
                return [new validationIssue({
 
            var validation = function checkImpossibleOneway(entity, graph) {
 
-               if (entity.type !== 'way' || entity.geometry(graph) !== 'line') return [];
+               if (entity.type !== 'way' || entity.geometry(graph) !== 'line') { return []; }
 
-               if (entity.isClosed()) return [];
+               if (entity.isClosed()) { return []; }
 
-               if (!typeForWay(entity)) return [];
+               if (!typeForWay(entity)) { return []; }
 
-               if (!isOneway(entity)) return [];
+               if (!isOneway(entity)) { return []; }
 
                var firstIssues = issuesForNode(entity, entity.first());
                var lastIssues = issuesForNode(entity, entity.last());
                return firstIssues.concat(lastIssues);
 
                function typeForWay(way) {
-                   if (way.geometry(graph) !== 'line') return null;
+                   if (way.geometry(graph) !== 'line') { return null; }
 
-                   if (osmRoutableHighwayTagValues[way.tags.highway]) return 'highway';
-                   if (osmFlowingWaterwayTagValues[way.tags.waterway]) return 'waterway';
+                   if (osmRoutableHighwayTagValues[way.tags.highway]) { return 'highway'; }
+                   if (osmFlowingWaterwayTagValues[way.tags.waterway]) { return 'waterway'; }
                    return null;
                }
 
                function isOneway(way) {
-                   if (way.tags.oneway === 'yes') return true;
-                   if (way.tags.oneway) return false;
+                   if (way.tags.oneway === 'yes') { return true; }
+                   if (way.tags.oneway) { return false; }
 
                    for (var key in way.tags) {
                        if (osmOneWayTags[key] && osmOneWayTags[key][way.tags[key]]) {
                    for (var index in way.nodes) {
                        if (way.nodes[index] === nodeID) {
                            occurences += 1;
-                           if (occurences > 1) return true;
+                           if (occurences > 1) { return true; }
                        }
                    }
                    return false;
 
                    if (wayType === 'highway') {
                        // entrances are considered connected
-                       if (node.tags.entrance && node.tags.entrance !== 'no') return true;
-                       if (node.tags.amenity === 'parking_entrance') return true;
+                       if (node.tags.entrance && node.tags.entrance !== 'no') { return true; }
+                       if (node.tags.amenity === 'parking_entrance') { return true; }
                    } else if (wayType === 'waterway') {
                        if (node.id === way.first()) {
                            // multiple waterways may start at the same spring
-                           if (node.tags.natural === 'spring') return true;
+                           if (node.tags.natural === 'spring') { return true; }
                        } else {
                            // multiple waterways may end at the same drain
-                           if (node.tags.manhole === 'drain') return true;
+                           if (node.tags.manhole === 'drain') { return true; }
                        }
                    }
 
                    return graph.parentWays(node).some(function(parentWay) {
-                       if (parentWay.id === way.id) return false;
+                       if (parentWay.id === way.id) { return false; }
 
                        if (wayType === 'highway') {
 
                            // allow connections to highway areas
                            if (parentWay.geometry(graph) === 'area' &&
-                               osmRoutableHighwayTagValues[parentWay.tags.highway]) return true;
+                               osmRoutableHighwayTagValues[parentWay.tags.highway]) { return true; }
 
                            // count connections to ferry routes as connected
-                           if (parentWay.tags.route === 'ferry') return true;
+                           if (parentWay.tags.route === 'ferry') { return true; }
 
                            return graph.parentRelations(parentWay).some(function(parentRelation) {
                                if (parentRelation.tags.type === 'route' &&
-                                   parentRelation.tags.route === 'ferry') return true;
+                                   parentRelation.tags.route === 'ferry') { return true; }
 
                                // allow connections to highway multipolygons
                                return parentRelation.isMultipolygon() && osmRoutableHighwayTagValues[parentRelation.tags.highway];
                        } else if (wayType === 'waterway') {
                            // multiple waterways may start or end at a water body at the same node
                            if (parentWay.tags.natural === 'water' ||
-                               parentWay.tags.natural === 'coastline') return true;
+                               parentWay.tags.natural === 'coastline') { return true; }
                        }
                        return false;
                    });
                    var wayType = typeForWay(way);
 
                    // ignore if this way is self-connected at this node
-                   if (nodeOccursMoreThanOnce(way, nodeID)) return [];
+                   if (nodeOccursMoreThanOnce(way, nodeID)) { return []; }
 
                    var osm = services.osm;
-                   if (!osm) return [];
+                   if (!osm) { return []; }
 
                    var node = graph.hasEntity(nodeID);
 
                    // ignore if this node or its tile are unloaded
-                   if (!node || !osm.isDataLoaded(node.loc)) return [];
+                   if (!node || !osm.isDataLoaded(node.loc)) { return []; }
 
-                   if (isConnectedViaOtherTypes(way, node)) return [];
+                   if (isConnectedViaOtherTypes(way, node)) { return []; }
 
                    var attachedWaysOfSameType = graph.parentWays(node).filter(function(parentWay) {
-                       if (parentWay.id === way.id) return false;
+                       if (parentWay.id === way.id) { return false; }
                        return typeForWay(parentWay) === wayType;
                    });
 
                    // assume it's okay for waterways to start or end disconnected for now
-                   if (wayType === 'waterway' && attachedWaysOfSameType.length === 0) return [];
+                   if (wayType === 'waterway' && attachedWaysOfSameType.length === 0) { return []; }
 
                    var attachedOneways = attachedWaysOfSameType.filter(function(attachedWay) {
                        return isOneway(attachedWay);
                    });
 
                    // ignore if the way is connected to some non-oneway features
-                   if (attachedOneways.length < attachedWaysOfSameType.length) return [];
+                   if (attachedOneways.length < attachedWaysOfSameType.length) { return []; }
 
                    if (attachedOneways.length) {
                        var connectedEndpointsOkay = attachedOneways.some(function(attachedOneway) {
-                           if ((isFirst ? attachedOneway.first() : attachedOneway.last()) !== nodeID) return true;
-                           if (nodeOccursMoreThanOnce(attachedOneway, nodeID)) return true;
+                           if ((isFirst ? attachedOneway.first() : attachedOneway.last()) !== nodeID) { return true; }
+                           if (nodeOccursMoreThanOnce(attachedOneway, nodeID)) { return true; }
                            return false;
                        });
-                       if (connectedEndpointsOkay) return [];
+                       if (connectedEndpointsOkay) { return []; }
                    }
 
                    var placement = isFirst ? 'start' : 'end',
 
                var entitySources = entity.tags && entity.tags.source && entity.tags.source.split(';');
 
-               if (!entitySources) return [];
+               if (!entitySources) { return []; }
 
                var issues = [];
 
                invalidSources.forEach(function(invalidSource) {
 
                    var hasInvalidSource = entitySources.some(function(source) {
-                       if (!source.match(new RegExp(invalidSource.regex, 'i'))) return false;
-                       if (invalidSource.exceptRegex && source.match(new RegExp(invalidSource.exceptRegex, 'i'))) return false;
+                       if (!source.match(new RegExp(invalidSource.regex, 'i'))) { return false; }
+                       if (invalidSource.exceptRegex && source.match(new RegExp(invalidSource.exceptRegex, 'i'))) { return false; }
                        return true;
                    });
 
-                   if (!hasInvalidSource) return;
+                   if (!hasInvalidSource) { return; }
 
                    issues.push(new validationIssue({
                        type: type,
            var type = 'maprules';
 
            var validation = function checkMaprules(entity, graph) {
-               if (!services.maprules) return [];
+               if (!services.maprules) { return []; }
 
                var rules = services.maprules.validationRules();
                var issues = [];
            var type = 'mismatched_geometry';
 
            function tagSuggestingLineIsArea(entity) {
-               if (entity.type !== 'way' || entity.isClosed()) return null;
+               if (entity.type !== 'way' || entity.isClosed()) { return null; }
 
                var tagSuggestingArea = entity.tagSuggestingArea();
                if (!tagSuggestingArea) {
 
            function makeConnectEndpointsFixOnClick(way, graph) {
                // must have at least three nodes to close this automatically
-               if (way.nodes.length < 3) return null;
+               if (way.nodes.length < 3) { return null; }
 
                var nodes = graph.childNodes(way), testNodes;
                var firstToLastDistanceMeters = geoSphericalDistance(nodes[0].loc, nodes[nodes.length-1].loc);
            function lineTaggedAsAreaIssue(entity) {
 
                var tagSuggestingArea = tagSuggestingLineIsArea(entity);
-               if (!tagSuggestingArea) return null;
+               if (!tagSuggestingArea) { return null; }
 
                return new validationIssue({
                    type: type,
 
            function vertexTaggedAsPointIssue(entity, graph) {
                // we only care about nodes
-               if (entity.type !== 'node') return null;
+               if (entity.type !== 'node') { return null; }
 
                // ignore tagless points
-               if (Object.keys(entity.tags).length === 0) return null;
+               if (Object.keys(entity.tags).length === 0) { return null; }
 
                // address lines are special so just ignore them
-               if (entity.isOnAddressLine(graph)) return null;
+               if (entity.isOnAddressLine(graph)) { return null; }
 
                var geometry = entity.geometry(graph);
                var allowedGeometries = osmNodeGeometriesForTags(entity.tags);
                    !entity.isMultipolygon() ||
                    entity.isDegenerate() ||
                    // cannot determine issues for incompletely-downloaded relations
-                   !entity.isComplete(graph)) return null;
+                   !entity.isComplete(graph)) { return null; }
 
                var sequences = osmJoinWays(entity.members, graph);
 
                for (var i in sequences) {
                    var sequence = sequences[i];
 
-                   if (!sequence.nodes) continue;
+                   if (!sequence.nodes) { continue; }
 
                    var firstNode = sequence.nodes[0];
                    var lastNode = sequence.nodes[sequence.nodes.length - 1];
 
                    // part is closed if the first and last nodes are the same
-                   if (firstNode === lastNode) continue;
+                   if (firstNode === lastNode) { continue; }
 
                    var issue = new validationIssue({
                        type: type,
                var issues = [];
                if (entity.type === 'way') {
                    graph.parentRelations(entity).forEach(function(relation) {
-                       if (!relation.isMultipolygon()) return;
+                       if (!relation.isMultipolygon()) { return; }
 
                        var member = relation.memberById(entity.id);
                        if (member && isMissingRole(member)) {
                    subtype = 'highway_classification';
                }
 
-               if (!subtype) return [];
+               if (!subtype) { return []; }
 
                var messageID = subtype === 'highway_classification' ? 'unknown_road' : 'missing_tag.' + subtype;
                var referenceID = subtype === 'highway_classification' ? 'unknown_road' : 'missing_tag';
        }
 
        // remove spaces, punctuation, diacritics
-       var simplify = (str) => {
+       var simplify = function (str) {
          return diacritics.remove(
            str
              .replace(/&/g, 'and')
        //   nsimple:     "thaiexpress",
        //   kvnnsimple:  "amenity/fast_food|thaiexpress"
        // }
-       var to_parts = (kvnd) => {
-         const parts = {};
+       var to_parts = function (kvnd) {
+         var parts = {};
          parts.kvnd = kvnd;
 
-         const kvndparts = kvnd.split('~', 2);
-         if (kvndparts.length > 1) parts.d = kvndparts[1];
+         var kvndparts = kvnd.split('~', 2);
+         if (kvndparts.length > 1) { parts.d = kvndparts[1]; }
 
          parts.kvn = kvndparts[0];
-         const kvnparts = parts.kvn.split('|', 2);
-         if (kvnparts.length > 1) parts.n = kvnparts[1];
+         var kvnparts = parts.kvn.split('|', 2);
+         if (kvnparts.length > 1) { parts.n = kvnparts[1]; }
 
          parts.kv = kvnparts[0];
-         const kvparts = parts.kv.split('/', 2);
+         var kvparts = parts.kv.split('/', 2);
          parts.k = kvparts[0];
          parts.v = kvparts[1];
 
 
        var require$$0 = getCjsExportFromNamespace(match_groups$1);
 
-       const matchGroups$1 = require$$0.matchGroups;
+       var matchGroups$1 = require$$0.matchGroups;
 
 
-       var matcher$1 = () => {
-         let _warnings = [];  // array of match conflict pairs
-         let _ambiguous = {};
-         let _matchIndex = {};
-         let matcher = {};
+       var matcher$1 = function () {
+         var _warnings = [];  // array of match conflict pairs
+         var _ambiguous = {};
+         var _matchIndex = {};
+         var matcher = {};
 
 
          // Create an index of all the keys/simplenames for fast matching
-         matcher.buildMatchIndex = (brands) => {
+         matcher.buildMatchIndex = function (brands) {
            // two passes - once for primary names, once for secondary/alternate names
-           Object.keys(brands).forEach(kvnd => insertNames(kvnd, 'primary'));
-           Object.keys(brands).forEach(kvnd => insertNames(kvnd, 'secondary'));
+           Object.keys(brands).forEach(function (kvnd) { return insertNames(kvnd, 'primary'); });
+           Object.keys(brands).forEach(function (kvnd) { return insertNames(kvnd, 'secondary'); });
 
 
            function insertNames(kvnd, which) {
-             const obj = brands[kvnd];
-             const parts = to_parts(kvnd);
+             var obj = brands[kvnd];
+             var parts = to_parts(kvnd);
 
              // Exit early for ambiguous names in the second pass.
              // They were collected in the first pass and we don't gather alt names for them.
-             if (which === 'secondary' && parts.d) return;
+             if (which === 'secondary' && parts.d) { return; }
 
 
              if (obj.countryCodes) {
                parts.countryCodes = obj.countryCodes.slice();  // copy
              }
 
-             const nomatches = (obj.nomatch || []);
-             if (nomatches.some(s => s === kvnd)) {
-               console.log(`WARNING match/nomatch conflict for ${kvnd}`);
+             var nomatches = (obj.nomatch || []);
+             if (nomatches.some(function (s) { return s === kvnd; })) {
+               console.log(("WARNING match/nomatch conflict for " + kvnd));
                return;
              }
 
-             const match_kv = [parts.kv]
+             var match_kv = [parts.kv]
                .concat(obj.matchTags || [])
-               .concat([`${parts.k}/yes`, `building/yes`])   // #3454 - match some generic tags
-               .map(s => s.toLowerCase());
+               .concat([((parts.k) + "/yes"), "building/yes"])   // #3454 - match some generic tags
+               .map(function (s) { return s.toLowerCase(); });
 
-             let match_nsimple = [];
+             var match_nsimple = [];
              if (which === 'primary') {
                match_nsimple = [parts.n]
                  .concat(obj.matchNames || [])
                  .map(simplify);
              }
 
-             if (!match_nsimple.length) return;  // nothing to do
+             if (!match_nsimple.length) { return; }  // nothing to do
 
-             match_kv.forEach(kv => {
-               match_nsimple.forEach(nsimple => {
+             match_kv.forEach(function (kv) {
+               match_nsimple.forEach(function (nsimple) {
                  if (parts.d) {
                    // Known ambiguous names with disambiguation string ~(USA) / ~(Canada)
                    // FIXME: Name collisions will overwrite the initial entry (ok for now)
-                   if (!_ambiguous[kv]) _ambiguous[kv] = {};
+                   if (!_ambiguous[kv]) { _ambiguous[kv] = {}; }
                    _ambiguous[kv][nsimple] = parts;
 
                  } else {
                    // Names we mostly expect to be unique..
-                   if (!_matchIndex[kv]) _matchIndex[kv] = {};
+                   if (!_matchIndex[kv]) { _matchIndex[kv] = {}; }
 
-                   const m = _matchIndex[kv][nsimple];
+                   var m = _matchIndex[kv][nsimple];
                    if (m) {  // There already is a match for this name, skip it
                      // Warn if we detect collisions in a primary name.
                      // Skip warning if a secondary name or a generic `*=yes` tag - #2972 / #3454
                      if (which === 'primary' && !/\/yes$/.test(kv)) {
-                       _warnings.push([m.kvnd, `${kvnd} (${kv}/${nsimple})`]);
+                       _warnings.push([m.kvnd, (kvnd + " (" + kv + "/" + nsimple + ")")]);
                      }
                    } else {
                      _matchIndex[kv][nsimple] = parts;   // insert
 
          // pass a `key`, `value`, `name` and return the best match,
          // `countryCode` optional (if supplied, must match that too)
-         matcher.matchKVN = (key, value, name, countryCode) => {
-           return matcher.matchParts(to_parts(`${key}/${value}|${name}`), countryCode);
+         matcher.matchKVN = function (key, value, name, countryCode) {
+           return matcher.matchParts(to_parts((key + "/" + value + "|" + name)), countryCode);
          };
 
 
          // pass a parts object and return the best match,
          // `countryCode` optional (if supplied, must match that too)
-         matcher.matchParts = (parts, countryCode) => {
-           let match = null;
-           let inGroup = false;
+         matcher.matchParts = function (parts, countryCode) {
+           var match = null;
+           var inGroup = false;
 
            // fixme: we currently return a single match for ambiguous
            match = _ambiguous[parts.kv] && _ambiguous[parts.kv][parts.nsimple];
-           if (match && matchesCountryCode(match)) return match;
+           if (match && matchesCountryCode(match)) { return match; }
 
            // try to return an exact match
            match = _matchIndex[parts.kv] && _matchIndex[parts.kv][parts.nsimple];
-           if (match && matchesCountryCode(match)) return match;
+           if (match && matchesCountryCode(match)) { return match; }
 
            // look in match groups
-           for (let mg in matchGroups$1) {
-             const matchGroup = matchGroups$1[mg];
+           for (var mg in matchGroups$1) {
+             var matchGroup = matchGroups$1[mg];
              match = null;
              inGroup = false;
 
-             for (let i = 0; i < matchGroup.length; i++) {
-               const otherkv = matchGroup[i].toLowerCase();
+             for (var i = 0; i < matchGroup.length; i++) {
+               var otherkv = matchGroup[i].toLowerCase();
                if (!inGroup) {
                  inGroup = otherkv === parts.kv;
                }
            return null;
 
            function matchesCountryCode(match) {
-             if (!countryCode) return true;
-             if (!match.countryCodes) return true;
+             if (!countryCode) { return true; }
+             if (!match.countryCodes) { return true; }
              return match.countryCodes.indexOf(countryCode) !== -1;
            }
          };
 
 
-         matcher.getWarnings = () => _warnings;
+         matcher.getWarnings = function () { return _warnings; };
 
          return matcher;
        };
                var j = right;
 
                swap(arr, left, k);
-               if (compare(arr[right], t) > 0) swap(arr, left, right);
+               if (compare(arr[right], t) > 0) { swap(arr, left, right); }
 
                while (i < j) {
                    swap(arr, i, j);
                    i++;
                    j--;
-                   while (compare(arr[i], t) < 0) i++;
-                   while (compare(arr[j], t) > 0) j--;
+                   while (compare(arr[i], t) < 0) { i++; }
+                   while (compare(arr[j], t) > 0) { j--; }
                }
 
-               if (compare(arr[left], t) === 0) swap(arr, left, j);
+               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;
+               if (j <= k) { left = j + 1; }
+               if (k <= j) { right = j - 1; }
            }
        }
 
 
 
        function rbush(maxEntries, format) {
-           if (!(this instanceof rbush)) return new rbush(maxEntries, format);
+           if (!(this instanceof rbush)) { return new rbush(maxEntries, format); }
 
            // max entries in a node is 9 by default; min node fill is 40% for best performance
            this._maxEntries = Math.max(4, maxEntries || 9);
                    result = [],
                    toBBox = this.toBBox;
 
-               if (!intersects$1(bbox, node)) return result;
+               if (!intersects$1(bbox, node)) { return result; }
 
                var nodesToSearch = [],
                    i, len, child, childBBox;
                        childBBox = node.leaf ? toBBox(child) : child;
 
                        if (intersects$1(bbox, childBBox)) {
-                           if (node.leaf) result.push(child);
-                           else if (contains$2(bbox, childBBox)) this._all(child, result);
-                           else nodesToSearch.push(child);
+                           if (node.leaf) { result.push(child); }
+                           else if (contains$2(bbox, childBBox)) { this._all(child, result); }
+                           else { nodesToSearch.push(child); }
                        }
                    }
                    node = nodesToSearch.pop();
                var node = this.data,
                    toBBox = this.toBBox;
 
-               if (!intersects$1(bbox, node)) return false;
+               if (!intersects$1(bbox, node)) { return false; }
 
                var nodesToSearch = [],
                    i, len, child, childBBox;
                        childBBox = node.leaf ? toBBox(child) : child;
 
                        if (intersects$1(bbox, childBBox)) {
-                           if (node.leaf || contains$2(bbox, childBBox)) return true;
+                           if (node.leaf || contains$2(bbox, childBBox)) { return true; }
                            nodesToSearch.push(child);
                        }
                    }
            },
 
            load: function (data) {
-               if (!(data && data.length)) return this;
+               if (!(data && data.length)) { return this; }
 
                if (data.length < this._minEntries) {
                    for (var i = 0, len = data.length; i < len; i++) {
            },
 
            insert: function (item) {
-               if (item) this._insert(item, this.data.height - 1);
+               if (item) { this._insert(item, this.data.height - 1); }
                return this;
            },
 
            },
 
            remove: function (item, equalsFn) {
-               if (!item) return this;
+               if (!item) { return this; }
 
                var node = this.data,
                    bbox = this.toBBox(item),
                        node = parent.children[i];
                        goingUp = false;
 
-                   } else node = null; // nothing found
+                   } else { node = null; } // nothing found
                }
 
                return this;
            _all: function (node, result) {
                var nodesToSearch = [];
                while (node) {
-                   if (node.leaf) result.push.apply(result, node.children);
-                   else nodesToSearch.push.apply(nodesToSearch, node.children);
+                   if (node.leaf) { result.push.apply(result, node.children); }
+                   else { nodesToSearch.push.apply(nodesToSearch, node.children); }
 
                    node = nodesToSearch.pop();
                }
                while (true) {
                    path.push(node);
 
-                   if (node.leaf || path.length - 1 === level) break;
+                   if (node.leaf || path.length - 1 === level) { break; }
 
                    minArea = minEnlargement = Infinity;
 
                    if (insertPath[level].children.length > this._maxEntries) {
                        this._split(insertPath, level);
                        level--;
-                   } else break;
+                   } else { break; }
                }
 
                // adjust bboxes along the insertion path
                calcBBox$1(node, this.toBBox);
                calcBBox$1(newNode, this.toBBox);
 
-               if (level) insertPath[level - 1].children.push(newNode);
-               else this._splitRoot(node, newNode);
+               if (level) { insertPath[level - 1].children.push(newNode); }
+               else { this._splitRoot(node, newNode); }
            },
 
            _splitRoot: function (node, newNode) {
 
                // 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 (xMargin < yMargin) { node.children.sort(compareMinX); }
            },
 
            // total margin of all possible split distributions where each node is at least m full
                            siblings = path[i - 1].children;
                            siblings.splice(siblings.indexOf(path[i]), 1);
 
-                       } else this.clear();
+                       } else { this.clear(); }
 
-                   } else calcBBox$1(path[i], this.toBBox);
+                   } else { calcBBox$1(path[i], this.toBBox); }
                }
            },
 
        };
 
        function findItem$1(item, items, equalsFn) {
-           if (!equalsFn) return items.indexOf(item);
+           if (!equalsFn) { return items.indexOf(item); }
 
            for (var i = 0; i < items.length; i++) {
-               if (equalsFn(item, items[i])) return i;
+               if (equalsFn(item, items[i])) { return i; }
            }
            return -1;
        }
 
        // min bounding rectangle of node children from k to p-1
        function distBBox$1(node, k, p, toBBox, destNode) {
-           if (!destNode) destNode = createNode$1(null);
+           if (!destNode) { destNode = createNode$1(null); }
            destNode.minX = Infinity;
            destNode.minY = Infinity;
            destNode.maxX = -Infinity;
                right = stack.pop();
                left = stack.pop();
 
-               if (right - left <= n) continue;
+               if (right - left <= n) { continue; }
 
                mid = left + Math.ceil((right - left) / n / 2) * n;
                quickselect$1(arr, mid, left, right, compare);
                part = [],
                i, a, b, codeB, lastCode;
 
-           if (!result) result = [];
+           if (!result) { result = []; }
 
            for (i = 1; i < len; i++) {
                a = points[i - 1];
                codeA = lastCode;
            }
 
-           if (part.length) result.push(part);
+           if (part.length) { result.push(part); }
 
            return result;
        }
                    inside = !(bitCode$1(p, bbox) & edge);
 
                    // if segment goes through the clip window, add an intersection
-                   if (inside !== prevInside) result.push(intersect$1(prev, p, edge, bbox));
+                   if (inside !== prevInside) { result.push(intersect$1(prev, p, edge, bbox)); }
 
-                   if (inside) result.push(p); // add a point if it's inside
+                   if (inside) { result.push(p); } // add a point if it's inside
 
                    prev = p;
                    prevInside = inside;
 
                points = result;
 
-               if (!points.length) break;
+               if (!points.length) { break; }
            }
 
            return result;
        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
+           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
+           if (p[1] < bbox[1]) { code |= 4; } // bottom
+           else if (p[1] > bbox[3]) { code |= 8; } // top
 
            return code;
        }
                for (var i = 0; i < result.length; i++) {
                    if (insidePolygon(result[i].coords, p)) {
                        if (multi)
-                           output.push(result[i].props);
+                           { output.push(result[i].props); }
                        else
-                           return result[i].props;
+                           { return result[i].props; }
                    }
                }
                return multi && output.length ? output : null;
                (bbox[0] + bbox[2]) / 2,
                (bbox[1] + bbox[3]) / 2
            ];
-           if (insidePolygon(polygon, bboxCenter)) return true;
+           if (insidePolygon(polygon, bboxCenter)) { return true; }
            for (var i = 0; i < polygon.length; i++) {
-               if (lineclip_1$1(polygon[i], bbox).length > 0) return true;
+               if (lineclip_1$1(polygon[i], bbox).length > 0) { return true; }
            }
            return false;
        }
            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;
+                   if (rayIntersect(p, ring[j], ring[k])) { inside = !inside; }
                }
            }
            return inside;
        features: features
        };
 
-       let borders = rawBorders;
-       let whichPolygonGetter = {};
-       let featuresByCode = {};
-       let idFilterRegex = /\bThe\b|\bthe\b|\band\b|\bof\b|[-_ .,()&[\]/]/g;
-       let levels = [
+       var borders = rawBorders;
+       var whichPolygonGetter = {};
+       var featuresByCode = {};
+       var idFilterRegex = /\bThe\b|\bthe\b|\band\b|\bof\b|[-_ .,()&[\]/]/g;
+       var levels = [
          'subterritory',
          'territory',
          'country',
        ];
        loadDerivedDataAndCaches(borders);
        function loadDerivedDataAndCaches(borders) {
-         let identifierProps = ['iso1A2', 'iso1A3', 'm49', 'wikidata', 'emojiFlag', 'nameEn'];
-         let geometryFeatures = [];
-         for (let i in borders.features) {
-           let feature = borders.features[i];
+         var identifierProps = ['iso1A2', 'iso1A3', 'm49', 'wikidata', 'emojiFlag', 'nameEn'];
+         var geometryFeatures = [];
+         for (var i in borders.features) {
+           var feature = borders.features[i];
            feature.properties.id = feature.properties.iso1A2 || feature.properties.m49;
            loadM49(feature);
            loadIsoStatus(feature);
            loadDriveSide(feature);
            loadFlag(feature);
            cacheFeatureByIDs(feature);
-           if (feature.geometry) geometryFeatures.push(feature);
+           if (feature.geometry) { geometryFeatures.push(feature); }
          }
-         for (let i in borders.features) {
-           let feature = borders.features[i];
-           feature.properties.groups.sort(function(groupID1, groupID2) {
+         for (var i$1 in borders.features) {
+           var feature$1 = borders.features[i$1];
+           feature$1.properties.groups.sort(function(groupID1, groupID2) {
              return (
                levels.indexOf(featuresByCode[groupID1].properties.level) -
                levels.indexOf(featuresByCode[groupID2].properties.level)
              );
            });
-           loadMembersForGroupsOf(feature);
+           loadMembersForGroupsOf(feature$1);
          }
-         let geometryOnlyCollection = {
+         var geometryOnlyCollection = {
            type: 'RegionFeatureCollection',
            features: geometryFeatures
          };
          whichPolygonGetter = whichPolygon_1(geometryOnlyCollection);
          function loadGroups(feature) {
-           let props = feature.properties;
+           var props = feature.properties;
            if (!props.groups) {
              props.groups = [];
            }
            }
          }
          function loadM49(feature) {
-           let props = feature.properties;
+           var props = feature.properties;
            if (!props.m49 && props.iso1N3) {
              props.m49 = props.iso1N3;
            }
          }
          function loadIsoStatus(feature) {
-           let props = feature.properties;
+           var props = feature.properties;
            if (!props.isoStatus && props.iso1A2) {
              props.isoStatus = 'official';
            }
          }
          function loadLevel(feature) {
-           let props = feature.properties;
-           if (props.level) return;
+           var props = feature.properties;
+           if (props.level) { return; }
            if (!props.country) {
              props.level = 'country';
            } else if (props.isoStatus === 'official') {
            }
          }
          function loadRoadSpeedUnit(feature) {
-           let props = feature.properties;
+           var props = feature.properties;
            if (props.roadSpeedUnit === undefined && props.iso1A2 && props.iso1A2 !== 'EU') {
              props.roadSpeedUnit = 'km/h';
            }
          }
          function loadDriveSide(feature) {
-           let props = feature.properties;
+           var props = feature.properties;
            if (props.driveSide === undefined && props.iso1A2 && props.iso1A2 !== 'EU') {
              props.driveSide = 'right';
            }
          }
          function loadFlag(feature) {
-           if (!feature.properties.iso1A2) return;
-           let flag = feature.properties.iso1A2.replace(/./g, function(char) {
+           if (!feature.properties.iso1A2) { return; }
+           var flag = feature.properties.iso1A2.replace(/./g, function(char) {
              return String.fromCodePoint(char.charCodeAt(0) + 127397);
            });
            feature.properties.emojiFlag = flag;
          }
          function loadMembersForGroupsOf(feature) {
-           let featureID = feature.properties.id;
-           let standardizedGroupIDs = [];
-           for (let j in feature.properties.groups) {
-             let groupID = feature.properties.groups[j];
-             let groupFeature = featuresByCode[groupID];
+           var featureID = feature.properties.id;
+           var standardizedGroupIDs = [];
+           for (var j in feature.properties.groups) {
+             var groupID = feature.properties.groups[j];
+             var groupFeature = featuresByCode[groupID];
              standardizedGroupIDs.push(groupFeature.properties.id);
              if (groupFeature.properties.members) {
                groupFeature.properties.members.push(featureID);
            feature.properties.groups = standardizedGroupIDs;
          }
          function cacheFeatureByIDs(feature) {
-           for (let k in identifierProps) {
-             let prop = identifierProps[k];
-             let id = prop && feature.properties[prop];
+           for (var k in identifierProps) {
+             var prop = identifierProps[k];
+             var id = prop && feature.properties[prop];
              if (id) {
                id = id.replace(idFilterRegex, '').toUpperCase();
                featuresByCode[id] = feature;
              }
            }
            if (feature.properties.aliases) {
-             for (let j in feature.properties.aliases) {
-               let alias = feature.properties.aliases[j].replace(idFilterRegex, '').toUpperCase();
+             for (var j in feature.properties.aliases) {
+               var alias = feature.properties.aliases[j].replace(idFilterRegex, '').toUpperCase();
                featuresByCode[alias] = feature;
              }
            }
          return loc.geometry.coordinates;
        }
        function smallestFeature(loc) {
-         let query = locArray(loc);
-         let featureProperties = whichPolygonGetter(query);
-         if (!featureProperties) return null;
+         var query = locArray(loc);
+         var featureProperties = whichPolygonGetter(query);
+         if (!featureProperties) { return null; }
          return featuresByCode[featureProperties.id];
        }
        function countryFeature(loc) {
-         let feature = smallestFeature(loc);
-         if (!feature) return null;
-         let countryCode = feature.properties.country || feature.properties.iso1A2;
+         var feature = smallestFeature(loc);
+         if (!feature) { return null; }
+         var countryCode = feature.properties.country || feature.properties.iso1A2;
          return featuresByCode[countryCode];
        }
        function featureForLoc(loc, opts) {
          if (opts && opts.level && opts.level !== 'country') {
-           let features = featuresContaining(loc);
-           let targetLevel = opts.level;
-           let targetLevelIndex = levels.indexOf(targetLevel);
-           if (targetLevelIndex === -1) return null;
-           for (let i in features) {
-             let feature = features[i];
+           var features = featuresContaining(loc);
+           var targetLevel = opts.level;
+           var targetLevelIndex = levels.indexOf(targetLevel);
+           if (targetLevelIndex === -1) { return null; }
+           for (var i in features) {
+             var feature = features[i];
              if (
                feature.properties.level === targetLevel ||
                levels.indexOf(feature.properties.level) > targetLevelIndex
          return countryFeature(loc);
        }
        function featureForID(id) {
-         let stringID;
+         var stringID;
          if (typeof id === 'number') {
            stringID = id.toString();
            if (stringID.length === 1) {
          return featureForID(query);
        }
        function iso1A2Code(query, opts) {
-         let match = feature(query, opts);
-         if (!match) return null;
+         var match = feature(query, opts);
+         if (!match) { return null; }
          return match.properties.iso1A2 || null;
        }
        function featuresContaining(query, strict) {
-         let feature = smallestOrMatchingFeature(query);
-         if (!feature) return [];
-         let features = [];
+         var feature = smallestOrMatchingFeature(query);
+         if (!feature) { return []; }
+         var features = [];
          if (!strict || typeof query === 'object') {
            features.push(feature);
          }
-         let properties = feature.properties;
-         for (let i in properties.groups) {
-           let groupID = properties.groups[i];
+         var properties = feature.properties;
+         for (var i in properties.groups) {
+           var groupID = properties.groups[i];
            features.push(featuresByCode[groupID]);
          }
          return features;
        }
        function roadSpeedUnit(query) {
-         let feature = smallestOrMatchingFeature(query);
+         var feature = smallestOrMatchingFeature(query);
          return (feature && feature.properties.roadSpeedUnit) || null;
        }
 
-       let _dataDeprecated;
-       let _nsi;
+       var _dataDeprecated;
+       var _nsi;
 
        function validationOutdatedTags() {
-         const type = 'outdated_tags';
-         const nsiKeys = ['amenity', 'shop', 'tourism', 'leisure', 'office'];
+         var type = 'outdated_tags';
+         var nsiKeys = ['amenity', 'shop', 'tourism', 'leisure', 'office'];
 
          // A concern here in switching to async data means that `_dataDeprecated`
          // and `_nsi` will not be available at first, so the data on early tiles
 
          // initialize deprecated tags array
          _mainFileFetcher.get('deprecated')
-           .then(d => _dataDeprecated = d)
-           .catch(() => { /* ignore */ });
+           .then(function (d) { return _dataDeprecated = d; })
+           .catch(function () { /* ignore */ });
 
          _mainFileFetcher.get('nsi_brands')
-           .then(d => {
+           .then(function (d) {
              _nsi = {
                brands: d.brands,
                matcher: matcher$1(),
              _nsi.matcher.buildMatchIndex(d.brands);
 
              // index all known wikipedia and wikidata tags
-             Object.keys(d.brands).forEach(kvnd => {
-               const brand = d.brands[kvnd];
-               const wd = brand.tags['brand:wikidata'];
-               const wp = brand.tags['brand:wikipedia'];
+             Object.keys(d.brands).forEach(function (kvnd) {
+               var brand = d.brands[kvnd];
+               var wd = brand.tags['brand:wikidata'];
+               var wp = brand.tags['brand:wikipedia'];
                if (wd) { _nsi.wikidata[wd] = kvnd; }
                if (wp) { _nsi.wikipedia[wp] = kvnd; }
              });
 
              return _nsi;
            })
-           .catch(() => { /* ignore */ });
+           .catch(function () { /* ignore */ });
 
 
          function oldTagIssues(entity, graph) {
-           const oldTags = Object.assign({}, entity.tags);  // shallow copy
-           let preset = _mainPresetIndex.match(entity, graph);
-           let subtype = 'deprecated_tags';
-           if (!preset) return [];
+           var oldTags = Object.assign({}, entity.tags);  // shallow copy
+           var preset = _mainPresetIndex.match(entity, graph);
+           var subtype = 'deprecated_tags';
+           if (!preset) { return []; }
 
            // upgrade preset..
            if (preset.replacement) {
-             const newPreset = _mainPresetIndex.item(preset.replacement);
+             var newPreset = _mainPresetIndex.item(preset.replacement);
              graph = actionChangePreset(entity.id, preset, newPreset, true /* skip field defaults */)(graph);
              entity = graph.entity(entity.id);
              preset = newPreset;
 
            // upgrade tags..
            if (_dataDeprecated) {
-             const deprecatedTags = entity.deprecatedTags(_dataDeprecated);
+             var deprecatedTags = entity.deprecatedTags(_dataDeprecated);
              if (deprecatedTags.length) {
-               deprecatedTags.forEach(tag => {
+               deprecatedTags.forEach(function (tag) {
                  graph = actionUpgradeTags(entity.id, tag.old, tag.replace)(graph);
                });
                entity = graph.entity(entity.id);
            }
 
            // add missing addTags..
-           let newTags = Object.assign({}, entity.tags);  // shallow copy
+           var newTags = Object.assign({}, entity.tags);  // shallow copy
            if (preset.tags !== preset.addTags) {
-             Object.keys(preset.addTags).forEach(k => {
+             Object.keys(preset.addTags).forEach(function (k) {
                if (!newTags[k]) {
                  if (preset.addTags[k] === '*') {
                    newTags[k] = 'yes';
            if (_nsi) {
              // Do `wikidata` or `wikipedia` identify this entity as a brand?  #6416
              // If so, these tags can be swapped to `brand:wikidata`/`brand:wikipedia`
-             let isBrand;
+             var isBrand;
              if (newTags.wikidata) {                 // try matching `wikidata`
                isBrand = _nsi.wikidata[newTags.wikidata];
              }
 
              // try key/value|name match against name-suggestion-index
              if (newTags.name) {
-               for (let i = 0; i < nsiKeys.length; i++) {
-                 const k = nsiKeys[i];
-                 if (!newTags[k]) continue;
+               for (var i = 0; i < nsiKeys.length; i++) {
+                 var k = nsiKeys[i];
+                 if (!newTags[k]) { continue; }
 
-                 const center = entity.extent(graph).center();
-                 const countryCode = iso1A2Code(center);
-                 const match = _nsi.matcher.matchKVN(k, newTags[k], newTags.name, countryCode && countryCode.toLowerCase());
-                 if (!match) continue;
+                 var center = entity.extent(graph).center();
+                 var countryCode = iso1A2Code(center);
+                 var match = _nsi.matcher.matchKVN(k, newTags[k], newTags.name, countryCode && countryCode.toLowerCase());
+                 if (!match) { continue; }
 
                  // for now skip ambiguous matches (like Target~(USA) vs Target~(Australia))
-                 if (match.d) continue;
+                 if (match.d) { continue; }
 
-                 const brand = _nsi.brands[match.kvnd];
+                 var brand = _nsi.brands[match.kvnd];
                  if (brand && brand.tags['brand:wikidata'] &&
                    brand.tags['brand:wikidata'] !== entity.tags['not:brand:wikidata']) {
                    subtype = 'noncanonical_brand';
 
-                   const keepTags = ['takeaway'].reduce((acc, k) => {
+                   var keepTags = ['takeaway'].reduce(function (acc, k) {
                      if (newTags[k]) {
                        acc[k] = newTags[k];
                      }
                      return acc;
                    }, {});
 
-                   nsiKeys.forEach(k => delete newTags[k]);
+                   nsiKeys.forEach(function (k) { return delete newTags[k]; });
                    Object.assign(newTags, brand.tags, keepTags);
                    break;
                  }
            }
 
            // determine diff
-           const tagDiff = utilTagDiff(oldTags, newTags);
-           if (!tagDiff.length) return [];
+           var tagDiff = utilTagDiff(oldTags, newTags);
+           if (!tagDiff.length) { return []; }
 
-           const isOnlyAddingTags = tagDiff.every(d => d.type === '+');
+           var isOnlyAddingTags = tagDiff.every(function (d) { return d.type === '+'; });
 
-           let prefix = '';
+           var prefix = '';
            if (subtype === 'noncanonical_brand') {
              prefix = 'noncanonical_brand.';
            } else if (subtype === 'deprecated_tags' && isOnlyAddingTags) {
            }
 
            // don't allow autofixing brand tags
-           let autoArgs = subtype !== 'noncanonical_brand' ? [doUpgrade, _t('issues.fix.upgrade_tags.annotation')] : null;
+           var autoArgs = subtype !== 'noncanonical_brand' ? [doUpgrade, _t('issues.fix.upgrade_tags.annotation')] : null;
 
            return [new validationIssue({
              type: type,
              reference: showReference,
              entityIds: [entity.id],
              hash: JSON.stringify(tagDiff),
-             dynamicFixes: () => {
+             dynamicFixes: function () {
                return [
                  new validationIssueFix({
                    autoArgs: autoArgs,
                    title: _t('issues.fix.upgrade_tags.title'),
-                   onClick: (context) => {
+                   onClick: function (context) {
                      context.perform(doUpgrade, _t('issues.fix.upgrade_tags.annotation'));
                    }
                  })
 
 
            function doUpgrade(graph) {
-             const currEntity = graph.hasEntity(entity.id);
-             if (!currEntity) return graph;
+             var currEntity = graph.hasEntity(entity.id);
+             if (!currEntity) { return graph; }
 
-             let newTags = Object.assign({}, currEntity.tags);  // shallow copy
-             tagDiff.forEach(diff => {
+             var newTags = Object.assign({}, currEntity.tags);  // shallow copy
+             tagDiff.forEach(function (diff) {
                if (diff.type === '-') {
                  delete newTags[diff.key];
                } else if (diff.type === '+') {
 
 
            function showMessage(context) {
-             const currEntity = context.hasEntity(entity.id);
-             if (!currEntity) return '';
+             var currEntity = context.hasEntity(entity.id);
+             if (!currEntity) { return ''; }
 
-             let messageID = `issues.outdated_tags.${prefix}message`;
+             var messageID = "issues.outdated_tags." + prefix + "message";
              if (subtype === 'noncanonical_brand' && isOnlyAddingTags) {
                messageID += '_incomplete';
              }
 
 
            function showReference(selection) {
-             let enter = selection.selectAll('.issue-reference')
+             var enter = selection.selectAll('.issue-reference')
                .data([0])
                .enter();
 
              enter
                .append('div')
                .attr('class', 'issue-reference')
-               .text(_t(`issues.outdated_tags.${prefix}reference`));
+               .text(_t(("issues.outdated_tags." + prefix + "reference")));
 
              enter
                .append('strong')
                .append('tr')
                .attr('class', 'tagDiff-row')
                .append('td')
-               .attr('class', d => {
-                 let klass = d.type === '+' ? 'add' : 'remove';
-                 return `tagDiff-cell tagDiff-cell-${klass}`;
+               .attr('class', function (d) {
+                 var klass = d.type === '+' ? 'add' : 'remove';
+                 return ("tagDiff-cell tagDiff-cell-" + klass);
                })
-               .text(d => d.display);
+               .text(function (d) { return d.display; });
            }
          }
 
 
          function oldMultipolygonIssues(entity, graph) {
-           let multipolygon, outerWay;
+           var multipolygon, outerWay;
            if (entity.type === 'relation') {
              outerWay = osmOldMultipolygonOuterMemberOfRelation(entity, graph);
              multipolygon = entity;
              return [];
            }
 
-           if (!multipolygon || !outerWay) return [];
+           if (!multipolygon || !outerWay) { return []; }
 
            return [new validationIssue({
              type: type,
              message: showMessage,
              reference: showReference,
              entityIds: [outerWay.id, multipolygon.id],
-             dynamicFixes: () => {
+             dynamicFixes: function () {
                return [
                  new validationIssueFix({
                    autoArgs: [doUpgrade, _t('issues.fix.move_tags.annotation')],
                    title: _t('issues.fix.move_tags.title'),
-                   onClick: (context) => {
+                   onClick: function (context) {
                      context.perform(doUpgrade, _t('issues.fix.move_tags.annotation'));
                    }
                  })
 
 
            function doUpgrade(graph) {
-             let currMultipolygon = graph.hasEntity(multipolygon.id);
-             let currOuterWay = graph.hasEntity(outerWay.id);
-             if (!currMultipolygon || !currOuterWay) return graph;
+             var currMultipolygon = graph.hasEntity(multipolygon.id);
+             var currOuterWay = graph.hasEntity(outerWay.id);
+             if (!currMultipolygon || !currOuterWay) { return graph; }
 
              currMultipolygon = currMultipolygon.mergeTags(currOuterWay.tags);
              graph = graph.replace(currMultipolygon);
 
 
            function showMessage(context) {
-             let currMultipolygon = context.hasEntity(multipolygon.id);
-             if (!currMultipolygon) return '';
+             var currMultipolygon = context.hasEntity(multipolygon.id);
+             if (!currMultipolygon) { return ''; }
 
              return _t('issues.old_multipolygon.message',
                  { multipolygon: utilDisplayLabel(currMultipolygon, context.graph()) }
          }
 
 
-         let validation = function checkOutdatedTags(entity, graph) {
-           let issues = oldMultipolygonIssues(entity, graph);
-           if (!issues.length) issues = oldTagIssues(entity, graph);
+         var validation = function checkOutdatedTags(entity, graph) {
+           var issues = oldMultipolygonIssues(entity, graph);
+           if (!issues.length) { issues = oldTagIssues(entity, graph); }
            return issues;
          };
 
 
            var validation = function checkPrivateData(entity) {
                var tags = entity.tags;
-               if (!tags.building || !privateBuildingValues[tags.building]) return [];
+               if (!tags.building || !privateBuildingValues[tags.building]) { return []; }
 
                var keepTags = {};
                for (var k in tags) {
-                   if (publicKeys[k]) return [];  // probably a public feature
+                   if (publicKeys[k]) { return []; }  // probably a public feature
                    if (!personalTags[k]) {
                        keepTags[k] = tags[k];
                    }
                }
 
                var tagDiff = utilTagDiff(tags, keepTags);
-               if (!tagDiff.length) return [];
+               if (!tagDiff.length) { return []; }
 
                var fixID = tagDiff.length === 1 ? 'remove_tag' : 'remove_tags';
 
 
                function doUpgrade(graph) {
                    var currEntity = graph.hasEntity(entity.id);
-                   if (!currEntity) return graph;
+                   if (!currEntity) { return graph; }
 
                    var newTags = Object.assign({}, currEntity.tags);  // shallow copy
                    tagDiff.forEach(function(diff) {
 
                function showMessage(context) {
                    var currEntity = context.hasEntity(this.entityIds[0]);
-                   if (!currEntity) return '';
+                   if (!currEntity) { return ''; }
 
                    return _t('issues.private_data.contact.message',
                        { feature: utilDisplayLabel(currEntity, context.graph()) }
            return validation;
        }
 
-       let _discardNameRegexes = [];
+       var _discardNameRegexes = [];
 
        function validationSuspiciousName() {
-         const type = 'suspicious_name';
-         const keysToTestForGenericValues = [
+         var type = 'suspicious_name';
+         var keysToTestForGenericValues = [
            'aerialway', 'aeroway', 'amenity', 'building', 'craft', 'highway',
            'leisure', 'railway', 'man_made', 'office', 'shop', 'tourism', 'waterway'
          ];
          // be available at first, so the data on early tiles may not have tags validated fully.
 
          _mainFileFetcher.get('nsi_filters')
-           .then(filters => {
+           .then(function (filters) {
              // known list of generic names (e.g. "bar")
              _discardNameRegexes = filters.discardNames
-               .map(discardName => new RegExp(discardName, 'i'));
+               .map(function (discardName) { return new RegExp(discardName, 'i'); });
            })
-           .catch(() => { /* ignore */ });
+           .catch(function () { /* ignore */ });
 
 
          function isDiscardedSuggestionName(lowercaseName) {
-           return _discardNameRegexes.some(regex => regex.test(lowercaseName));
+           return _discardNameRegexes.some(function (regex) { return regex.test(lowercaseName); });
          }
 
          // test if the name is just the key or tag value (e.g. "park")
          function nameMatchesRawTag(lowercaseName, tags) {
-           for (let i = 0; i < keysToTestForGenericValues.length; i++) {
-             let key = keysToTestForGenericValues[i];
-             let val = tags[key];
+           for (var i = 0; i < keysToTestForGenericValues.length; i++) {
+             var key = keysToTestForGenericValues[i];
+             var val = tags[key];
              if (val) {
                val = val.toLowerCase();
                if (key === lowercaseName ||
              subtype: 'generic_name',
              severity: 'warning',
              message: function(context) {
-               let entity = context.hasEntity(this.entityIds[0]);
-               if (!entity) return '';
-               let preset = _mainPresetIndex.match(entity, context.graph());
-               let langName = langCode && _mainLocalizer.languageName(langCode);
+               var entity = context.hasEntity(this.entityIds[0]);
+               if (!entity) { return ''; }
+               var preset = _mainPresetIndex.match(entity, context.graph());
+               var langName = langCode && _mainLocalizer.languageName(langCode);
                return _t('issues.generic_name.message' + (langName ? '_language' : ''),
                  { feature: preset.name(), name: genericName, language: langName }
                );
                    icon: 'iD-operation-delete',
                    title: _t('issues.fix.remove_the_name.title'),
                    onClick: function(context) {
-                     let entityId = this.issue.entityIds[0];
-                     let entity = context.entity(entityId);
-                     let tags = Object.assign({}, entity.tags);   // shallow copy
+                     var entityId = this.issue.entityIds[0];
+                     var entity = context.entity(entityId);
+                     var tags = Object.assign({}, entity.tags);   // shallow copy
                      delete tags[nameKey];
                      context.perform(
                        actionChangeTags(entityId, tags), _t('issues.fix.remove_generic_name.annotation')
              subtype: 'not_name',
              severity: 'warning',
              message: function(context) {
-               const entity = context.hasEntity(this.entityIds[0]);
-               if (!entity) return '';
-               const preset = _mainPresetIndex.match(entity, context.graph());
-               const langName = langCode && _mainLocalizer.languageName(langCode);
+               var entity = context.hasEntity(this.entityIds[0]);
+               if (!entity) { return ''; }
+               var preset = _mainPresetIndex.match(entity, context.graph());
+               var langName = langCode && _mainLocalizer.languageName(langCode);
                return _t('issues.incorrect_name.message' + (langName ? '_language' : ''),
                  { feature: preset.name(), name: incorrectName, language: langName }
                );
                    icon: 'iD-operation-delete',
                    title: _t('issues.fix.remove_the_name.title'),
                    onClick: function(context) {
-                     const entityId = this.issue.entityIds[0];
-                     const entity = context.entity(entityId);
-                     let tags = Object.assign({}, entity.tags);   // shallow copy
+                     var entityId = this.issue.entityIds[0];
+                     var entity = context.entity(entityId);
+                     var tags = Object.assign({}, entity.tags);   // shallow copy
                      delete tags[nameKey];
                      context.perform(
                        actionChangeTags(entityId, tags), _t('issues.fix.remove_mistaken_name.annotation')
          }
 
 
-         let validation = function checkGenericName(entity) {
+         var validation = function checkGenericName(entity) {
            // a generic name is okay if it's a known brand or entity
-           if (entity.hasWikidata()) return [];
+           if (entity.hasWikidata()) { return []; }
 
-           let issues = [];
-           const notNames = (entity.tags['not:name'] || '').split(';');
+           var issues = [];
+           var notNames = (entity.tags['not:name'] || '').split(';');
 
-           for (let key in entity.tags) {
-             const m = key.match(/^name(?:(?::)([a-zA-Z_-]+))?$/);
-             if (!m) continue;
+           for (var key in entity.tags) {
+             var m = key.match(/^name(?:(?::)([a-zA-Z_-]+))?$/);
+             if (!m) { continue; }
 
-             const langCode = m.length >= 2 ? m[1] : null;
-             const value = entity.tags[key];
+             var langCode = m.length >= 2 ? m[1] : null;
+             var value = entity.tags[key];
              if (notNames.length) {
-               for (let i in notNames) {
-                 const notName = notNames[i];
+               for (var i in notNames) {
+                 var notName = notNames[i];
                  if (notName && value === notName) {
                    issues.push(makeIncorrectNameIssue(entity.id, key, value, langCode));
                    continue;
            var nodeThreshold = 10;
 
            function isBuilding(entity, graph) {
-               if (entity.type !== 'way' || entity.geometry(graph) !== 'area') return false;
+               if (entity.type !== 'way' || entity.geometry(graph) !== 'area') { return false; }
                return entity.tags.building && entity.tags.building !== 'no';
            }
 
 
            var validation = function checkUnsquareWay(entity, graph) {
 
-               if (!isBuilding(entity, graph)) return [];
+               if (!isBuilding(entity, graph)) { return []; }
 
                // don't flag ways marked as physically unsquare
-               if (entity.tags.nonsquare === 'yes') return [];
+               if (entity.tags.nonsquare === 'yes') { return []; }
 
                var isClosed = entity.isClosed();
-               if (!isClosed) return [];        // this building has bigger problems
+               if (!isClosed) { return []; }        // this building has bigger problems
 
                // don't flag ways with lots of nodes since they are likely detail-mapped
                var nodes = graph.childNodes(entity).slice();    // shallow copy
-               if (nodes.length > nodeThreshold + 1) return [];   // +1 because closing node appears twice
+               if (nodes.length > nodeThreshold + 1) { return []; }   // +1 because closing node appears twice
 
                // ignore if not all nodes are fully downloaded
                var osm = services.osm;
-               if (!osm || nodes.some(function(node) { return !osm.isDataLoaded(node.loc); })) return [];
+               if (!osm || nodes.some(function(node) { return !osm.isDataLoaded(node.loc); })) { return []; }
 
                // don't flag connected ways to avoid unresolvable unsquare loops
                var hasConnectedSquarableWays = nodes.some(function(node) {
                    return graph.parentWays(node).some(function(way) {
-                       if (way.id === entity.id) return false;
-                       if (isBuilding(way, graph)) return true;
+                       if (way.id === entity.id) { return false; }
+                       if (isBuilding(way, graph)) { return true; }
                        return graph.parentRelations(way).some(function(parentRelation) {
                            return parentRelation.isMultipolygon() &&
                                parentRelation.tags.building &&
                        });
                    });
                });
-               if (hasConnectedSquarableWays) return [];
+               if (hasConnectedSquarableWays) { return []; }
 
 
                // user-configurable square threshold
                var degreeThreshold = isNaN(storedDegreeThreshold) ? DEFAULT_DEG_THRESHOLD : parseFloat(storedDegreeThreshold);
 
                var points = nodes.map(function(node) { return context.projection(node.loc); });
-               if (!geoOrthoCanOrthogonalize(points, isClosed, epsilon, degreeThreshold, true)) return [];
+               if (!geoOrthoCanOrthogonalize(points, isClosed, epsilon, degreeThreshold, true)) { return []; }
 
                var autoArgs;
                // don't allow autosquaring features linked to wikidata
                                    // run after the squaring transition (currently 150ms)
                                    window.setTimeout(function() { completionHandler(); }, 175);
                                }
-                           }),
-                           /*
-                           new validationIssueFix({
-                               title: t('issues.fix.tag_as_unsquare.title'),
-                               onClick: function(context) {
-                                   var entityId = this.issue.entityIds[0];
-                                   var entity = context.entity(entityId);
-                                   var tags = Object.assign({}, entity.tags);  // shallow copy
-                                   tags.nonsquare = 'yes';
-                                   context.perform(
-                                       actionChangeTags(entityId, tags),
-                                       t('issues.fix.tag_as_unsquare.annotation')
-                                   );
-                               }
-                           })
-                           */
-                       ];
+                           }) ];
                    }
                })];
 
            //
            validator.init = function() {
                Object.values(Validations).forEach(function(validation) {
-                   if (typeof validation !== 'function') return;
+                   if (typeof validation !== 'function') { return; }
 
                    var fn = validation(context);
                    var key = fn.type;
            function reloadUnsquareIssues(cache, graph) {
 
                var checkUnsquareWay = _rules.unsquare_way;
-               if (typeof checkUnsquareWay !== 'function') return;
+               if (typeof checkUnsquareWay !== 'function') { return; }
 
                // uncache existing
                cache.uncacheIssuesOfType('unsquare_way');
                // rerun for all buildings
                buildings.forEach(function(entity) {
                    var detected = checkUnsquareWay(entity, graph);
-                   if (detected.length !== 1) return;
+                   if (detected.length !== 1) { return; }
                    var issue = detected[0];
                    if (!cache.issuesByEntityID[entity.id]) {
                        cache.issuesByEntityID[entity.id] = new Set();
                var view = context.map().extent();
 
                return issues.filter(function(issue) {
-                   if (!issue) return false;
-                   if (opts.includeDisabledRules === 'only' && !_disabledRules[issue.type]) return false;
-                   if (!opts.includeDisabledRules && _disabledRules[issue.type]) return false;
+                   if (!issue) { return false; }
+                   if (opts.includeDisabledRules === 'only' && !_disabledRules[issue.type]) { return false; }
+                   if (!opts.includeDisabledRules && _disabledRules[issue.type]) { return false; }
 
-                   if (opts.includeIgnored === 'only' && !_ignoredIssueIDs[issue.id]) return false;
-                   if (!opts.includeIgnored && _ignoredIssueIDs[issue.id]) return false;
+                   if (opts.includeIgnored === 'only' && !_ignoredIssueIDs[issue.id]) { return false; }
+                   if (!opts.includeIgnored && _ignoredIssueIDs[issue.id]) { return false; }
 
                    // Sanity check:  This issue may be for an entity that not longer exists.
                    // If we detect this, uncache and return false so it is not included..
                        }
                    }
 
-                   if (opts.what === 'edited' && _baseCache.issuesByIssueID[issue.id]) return false;
+                   if (opts.what === 'edited' && _baseCache.issuesByIssueID[issue.id]) { return false; }
 
                    if (opts.where === 'visible') {
                        var extent = issue.extent(context.graph());
-                       if (!view.intersects(extent)) return false;
+                       if (!view.intersects(extent)) { return false; }
                    }
 
                    return true;
                    if (!acc) {
                        return new Set(entityIssueIDs);
                    }
-                   return new Set([...acc].filter(function(elem) {
+                   return new Set([].concat( acc ).filter(function(elem) {
                        return entityIssueIDs.has(elem);
                    }));
                }, null) || [];
                return Array.from(issueIDs)
                    .map(function(id) { return cache.issuesByIssueID[id]; })
                    .filter(function(issue) {
-                       if (!issue) return false;
-                       if (opts.includeDisabledRules === 'only' && !_disabledRules[issue.type]) return false;
-                       if (!opts.includeDisabledRules && _disabledRules[issue.type]) return false;
+                       if (!issue) { return false; }
+                       if (opts.includeDisabledRules === 'only' && !_disabledRules[issue.type]) { return false; }
+                       if (!opts.includeDisabledRules && _disabledRules[issue.type]) { return false; }
 
-                       if (opts.includeIgnored === 'only' && !_ignoredIssueIDs[issue.id]) return false;
-                       if (!opts.includeIgnored && _ignoredIssueIDs[issue.id]) return false;
+                       if (opts.includeIgnored === 'only' && !_ignoredIssueIDs[issue.id]) { return false; }
+                       if (!opts.includeIgnored && _ignoredIssueIDs[issue.id]) { return false; }
 
                        return true;
                    }).sort(function(issue1, issue2) {
                return entityIDs.reduce(function(acc, entityID) {
                    // keep redundancy check separate from `acc` because an `entityID`
                    // could have been added to `acc` as a related entity through an earlier pass
-                   if (processedIDs.has(entityID)) return acc;
+                   if (processedIDs.has(entityID)) { return acc; }
                    processedIDs.add(entityID);
 
                    var entity = graph.hasEntity(entityID);
-                   if (!entity) return acc;
+                   if (!entity) { return acc; }
 
                    acc.add(entityID);
 
                entityIDs.forEach(function(entityID) {
                    var entity = graph.hasEntity(entityID);
                    // don't validate deleted entities
-                   if (!entity) return;
+                   if (!entity) { return; }
 
                    var issues = validateEntity(entity, graph);
                    cache.cacheIssues(issues);
            // When merging fetched data:
            context.history()
                .on('merge.validator', function(entities) {
-                   if (!entities) return;
+                   if (!entities) { return; }
                    var handle = window.requestIdleCallback(function() {
                        var entityIDs = entities.map(function(entity) { return entity.id; });
                        var headGraph = context.graph();
            //
            cache.uncacheEntityID = function(entityID) {
                var issueIDs = cache.issuesByEntityID[entityID];
-               if (!issueIDs) return;
+               if (!issueIDs) { return; }
 
                issueIDs.forEach(function(issueID) {
                    var issue = cache.issuesByIssueID[issueID];
                }
 
                var osm = context.connection();
-               if (!osm) return;
+               if (!osm) { return; }
 
                // If user somehow got logged out mid-save, try to reauthenticate..
                // This can happen if they were logged in from before, but the tokens are no longer valid.
            function performFullConflictCheck(changeset) {
 
                var osm = context.connection();
-               if (!osm) return;
+               if (!osm) { return; }
 
                var history = context.history();
 
                    var s = new Set(ids);
                    ids.forEach(function(id) {
                        var entity = graph.entity(id);
-                       if (entity.type !== 'way') return;
+                       if (entity.type !== 'way') { return; }
 
                        graph.childNodes(entity).forEach(function(child) {
                            if (child.version !== undefined) {
 
                // Reload modified entities into an alternate graph and check for conflicts..
                function loaded(err, result) {
-                   if (_errors.length) return;
+                   if (_errors.length) { return; }
 
                    if (err) {
                        _errors.push({
                            _loaded[entity.id] = true;
                            _toLoad = _toLoad.filter(function(val) { return val !== entity.id; });
 
-                           if (!entity.visible) return;
+                           if (!entity.visible) { return; }
 
                            // Because loadMultiple doesn't download /full like loadEntity,
                            // need to also load children that aren't already being checked..
                    }
 
                    function sameVersions(local, remote) {
-                       if (local.version !== remote.version) return false;
+                       if (local.version !== remote.version) { return false; }
 
                        if (local.type === 'way') {
                            var children = utilArrayUnion(local.nodes, remote.nodes);
                            for (var i = 0; i < children.length; i++) {
                                var a = localGraph.hasEntity(children[i]);
                                var b = remoteGraph.hasEntity(children[i]);
-                               if (a && b && a.version !== b.version) return false;
+                               if (a && b && a.version !== b.version) { return false; }
                            }
                        }
 
                        var local = localGraph.entity(id);
                        var remote = remoteGraph.entity(id);
 
-                       if (sameVersions(local, remote)) return;
+                       if (sameVersions(local, remote)) { return; }
 
                        var merge = actionMergeRemoteChanges(id, localGraph, remoteGraph, _discardTags, formatUser);
 
                        history.replace(merge);
 
                        var mergeConflicts = merge.conflicts();
-                       if (!mergeConflicts.length) return;  // merged safely
+                       if (!mergeConflicts.length) { return; }  // merged safely
 
                        var forceLocal = actionMergeRemoteChanges(id, localGraph, remoteGraph, _discardTags).withOption('force_local');
                        var forceRemote = actionMergeRemoteChanges(id, localGraph, remoteGraph, _discardTags).withOption('force_remote');
        var isRetina = window.devicePixelRatio && window.devicePixelRatio >= 2;
 
        // listen for DPI change, e.g. when dragging a browser window from a retina to non-retina screen
-       window.matchMedia(`
-        (-webkit-min-device-pixel-ratio: 2), /* Safari */
-        (min-resolution: 2dppx),             /* standard */
-        (min-resolution: 192dpi)             /* fallback */
-    `).addListener(function() {
+       window.matchMedia("\n        (-webkit-min-device-pixel-ratio: 2), /* Safari */\n        (min-resolution: 2dppx),             /* standard */\n        (min-resolution: 192dpi)             /* fallback */\n    ").addListener(function() {
 
            isRetina = window.devicePixelRatio && window.devicePixelRatio >= 2;
        });
 
 
        function localeDateString(s) {
-           if (!s) return null;
+           if (!s) { return null; }
            var options = { day: 'numeric', month: 'short', year: 'numeric' };
            var d = new Date(s);
-           if (isNaN(d.getTime())) return null;
+           if (isNaN(d.getTime())) { return null; }
            return d.toLocaleDateString(_mainLocalizer.localeCode(), options);
        }
 
            source.overzoom = data.overzoom !== false;
 
            source.offset = function(val) {
-               if (!arguments.length) return _offset;
+               if (!arguments.length) { return _offset; }
                _offset = val;
                return source;
            };
 
 
            source.area = function() {
-               if (!data.polygon) return Number.MAX_VALUE;  // worldwide
+               if (!data.polygon) { return Number.MAX_VALUE; }  // worldwide
                var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
                return isNaN(area) ? 0 : area;
            };
 
 
            source.template = function(val) {
-               if (!arguments.length) return _template;
+               if (!arguments.length) { return _template; }
                if (source.id === 'custom') {
                    _template = val;
                }
 
            source.url = function(coord) {
                var result = _template;
-               if (result === '') return result;   // source 'none'
+               if (result === '') { return result; }   // source 'none'
 
 
                // Guess a type based on the tokens present in the template
                // (This is for 'custom' source, where we don't know)
                if (!source.type) {
-                   if (/\{(proj|wkid|bbox)\}/.test(_template)) {
+                   if (/SERVICE=WMS|\{(proj|wkid|bbox)\}/.test(_template)) {
                        source.type = 'wms';
                        source.projection = 'EPSG:3857';  // guess
                    } else if (/\{(x|y)\}/.test(_template)) {
                      switch (key) {
                        case 'width':
                        case 'height':
-                         return tileSize;
+                           return tileSize;
                        case 'proj':
-                         return projection;
+                           return projection;
                        case 'wkid':
-                         return projection.replace(/^EPSG:/, '');
+                           return projection.replace(/^EPSG:/, '');
                        case 'bbox':
-                         return minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y;
+                           // WMS 1.3 flips x/y for some coordinate systems including EPSG:4326 - #7557
+                           if (projection === 'EPSG:4326' &&
+                               // The CRS parameter implies version 1.3 (prior versions use SRS)
+                               /VERSION=1.3|CRS={proj}/.test(source.template())) {
+                               return maxXminY.y + ',' + minXmaxY.x + ',' + minXmaxY.y + ',' + maxXminY.x;
+                           } else {
+                               return minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y;
+                           }
                        case 'w':
-                         return minXmaxY.x;
+                           return minXmaxY.x;
                        case 's':
-                         return maxXminY.y;
+                           return maxXminY.y;
                        case 'n':
-                         return maxXminY.x;
+                           return maxXminY.x;
                        case 'e':
-                         return minXmaxY.y;
+                           return minXmaxY.y;
                        default:
-                         return token;
+                           return token;
                      }
                    });
 
                            for (var zoom = coord[2]; zoom > 0; zoom--) {
                                var b = 0;
                                var mask = 1 << (zoom - 1);
-                               if ((coord[0] & mask) !== 0) b++;
-                               if ((coord[1] & mask) !== 0) b += 2;
+                               if ((coord[0] & mask) !== 0) { b++; }
+                               if ((coord[1] & mask) !== 0) { b += 2; }
                                u += b.toString();
                            }
                            return u;
                var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
                        '?zl=' + zoom + '&key=' + key;
 
-               if (inflight[tileID]) return;
+               if (inflight[tileID]) { return; }
 
                if (!cache[tileID]) {
                    cache[tileID] = {};
 
                        var metadata = { vintage: vintage };
                        cache[tileID].metadata = metadata;
-                       if (callback) callback(null, metadata);
+                       if (callback) { callback(null, metadata); }
                    })
                    .catch(function(err) {
                        delete inflight[tileID];
-                       if (callback) callback(err.message);
+                       if (callback) { callback(err.message); }
                    });
            };
 
            // https://developers.arcgis.com/documentation/tiled-elevation-service/
            esri.fetchTilemap = function(center) {
                // skip if we have already fetched a tilemap within 5km
-               if (_prevCenter && geoSphericalDistance(center, _prevCenter) < 5000) return;
+               if (_prevCenter && geoSphericalDistance(center, _prevCenter) < 5000) { return; }
                _prevCenter = center;
 
                // tiles are available globally to zoom level 19, afterward they may or may not be present
                var vintage = {};
                var metadata = {};
 
-               if (inflight[tileID]) return;
+               if (inflight[tileID]) { return; }
 
                switch (true) {
                    case (zoom >= 20 && esri.id === 'EsriWorldImageryClarity'):
                            }
 
                            cache[tileID].metadata = metadata;
-                           if (callback) callback(null, metadata);
+                           if (callback) { callback(null, metadata); }
                        })
                        .catch(function(err) {
                            delete inflight[tileID];
-                           if (callback) callback(err.message);
+                           if (callback) { callback(err.message); }
                        });
                }
 
            // Important that this part not depend on `_projection` because it's
            // rentered when tiles load/error (see #644).
            function render(selection) {
-               if (!_source) return;
+               if (!_source) { return; }
                var requests = [];
                var showDebug = context.getDebug('tile') && !_source.overlay;
 
 
                    tiler().forEach(function(d) {
                        addSource(d);
-                       if (d[3] === '') return;
-                       if (typeof d[3] !== 'string') return; // Workaround for #2295
+                       if (d[3] === '') { return; }
+                       if (typeof d[3] !== 'string') { return; } // Workaround for #2295
                        requests.push(d);
                        if (_cache[d[3]] === false && lookUp(d)) {
                            requests.push(addSource(lookUp(d)));
 
 
            background.projection = function(val) {
-               if (!arguments.length) return _projection;
+               if (!arguments.length) { return _projection; }
                _projection = val;
                return background;
            };
 
 
            background.dimensions = function(val) {
-               if (!arguments.length) return tiler.size();
+               if (!arguments.length) { return tiler.size(); }
                tiler.size(val);
                return background;
            };
 
 
            background.source = function(val) {
-               if (!arguments.length) return _source;
+               if (!arguments.length) { return _source; }
                _source = val;
                _tileSize = _source.tileSize;
                _cache = {};
            return background;
        }
 
-       let _imageryIndex = null;
+       var _imageryIndex = null;
 
        function rendererBackground(context) {
-         const dispatch$1 = dispatch('change');
-         const detected = utilDetect();
-         const baseLayer = rendererTileLayer(context).projection(context.projection);
-         let _isValid = true;
-         let _overlayLayers = [];
-         let _brightness = 1;
-         let _contrast = 1;
-         let _saturation = 1;
-         let _sharpness = 1;
+         var dispatch$1 = dispatch('change');
+         var detected = utilDetect();
+         var baseLayer = rendererTileLayer(context).projection(context.projection);
+         var _isValid = true;
+         var _overlayLayers = [];
+         var _brightness = 1;
+         var _contrast = 1;
+         var _saturation = 1;
+         var _sharpness = 1;
 
 
          function ensureImageryIndex() {
            return _mainFileFetcher.get('imagery')
-             .then(sources => {
-               if (_imageryIndex) return _imageryIndex;
+             .then(function (sources) {
+               if (_imageryIndex) { return _imageryIndex; }
 
                _imageryIndex = {
                  imagery: sources,
                };
 
                // use which-polygon to support efficient index and querying for imagery
-               const features = sources.map(source => {
-                 if (!source.polygon) return null;
+               var features = sources.map(function (source) {
+                 if (!source.polygon) { return null; }
                  // workaround for editor-layer-index weirdness..
                  // Add an extra array nest to each element in `source.polygon`
                  // so the rings are not treated as a bunch of holes:
                  // what we have: [ [[outer],[hole],[hole]] ]
                  // what we want: [ [[outer]],[[outer]],[[outer]] ]
-                 const rings = source.polygon.map(ring => [ring]);
+                 var rings = source.polygon.map(function (ring) { return [ring]; });
 
-                 const feature = {
+                 var feature = {
                    type: 'Feature',
                    properties: { id: source.id },
                    geometry: { type: 'MultiPolygon', coordinates: rings }
 
 
                // Instantiate `rendererBackgroundSource` objects for each source
-               _imageryIndex.backgrounds = sources.map(source => {
+               _imageryIndex.backgrounds = sources.map(function (source) {
                  if (source.type === 'bing') {
                    return rendererBackgroundSource.Bing(source, dispatch$1);
                  } else if (/^EsriWorldImagery/.test(source.id)) {
                _imageryIndex.backgrounds.unshift(rendererBackgroundSource.None());
 
                // Add 'Custom'
-               let template = corePreferences('background-custom-template') || '';
-               const custom = rendererBackgroundSource.Custom(template);
+               var template = corePreferences('background-custom-template') || '';
+               var custom = rendererBackgroundSource.Custom(template);
                _imageryIndex.backgrounds.unshift(custom);
 
                return _imageryIndex;
 
 
          function background(selection) {
-           const currSource = baseLayer.source();
+           var currSource = baseLayer.source();
 
            // If we are displaying an Esri basemap at high zoom,
            // check its tilemap to see how high the zoom can go
            if (context.map().zoom() > 18) {
              if (currSource && /^EsriWorldImagery/.test(currSource.id)) {
-               const center = context.map().center();
+               var center = context.map().center();
                currSource.fetchTilemap(center);
              }
            }
 
            // Is the imagery valid here? - #4827
-           const sources = background.sources(context.map().extent());
-           const wasValid = _isValid;
-           _isValid = !!sources.filter(d => d === currSource).length;
+           var sources = background.sources(context.map().extent());
+           var wasValid = _isValid;
+           _isValid = !!sources.filter(function (d) { return d === currSource; }).length;
 
            if (wasValid !== _isValid) {      // change in valid status
              background.updateImagery();
            }
 
 
-           let baseFilter = '';
+           var baseFilter = '';
            if (detected.cssfilters) {
              if (_brightness !== 1) {
-               baseFilter += ` brightness(${_brightness})`;
+               baseFilter += " brightness(" + _brightness + ")";
              }
              if (_contrast !== 1) {
-               baseFilter += ` contrast(${_contrast})`;
+               baseFilter += " contrast(" + _contrast + ")";
              }
              if (_saturation !== 1) {
-               baseFilter += ` saturate(${_saturation})`;
+               baseFilter += " saturate(" + _saturation + ")";
              }
              if (_sharpness < 1) {  // gaussian blur
-               const blur = d3_interpolateNumber(0.5, 5)(1 - _sharpness);
-               baseFilter += ` blur(${blur}px)`;
+               var blur = d3_interpolateNumber(0.5, 5)(1 - _sharpness);
+               baseFilter += " blur(" + blur + "px)";
              }
            }
 
-           let base = selection.selectAll('.layer-background')
+           var base = selection.selectAll('.layer-background')
              .data([0]);
 
            base = base.enter()
            }
 
 
-           let imagery = base.selectAll('.layer-imagery')
+           var imagery = base.selectAll('.layer-imagery')
              .data([0]);
 
            imagery.enter()
              .call(baseLayer);
 
 
-           let maskFilter = '';
-           let mixBlendMode = '';
+           var maskFilter = '';
+           var mixBlendMode = '';
            if (detected.cssfilters && _sharpness > 1) {  // apply unsharp mask
              mixBlendMode = 'overlay';
              maskFilter = 'saturate(0) blur(3px) invert(1)';
 
-             let contrast = _sharpness - 1;
-             maskFilter += ` contrast(${contrast})`;
+             var contrast = _sharpness - 1;
+             maskFilter += " contrast(" + contrast + ")";
 
-             let brightness = d3_interpolateNumber(1, 0.85)(_sharpness - 1);
-             maskFilter += ` brightness(${brightness})`;
+             var brightness = d3_interpolateNumber(1, 0.85)(_sharpness - 1);
+             maskFilter += " brightness(" + brightness + ")";
            }
 
-           let mask = base.selectAll('.layer-unsharp-mask')
+           var mask = base.selectAll('.layer-unsharp-mask')
              .data(detected.cssfilters && _sharpness > 1 ? [0] : []);
 
            mask.exit()
              .style('mix-blend-mode', mixBlendMode || null);
 
 
-           let overlays = selection.selectAll('.layer-overlay')
-             .data(_overlayLayers, d => d.source().name());
+           var overlays = selection.selectAll('.layer-overlay')
+             .data(_overlayLayers, function (d) { return d.source().name(); });
 
            overlays.exit()
              .remove();
              .insert('div', '.layer-data')
              .attr('class', 'layer layer-overlay')
              .merge(overlays)
-             .each((layer, i, nodes) => select(nodes[i]).call(layer));
+             .each(function (layer, i, nodes) { return select(nodes[i]).call(layer); });
          }
 
 
          background.updateImagery = function() {
-           let currSource = baseLayer.source();
-           if (context.inIntro() || !currSource) return;
+           var currSource = baseLayer.source();
+           if (context.inIntro() || !currSource) { return; }
 
-           let o = _overlayLayers
-             .filter(d => !d.source().isLocatorOverlay() && !d.source().isHidden())
-             .map(d => d.source().id)
+           var o = _overlayLayers
+             .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
+             .map(function (d) { return d.source().id; })
              .join(',');
 
-           const meters = geoOffsetToMeters(currSource.offset());
-           const EPSILON = 0.01;
-           const x = +meters[0].toFixed(2);
-           const y = +meters[1].toFixed(2);
-           let hash = utilStringQs(window.location.hash);
+           var meters = geoOffsetToMeters(currSource.offset());
+           var EPSILON = 0.01;
+           var x = +meters[0].toFixed(2);
+           var y = +meters[1].toFixed(2);
+           var hash = utilStringQs(window.location.hash);
 
-           let id = currSource.id;
+           var id = currSource.id;
            if (id === 'custom') {
-             id = `custom:${currSource.template()}`;
+             id = "custom:" + (currSource.template());
            }
 
            if (id) {
            }
 
            if (Math.abs(x) > EPSILON || Math.abs(y) > EPSILON) {
-             hash.offset = `${x},${y}`;
+             hash.offset = x + "," + y;
            } else {
              delete hash.offset;
            }
              window.location.replace('#' + utilQsString(hash, true));
            }
 
-           let imageryUsed = [];
-           let photoOverlaysUsed = [];
+           var imageryUsed = [];
+           var photoOverlaysUsed = [];
 
-           const currUsed = currSource.imageryUsed();
+           var currUsed = currSource.imageryUsed();
            if (currUsed && _isValid) {
              imageryUsed.push(currUsed);
            }
 
            _overlayLayers
-             .filter(d => !d.source().isLocatorOverlay() && !d.source().isHidden())
-             .forEach(d => imageryUsed.push(d.source().imageryUsed()));
+             .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
+             .forEach(function (d) { return imageryUsed.push(d.source().imageryUsed()); });
 
-           const dataLayer = context.layers().layer('data');
+           var dataLayer = context.layers().layer('data');
            if (dataLayer && dataLayer.enabled() && dataLayer.hasData()) {
              imageryUsed.push(dataLayer.getSrc());
            }
 
-           const photoOverlayLayers = {
+           var photoOverlayLayers = {
              streetside: 'Bing Streetside',
              mapillary: 'Mapillary Images',
              'mapillary-map-features': 'Mapillary Map Features',
              openstreetcam: 'OpenStreetCam Images'
            };
 
-           for (let layerID in photoOverlayLayers) {
-             const layer = context.layers().layer(layerID);
+           for (var layerID in photoOverlayLayers) {
+             var layer = context.layers().layer(layerID);
              if (layer && layer.enabled()) {
                photoOverlaysUsed.push(layerID);
                imageryUsed.push(photoOverlayLayers[layerID]);
          };
 
 
-         background.sources = (extent, zoom, includeCurrent) => {
-           if (!_imageryIndex) return [];   // called before init()?
+         background.sources = function (extent, zoom, includeCurrent) {
+           if (!_imageryIndex) { return []; }   // called before init()?
 
-           let visible = {};
+           var visible = {};
            (_imageryIndex.query.bbox(extent.rectangle(), true) || [])
-             .forEach(d => visible[d.id] = true);
+             .forEach(function (d) { return visible[d.id] = true; });
 
-           const currSource = baseLayer.source();
+           var currSource = baseLayer.source();
 
-           return _imageryIndex.backgrounds.filter(source => {
-             if (!source.polygon) return true;                          // always include imagery with worldwide coverage
-             if (includeCurrent && currSource === source) return true;  // optionally include the current imagery
-             if (zoom && zoom < 6) return false;                        // optionally exclude local imagery at low zooms
+           return _imageryIndex.backgrounds.filter(function (source) {
+             if (!source.polygon) { return true; }                          // always include imagery with worldwide coverage
+             if (includeCurrent && currSource === source) { return true; }  // optionally include the current imagery
+             if (zoom && zoom < 6) { return false; }                        // optionally exclude local imagery at low zooms
              return visible[source.id];                                 // include imagery visible in given extent
            });
          };
 
 
-         background.dimensions = (val) => {
-           if (!val) return;
+         background.dimensions = function (val) {
+           if (!val) { return; }
            baseLayer.dimensions(val);
-           _overlayLayers.forEach(layer => layer.dimensions(val));
+           _overlayLayers.forEach(function (layer) { return layer.dimensions(val); });
          };
 
 
          background.baseLayerSource = function(d) {
-           if (!arguments.length) return baseLayer.source();
+           if (!arguments.length) { return baseLayer.source(); }
 
            // test source against OSM imagery blacklists..
-           const osm = context.connection();
-           if (!osm) return background;
+           var osm = context.connection();
+           if (!osm) { return background; }
 
-           const blacklists = osm.imageryBlacklists();
-           const template = d.template();
-           let fail = false;
-           let tested = 0;
-           let regex;
+           var blacklists = osm.imageryBlacklists();
+           var template = d.template();
+           var fail = false;
+           var tested = 0;
+           var regex;
 
-           for (let i = 0; i < blacklists.length; i++) {
+           for (var i = 0; i < blacklists.length; i++) {
              try {
                regex = new RegExp(blacklists[i]);
                fail = regex.test(template);
                tested++;
-               if (fail) break;
+               if (fail) { break; }
              } catch (e) {
                /* noop */
              }
          };
 
 
-         background.findSource = (id) => {
-           if (!id || !_imageryIndex) return null;   // called before init()?
-           return _imageryIndex.backgrounds.find(d => d.id && d.id === id);
+         background.findSource = function (id) {
+           if (!id || !_imageryIndex) { return null; }   // called before init()?
+           return _imageryIndex.backgrounds.find(function (d) { return d.id && d.id === id; });
          };
 
 
-         background.bing = () => {
+         background.bing = function () {
            background.baseLayerSource(background.findSource('Bing'));
          };
 
 
-         background.showsLayer = (d) => {
-           const currSource = baseLayer.source();
-           if (!d || !currSource) return false;
-           return d.id === currSource.id || _overlayLayers.some(layer => d.id === layer.source().id);
+         background.showsLayer = function (d) {
+           var currSource = baseLayer.source();
+           if (!d || !currSource) { return false; }
+           return d.id === currSource.id || _overlayLayers.some(function (layer) { return d.id === layer.source().id; });
          };
 
 
-         background.overlayLayerSources = () => {
-           return _overlayLayers.map(layer => layer.source());
+         background.overlayLayerSources = function () {
+           return _overlayLayers.map(function (layer) { return layer.source(); });
          };
 
 
-         background.toggleOverlayLayer = (d) => {
-           let layer;
-           for (let i = 0; i < _overlayLayers.length; i++) {
+         background.toggleOverlayLayer = function (d) {
+           var layer;
+           for (var i = 0; i < _overlayLayers.length; i++) {
              layer = _overlayLayers[i];
              if (layer.source() === d) {
                _overlayLayers.splice(i, 1);
          };
 
 
-         background.nudge = (d, zoom) => {
-           const currSource = baseLayer.source();
+         background.nudge = function (d, zoom) {
+           var currSource = baseLayer.source();
            if (currSource) {
              currSource.nudge(d, zoom);
              dispatch$1.call('change');
 
 
          background.offset = function(d) {
-           const currSource = baseLayer.source();
+           var currSource = baseLayer.source();
            if (!arguments.length) {
              return (currSource && currSource.offset()) || [0, 0];
            }
 
 
          background.brightness = function(d) {
-           if (!arguments.length) return _brightness;
+           if (!arguments.length) { return _brightness; }
            _brightness = d;
-           if (context.mode()) dispatch$1.call('change');
+           if (context.mode()) { dispatch$1.call('change'); }
            return background;
          };
 
 
          background.contrast = function(d) {
-           if (!arguments.length) return _contrast;
+           if (!arguments.length) { return _contrast; }
            _contrast = d;
-           if (context.mode()) dispatch$1.call('change');
+           if (context.mode()) { dispatch$1.call('change'); }
            return background;
          };
 
 
          background.saturation = function(d) {
-           if (!arguments.length) return _saturation;
+           if (!arguments.length) { return _saturation; }
            _saturation = d;
-           if (context.mode()) dispatch$1.call('change');
+           if (context.mode()) { dispatch$1.call('change'); }
            return background;
          };
 
 
          background.sharpness = function(d) {
-           if (!arguments.length) return _sharpness;
+           if (!arguments.length) { return _sharpness; }
            _sharpness = d;
-           if (context.mode()) dispatch$1.call('change');
+           if (context.mode()) { dispatch$1.call('change'); }
            return background;
          };
 
-         let _loadPromise;
+         var _loadPromise;
 
-         background.ensureLoaded = () => {
+         background.ensureLoaded = function () {
 
-           if (_loadPromise) return _loadPromise;
+           if (_loadPromise) { return _loadPromise; }
 
            function parseMapParams(qmap) {
-             if (!qmap) return false;
-             const params = qmap.split('/').map(Number);
-             if (params.length < 3 || params.some(isNaN)) return false;
+             if (!qmap) { return false; }
+             var params = qmap.split('/').map(Number);
+             if (params.length < 3 || params.some(isNaN)) { return false; }
              return geoExtent([params[2], params[1]]);  // lon,lat
            }
 
-           const hash = utilStringQs(window.location.hash);
-           const requested = hash.background || hash.layer;
-           let extent = parseMapParams(hash.map);
+           var hash = utilStringQs(window.location.hash);
+           var requested = hash.background || hash.layer;
+           var extent = parseMapParams(hash.map);
 
            return _loadPromise = ensureImageryIndex()
-             .then(imageryIndex => {
-               const first = imageryIndex.backgrounds.length && imageryIndex.backgrounds[0];
+             .then(function (imageryIndex) {
+               var first = imageryIndex.backgrounds.length && imageryIndex.backgrounds[0];
 
-               let best;
+               var best;
                if (!requested && extent) {
-                 best = background.sources(extent).find(s => s.best());
+                 best = background.sources(extent).find(function (s) { return s.best(); });
                }
 
                // Decide which background layer to display
                if (requested && requested.indexOf('custom:') === 0) {
-                 const template = requested.replace(/^custom:/, '');
-                 const custom = background.findSource('custom');
+                 var template = requested.replace(/^custom:/, '');
+                 var custom = background.findSource('custom');
                  background.baseLayerSource(custom.template(template));
                  corePreferences('background-custom-template', template);
                } else {
                  );
                }
 
-               const locator = imageryIndex.backgrounds.find(d => d.overlay && d.default);
+               var locator = imageryIndex.backgrounds.find(function (d) { return d.overlay && d.default; });
                if (locator) {
                  background.toggleOverlayLayer(locator);
                }
 
-               const overlays = (hash.overlays || '').split(',');
-               overlays.forEach(overlay => {
+               var overlays = (hash.overlays || '').split(',');
+               overlays.forEach(function (overlay) {
                  overlay = background.findSource(overlay);
                  if (overlay) {
                    background.toggleOverlayLayer(overlay);
                });
 
                if (hash.gpx) {
-                 const gpx = context.layers().layer('data');
+                 var gpx = context.layers().layer('data');
                  if (gpx) {
                    gpx.url(hash.gpx, '.gpx');
                  }
                }
 
                if (hash.offset) {
-                 const offset = hash.offset
+                 var offset = hash.offset
                    .replace(/;/g, ',')
                    .split(',')
-                   .map(n => !isNaN(n) && n);
+                   .map(function (n) { return !isNaN(n) && n; });
 
                  if (offset.length === 2) {
                    background.offset(geoMetersToOffset(offset));
                  }
                }
              })
-             .catch(() => { /* ignore */ });
+             .catch(function () { /* ignore */ });
          };
 
 
                        _rules[k].enable();
                    }
                }
-               if (didEnable) update();
+               if (didEnable) { update(); }
            };
 
 
                        _rules[k].disable();
                    }
                }
-               if (didDisable) update();
+               if (didDisable) { update(); }
            };
 
 
 
            features.getMatches = function(entity, resolver, geometry) {
                if (geometry === 'vertex' ||
-                   (geometry === 'relation' && !relationShouldBeChecked(entity))) return {};
+                   (geometry === 'relation' && !relationShouldBeChecked(entity))) { return {}; }
 
                var ent = osmEntity.key(entity);
                if (!_cache[ent]) {
 
                    for (var i = 0; i < _keys.length; i++) {
                        if (_keys[i] === 'others') {
-                           if (hasMatch) continue;
+                           if (hasMatch) { continue; }
 
                            // If an entity...
                            //   1. is a way that hasn't matched other 'interesting' feature rules,
 
 
            features.getParents = function(entity, resolver, geometry) {
-               if (geometry === 'point') return [];
+               if (geometry === 'point') { return []; }
 
                var ent = osmEntity.key(entity);
                if (!_cache[ent]) {
 
 
            features.isHiddenPreset = function(preset, geometry) {
-               if (!_hidden.length) return false;
-               if (!preset.tags) return false;
+               if (!_hidden.length) { return false; }
+               if (!preset.tags) { return false; }
 
                var test = preset.setTags({}, geometry);
                for (var key in _rules) {
 
 
            features.isHiddenFeature = function(entity, resolver, geometry) {
-               if (!_hidden.length) return false;
-               if (!entity.version) return false;
-               if (_forceVisible[entity.id]) return false;
+               if (!_hidden.length) { return false; }
+               if (!entity.version) { return false; }
+               if (_forceVisible[entity.id]) { return false; }
 
                var matches = Object.keys(features.getMatches(entity, resolver, geometry));
                return matches.length && matches.every(function(k) { return features.hidden(k); });
 
 
            features.isHiddenChild = function(entity, resolver, geometry) {
-               if (!_hidden.length) return false;
-               if (!entity.version || geometry === 'point') return false;
-               if (_forceVisible[entity.id]) return false;
+               if (!_hidden.length) { return false; }
+               if (!entity.version || geometry === 'point') { return false; }
+               if (_forceVisible[entity.id]) { return false; }
 
                var parents = features.getParents(entity, resolver, geometry);
-               if (!parents.length) return false;
+               if (!parents.length) { return false; }
 
                for (var i = 0; i < parents.length; i++) {
                    if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
 
 
            features.hasHiddenConnections = function(entity, resolver) {
-               if (!_hidden.length) return false;
+               if (!_hidden.length) { return false; }
 
                var childNodes, connections;
                if (entity.type === 'midpoint') {
 
 
            features.isHidden = function(entity, resolver, geometry) {
-               if (!_hidden.length) return false;
-               if (!entity.version) return false;
+               if (!_hidden.length) { return false; }
+               if (!entity.version) { return false; }
 
                var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
                return fn(entity, resolver, geometry);
 
 
            features.filter = function(d, resolver) {
-               if (!_hidden.length) return d;
+               if (!_hidden.length) { return d; }
 
                var result = [];
                for (var i = 0; i < d.length; i++) {
 
 
            features.forceVisible = function(entityIDs) {
-               if (!arguments.length) return Object.keys(_forceVisible);
+               if (!arguments.length) { return Object.keys(_forceVisible); }
 
                _forceVisible = {};
                for (var i = 0; i < entityIDs.length; i++) {
 
            // warm up the feature matching cache upon merging fetched data
            context.history().on('merge.features', function(newEntities) {
-               if (!newEntities) return;
+               if (!newEntities) { return; }
                var handle = window.requestIdleCallback(function() {
                    var graph = context.graph();
                    var types = utilArrayGroupBy(newEntities, 'type');
        // 2 = adjacent vertex - yes but pay attention segmenting a line here
        //
        function svgPassiveVertex(node, graph, activeID) {
-           if (!activeID) return 1;
-           if (activeID === node.id) return 0;
+           if (!activeID) { return 1; }
+           if (activeID === node.id) { return 0; }
 
            var parents = graph.parentWays(node);
 
 
                        if (isClosed) {  // wraparound if needed
                            max = nodes.length - 1;
-                           if (ix1 < 0)   ix1 = max + ix1;
-                           if (ix2 < 0)   ix2 = max + ix2;
-                           if (ix3 > max) ix3 = ix3 - max;
-                           if (ix4 > max) ix4 = ix4 - max;
+                           if (ix1 < 0)   { ix1 = max + ix1; }
+                           if (ix2 < 0)   { ix2 = max + ix2; }
+                           if (ix3 > max) { ix3 = ix3 - max; }
+                           if (ix4 > max) { ix4 = ix4 - max; }
                        }
 
-                       if (nodes[ix1] === activeID) return 0;        // no - prevent self intersect
-                       else if (nodes[ix2] === activeID) return 2;   // ok - adjacent
-                       else if (nodes[ix3] === activeID) return 2;   // ok - adjacent
-                       else if (nodes[ix4] === activeID) return 0;   // no - prevent self intersect
-                       else if (isClosed && nodes.indexOf(activeID) !== -1) return 0;  // no - prevent self intersect
+                       if (nodes[ix1] === activeID) { return 0; }        // no - prevent self intersect
+                       else if (nodes[ix2] === activeID) { return 2; }   // ok - adjacent
+                       else if (nodes[ix3] === activeID) { return 2; }   // ok - adjacent
+                       else if (nodes[ix4] === activeID) { return 0; }   // no - prevent self intersect
+                       else if (isClosed && nodes.indexOf(activeID) !== -1) { return 0; }  // no - prevent self intersect
                    }
                }
            }
                for (i = 0; i < primaries.length; i++) {
                    k = primaries[i];
                    v = t[k];
-                   if (!v || v === 'no') continue;
+                   if (!v || v === 'no') { continue; }
 
                    if (k === 'piste:type') {  // avoid a ':' in the class name
                        k = 'piste';
                        for (j = 0; j < primaries.length; j++) {
                            k = statuses[i] + ':' + primaries[j];  // e.g. `demolished:building=yes`
                            v = t[k];
-                           if (!v || v === 'no') continue;
+                           if (!v || v === 'no') { continue; }
 
                            status = statuses[i];
                            break;
                    for (i = 0; i < statuses.length; i++) {
                        k = statuses[i];
                        v = t[k];
-                       if (!v || v === 'no') continue;
+                       if (!v || v === 'no') { continue; }
 
                        if (v === 'yes') {   // e.g. `railway=rail + abandoned=yes`
                            status = k;
                            classes.push('tag-' + v);
                        }  // else ignore e.g.  `highway=path + abandoned=railway`
 
-                       if (status) break;
+                       if (status) { break; }
                    }
                }
 
                for (i = 0; i < secondaries.length; i++) {
                    k = secondaries[i];
                    v = t[k];
-                   if (!v || v === 'no' || k === primary) continue;
+                   if (!v || v === 'no' || k === primary) { continue; }
                    classes.push('tag-' + k);
                    classes.push('tag-' + k + '-' + v);
                }
 
 
            tagClasses.tags = function(val) {
-               if (!arguments.length) return _tags;
+               if (!arguments.length) { return _tags; }
                _tags = val;
                return tagClasses;
            };
                grave_yard: 'cemetery',
                grass: [
                    { golf: 'green', pattern: 'golf_green' },
-                   { pattern: 'grass' },
-               ],
+                   { pattern: 'grass' } ],
                landfill: 'landfill',
                meadow: 'meadow',
                military: 'construction',
            },
            traffic_calming: {
                island: [
-                   { surface: 'grass', pattern: 'grass' },
-               ],
+                   { surface: 'grass', pattern: 'grass' } ],
                chicane: [
-                   { surface: 'grass', pattern: 'grass' },
-               ],
+                   { surface: 'grass', pattern: 'grass' } ],
                choker: [
-                   { surface: 'grass', pattern: 'grass' },
-               ]
+                   { surface: 'grass', pattern: 'grass' } ]
            }
        };
 
 
            for (var tag in patterns) {
                var entityValue = tags[tag];
-               if (!entityValue) continue;
+               if (!entityValue) { continue; }
 
                if (typeof patterns[tag] === 'string') { // extra short syntax (just tag) - pattern name
                    return 'pattern-' + patterns[tag];
                } else {
                    var values = patterns[tag];
                    for (var value in values) {
-                       if (entityValue !== value) continue;
+                       if (entityValue !== value) { continue; }
 
                        var rules = values[value];
                        if (typeof rules === 'string') { // short syntax - pattern name
 
                for (var i = 0; i < entities.length; i++) {
                    var entity = entities[i];
-                   if (entity.geometry(graph) !== 'area') continue;
+                   if (entity.geometry(graph) !== 'area') { continue; }
 
                    multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
                    if (multipolygon) {
                reg.exec(source);//skip <
                while(match = reg.exec(source)){
                        buf.push(match);
-                       if(match[1])return buf;
+                       if(match[1]){ return buf; }
                }
        }
 
                        error = this;
                        Error.call(this, ExceptionMessage[code]);
                        this.message = ExceptionMessage[code];
-                       if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException$2);
+                       if(Error.captureStackTrace) { Error.captureStackTrace(this, DOMException$2); }
                }
                error.code = code;
-               if(message) this.message = this.message + ": " + message;
+               if(message) { this.message = this.message + ": " + message; }
                return error;
        }DOMException$2.prototype = Error.prototype;
        copy$2(ExceptionCode,DOMException$2);
                        if(prefix == null){
                                //isHTML = true;
                                var visibleNamespaces=[
-                               {namespace:uri,prefix:null}
-                               //{namespace:uri,prefix:''}
-                               ];
+                               {namespace:uri,prefix:null} ];
                        }
                }
                serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
                }
                switch(node.nodeType){
                case ELEMENT_NODE:
-                       if (!visibleNamespaces) visibleNamespaces = [];
+                       if (!visibleNamespaces) { visibleNamespaces = []; }
                        var startVisibleNamespaces = visibleNamespaces.length;
                        var attrs = node.attributes;
                        var len = attrs.length;
                splitSpace = /\s+/;
            // generate a short, numeric hash of a string
            function okhash(x) {
-               if (!x || !x.length) return 0;
+               if (!x || !x.length) { return 0; }
                for (var i = 0, h = 0; i < x.length; i++) {
                    h = ((h << 5) - h) + x.charCodeAt(i) | 0;
                } return h;
                var o = {}, n, k;
                for (k = 0; k < ys.length; k++) {
                    n = get1(x, ys[k]);
-                   if (n) o[ys[k]] = nodeVal(n);
+                   if (n) { o[ys[k]] = nodeVal(n); }
                }
                return o;
            }
            // add properties of Y to X, overwriting if present in both
-           function extend(x, y) { for (var k in y) x[k] = y[k]; }
+           function extend(x, y) { for (var k in y) { x[k] = y[k]; } }
            // get one coordinate from a coordinate array, if any
            function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
            // get all coordinates from a coordinate array as [[],[]]
                // IE9 will create a new XMLSerializer but it'll crash immediately.
                // This line is ignored because we don't run coverage tests in IE9
                /* istanbul ignore next */
-               if (str.xml !== undefined) return str.xml;
+               if (str.xml !== undefined) { return str.xml; }
                return serializer.serializeToString(str);
            }
 
                    function gxCoord(v) { return numarray(v.split(' ')); }
                    function gxCoords(root) {
                        var elems = get(root, 'coord'), coords = [], times = [];
-                       if (elems.length === 0) elems = get(root, 'gx:coord');
-                       for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
+                       if (elems.length === 0) { elems = get(root, 'gx:coord'); }
+                       for (var i = 0; i < elems.length; i++) { coords.push(gxCoord(nodeVal(elems[i]))); }
                        var timeElems = get(root, 'when');
-                       for (var j = 0; j < timeElems.length; j++) times.push(nodeVal(timeElems[j]));
+                       for (var j = 0; j < timeElems.length; j++) { times.push(nodeVal(timeElems[j])); }
                        return {
                            coords: coords,
                            times: times
                                            type: 'LineString',
                                            coordinates: track.coords
                                        });
-                                       if (track.times.length) coordTimes.push(track.times);
+                                       if (track.times.length) { coordTimes.push(track.times); }
                                    }
                                }
                            }
                            polyStyle = get1(root, 'PolyStyle'),
                            visibility = get1(root, 'visibility');
 
-                       if (!geomsAndTimes.geoms.length) return [];
-                       if (name) properties.name = name;
-                       if (address) properties.address = address;
+                       if (!geomsAndTimes.geoms.length) { return []; }
+                       if (name) { properties.name = name; }
+                       if (address) { properties.address = address; }
                        if (styleUrl) {
                            if (styleUrl[0] !== '#') {
                                styleUrl = '#' + styleUrl;
                            // Try to populate the lineStyle or polyStyle since we got the style hash
                            var style = styleByHash[properties.styleHash];
                            if (style) {
-                               if (!lineStyle) lineStyle = get1(style, 'LineStyle');
-                               if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
+                               if (!lineStyle) { lineStyle = get1(style, 'LineStyle'); }
+                               if (!polyStyle) { polyStyle = get1(style, 'PolyStyle'); }
                            }
                        }
-                       if (description) properties.description = description;
+                       if (description) { properties.description = description; }
                        if (timeSpan) {
                            var begin = nodeVal(get1(timeSpan, 'begin'));
                            var end = nodeVal(get1(timeSpan, 'end'));
                                color = linestyles[0],
                                opacity = linestyles[1],
                                width = parseFloat(nodeVal(get1(lineStyle, 'width')));
-                           if (color) properties.stroke = color;
-                           if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
-                           if (!isNaN(width)) properties['stroke-width'] = width;
+                           if (color) { properties.stroke = color; }
+                           if (!isNaN(opacity)) { properties['stroke-opacity'] = opacity; }
+                           if (!isNaN(width)) { properties['stroke-width'] = width; }
                        }
                        if (polyStyle) {
                            var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
                                popacity = polystyles[1],
                                fill = nodeVal(get1(polyStyle, 'fill')),
                                outline = nodeVal(get1(polyStyle, 'outline'));
-                           if (pcolor) properties.fill = pcolor;
-                           if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
-                           if (fill) properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0;
-                           if (outline) properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0;
+                           if (pcolor) { properties.fill = pcolor; }
+                           if (!isNaN(popacity)) { properties['fill-opacity'] = popacity; }
+                           if (fill) { properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0; }
+                           if (outline) { properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0; }
                        }
                        if (extendedData) {
                            var datas = get(extendedData, 'Data'),
                            },
                            properties: properties
                        };
-                       if (attr(root, 'id')) feature.id = attr(root, 'id');
+                       if (attr(root, 'id')) { feature.id = attr(root, 'id'); }
                        return [feature];
                    }
                    return gj;
                        feature;
                    for (i = 0; i < tracks.length; i++) {
                        feature = getTrack(tracks[i]);
-                       if (feature) gj.features.push(feature);
+                       if (feature) { gj.features.push(feature); }
                    }
                    for (i = 0; i < routes.length; i++) {
                        feature = getRoute(routes[i]);
-                       if (feature) gj.features.push(feature);
+                       if (feature) { gj.features.push(feature); }
                    }
                    for (i = 0; i < waypoints.length; i++) {
                        gj.features.push(getPoint(waypoints[i]));
                            times = [],
                            heartRates = [],
                            l = pts.length;
-                       if (l < 2) return {};  // Invalid line in GeoJSON
+                       if (l < 2) { return {}; }  // Invalid line in GeoJSON
                        for (var i = 0; i < l; i++) {
                            var c = coordPair(pts[i]);
                            line.push(c.coordinates);
-                           if (c.time) times.push(c.time);
-                           if (c.heartRate) heartRates.push(c.heartRate);
+                           if (c.time) { times.push(c.time); }
+                           if (c.heartRate) { heartRates.push(c.heartRate); }
                        }
                        return {
                            line: line,
                        for (var i = 0; i < segments.length; i++) {
                            line = getPoints(segments[i], 'trkpt');
                            if (line) {
-                               if (line.line) track.push(line.line);
-                               if (line.times && line.times.length) times.push(line.times);
-                               if (line.heartRates && line.heartRates.length) heartRates.push(line.heartRates);
+                               if (line.line) { track.push(line.line); }
+                               if (line.times && line.times.length) { times.push(line.times); }
+                               if (line.heartRates && line.heartRates.length) { heartRates.push(line.heartRates); }
                            }
                        }
-                       if (track.length === 0) return;
+                       if (track.length === 0) { return; }
                        var properties = getProperties(node);
                        extend(properties, getLineStyle(get1(node, 'extensions')));
-                       if (times.length) properties.coordTimes = track.length === 1 ? times[0] : times;
-                       if (heartRates.length) properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;
+                       if (times.length) { properties.coordTimes = track.length === 1 ? times[0] : times; }
+                       if (heartRates.length) { properties.heartRates = track.length === 1 ? heartRates[0] : heartRates; }
                        return {
                            type: 'Feature',
                            properties: properties,
                    }
                    function getRoute(node) {
                        var line = getPoints(node, 'rtept');
-                       if (!line.line) return;
+                       if (!line.line) { return; }
                        var prop = getProperties(node);
                        extend(prop, getLineStyle(get1(node, 'extensions')));
                        var routeObj = {
                                var color = nodeVal(get1(lineStyle, 'color')),
                                    opacity = parseFloat(nodeVal(get1(lineStyle, 'opacity'))),
                                    width = parseFloat(nodeVal(get1(lineStyle, 'width')));
-                               if (color) style.stroke = color;
-                               if (!isNaN(opacity)) style['stroke-opacity'] = opacity;
+                               if (color) { style.stroke = color; }
+                               if (!isNaN(opacity)) { style['stroke-opacity'] = opacity; }
                                // GPX width is in mm, convert to px with 96 px per inch
-                               if (!isNaN(width)) style['stroke-width'] = width * 96 / 25.4;
+                               if (!isNaN(width)) { style['stroke-width'] = width * 96 / 25.4; }
                            }
                        }
                        return style;
                    function getProperties(node) {
                        var prop = getMulti(node, ['name', 'cmt', 'desc', 'type', 'time', 'keywords']),
                            links = get(node, 'link');
-                       if (links.length) prop.links = [];
+                       if (links.length) { prop.links = []; }
                        for (var i = 0, link; i < links.length; i++) {
                            link = { href: attr(links[i], 'href') };
                            extend(link, getMulti(links[i], ['text', 'type']));
            return t;
        })();
 
-       module.exports = toGeoJSON;
+       { module.exports = toGeoJSON; }
        });
 
        var _initialized = false;
 
 
            function init() {
-               if (_initialized) return;  // run once
+               if (_initialized) { return; }  // run once
 
                _geojson = {};
                _enabled = true;
                    .on('drop.svgData', function() {
                        event.stopPropagation();
                        event.preventDefault();
-                       if (!detected.filedrop) return;
+                       if (!detected.filedrop) { return; }
                        drawData.fileList(event.dataTransfer.files);
                    })
                    .on('dragenter.svgData', over)
 
            // ensure that all geojson features in a collection have IDs
            function ensureIDs(gj) {
-               if (!gj) return null;
+               if (!gj) { return null; }
 
                if (gj.type === 'FeatureCollection') {
                    for (var i = 0; i < gj.features.length; i++) {
 
            // ensure that each single Feature object has a unique ID
            function ensureFeatureID(feature) {
-               if (!feature) return;
+               if (!feature) { return; }
                feature.__featurehash__ = utilHashcode(fastJsonStableStringify(feature));
                return feature;
            }
 
            // Prefer an array of Features instead of a FeatureCollection
            function getFeatures(gj) {
-               if (!gj) return [];
+               if (!gj) { return []; }
 
                if (gj.type === 'FeatureCollection') {
                    return gj.features;
                    .merge(layer);
 
                var surface = context.surface();
-               if (!surface || surface.empty()) return;  // not ready to draw yet, starting up
+               if (!surface || surface.empty()) { return; }  // not ready to draw yet, starting up
 
 
                // Gather data
 
 
            function getExtension(fileName) {
-               if (!fileName) return;
+               if (!fileName) { return; }
 
                var re = /\.(gpx|kml|(geo)?json)$/i;
                var match = fileName.toLowerCase().match(re);
 
 
            drawData.showLabels = function(val) {
-               if (!arguments.length) return _showLabels;
+               if (!arguments.length) { return _showLabels; }
 
                _showLabels = val;
                return this;
 
 
            drawData.enabled = function(val) {
-               if (!arguments.length) return _enabled;
+               if (!arguments.length) { return _enabled; }
 
                _enabled = val;
                if (_enabled) {
 
 
            drawData.template = function(val, src) {
-               if (!arguments.length) return _template;
+               if (!arguments.length) { return _template; }
 
                // test source against OSM imagery blacklists..
                var osm = context.connection();
                            regex = new RegExp(blacklists[i]);
                            fail = regex.test(val);
                            tested++;
-                           if (fail) break;
+                           if (fail) { break; }
                        } catch (e) {
                            /* noop */
                        }
 
 
            drawData.geojson = function(gj, src) {
-               if (!arguments.length) return _geojson;
+               if (!arguments.length) { return _geojson; }
 
                _template = null;
                _fileList = null;
 
 
            drawData.fileList = function(fileList) {
-               if (!arguments.length) return _fileList;
+               if (!arguments.length) { return _fileList; }
 
                _template = null;
                _fileList = fileList;
                _geojson = null;
                _src = null;
 
-               if (!fileList || !fileList.length) return this;
+               if (!fileList || !fileList.length) { return this; }
                var f = fileList[0];
                var extension = getExtension(f.name);
                var reader = new FileReader();
 
            drawData.fitZoom = function() {
                var features = getFeatures(_geojson);
-               if (!features.length) return;
+               if (!features.length) { return; }
 
                var map = context.map();
                var viewport = map.trimmedExtent().polygon();
                var coords = features.reduce(function(coords, feature) {
                    var geom = feature.geometry;
-                   if (!geom) return coords;
+                   if (!geom) { return coords; }
 
                    var c = geom.coordinates;
 
        function svgDebug(projection, context) {
 
          function drawDebug(selection) {
-           const showTile = context.getDebug('tile');
-           const showCollision = context.getDebug('collision');
-           const showImagery = context.getDebug('imagery');
-           const showTouchTargets = context.getDebug('target');
-           const showDownloaded = context.getDebug('downloaded');
+           var showTile = context.getDebug('tile');
+           var showCollision = context.getDebug('collision');
+           var showImagery = context.getDebug('imagery');
+           var showTouchTargets = context.getDebug('target');
+           var showDownloaded = context.getDebug('downloaded');
 
-           let debugData = [];
+           var debugData = [];
            if (showTile) {
              debugData.push({ class: 'red', label: 'tile' });
            }
            }
 
 
-           let legend = context.container().select('.main-content')
+           var legend = context.container().select('.main-content')
              .selectAll('.debug-legend')
              .data(debugData.length ? [0] : []);
 
              .merge(legend);
 
 
-           let legendItems = legend.selectAll('.debug-legend-item')
-             .data(debugData, d => d.label);
+           var legendItems = legend.selectAll('.debug-legend-item')
+             .data(debugData, function (d) { return d.label; });
 
            legendItems.exit()
              .remove();
 
            legendItems.enter()
              .append('span')
-             .attr('class', d => `debug-legend-item ${d.class}`)
-             .text(d => d.label);
+             .attr('class', function (d) { return ("debug-legend-item " + (d.class)); })
+             .text(function (d) { return d.label; });
 
 
-           let layer = selection.selectAll('.layer-debug')
+           var layer = selection.selectAll('.layer-debug')
              .data(showImagery || showDownloaded ? [0] : []);
 
            layer.exit()
 
 
            // imagery
-           const extent = context.map().extent();
+           var extent = context.map().extent();
            _mainFileFetcher.get('imagery')
-             .then(d => {
-               const hits = (showImagery && d.query.bbox(extent.rectangle(), true)) || [];
-               const features = hits.map(d => d.features[d.id]);
+             .then(function (d) {
+               var hits = (showImagery && d.query.bbox(extent.rectangle(), true)) || [];
+               var features = hits.map(function (d) { return d.features[d.id]; });
 
-               let imagery = layer.selectAll('path.debug-imagery')
+               var imagery = layer.selectAll('path.debug-imagery')
                  .data(features);
 
                imagery.exit()
                  .append('path')
                  .attr('class', 'debug-imagery debug orange');
              })
-             .catch(() => { /* ignore */ });
+             .catch(function () { /* ignore */ });
 
            // downloaded
-           const osm = context.connection();
-           let dataDownloaded = [];
+           var osm = context.connection();
+           var dataDownloaded = [];
            if (osm && showDownloaded) {
-             const rtree = osm.caches('get').tile.rtree;
-             dataDownloaded = rtree.all().map(bbox => {
+             var rtree = osm.caches('get').tile.rtree;
+             dataDownloaded = rtree.all().map(function (bbox) {
                return {
                  type: 'Feature',
                  properties: { id: bbox.id },
              });
            }
 
-           let downloaded = layer
+           var downloaded = layer
              .selectAll('path.debug-downloaded')
              .data(showDownloaded ? dataDownloaded : []);
 
          return drawDebug;
        }
 
-       let _layerEnabled = false;
-       let _qaService;
+       var _layerEnabled = false;
+       var _qaService;
 
        function svgKeepRight(projection, context, dispatch) {
-         const throttledRedraw = throttle(() => dispatch.call('change'), 1000);
-         const minZoom = 12;
+         var throttledRedraw = throttle(function () { return dispatch.call('change'); }, 1000);
+         var minZoom = 12;
 
-         let touchLayer = select(null);
-         let drawLayer = select(null);
-         let layerVisible = false;
+         var touchLayer = select(null);
+         var drawLayer = select(null);
+         var layerVisible = false;
 
          function markerPath(selection, klass) {
            selection
              .transition()
              .duration(250)
              .style('opacity', 1)
-             .on('end interrupt', () => dispatch.call('change'));
+             .on('end interrupt', function () { return dispatch.call('change'); });
          }
 
          // Disable the layer.  This transitions the layer invisible and then hides the markers.
              .transition()
              .duration(250)
              .style('opacity', 0)
-             .on('end interrupt', () => {
+             .on('end interrupt', function () {
                editOff();
                dispatch.call('change');
              });
 
          // Update the issue markers
          function updateMarkers() {
-           if (!layerVisible || !_layerEnabled) return;
+           if (!layerVisible || !_layerEnabled) { return; }
 
-           const service = getService();
-           const selectedID = context.selectedErrorID();
-           const data = (service ? service.getItems(projection) : []);
-           const getTransform = svgPointTransform(projection);
+           var service = getService();
+           var selectedID = context.selectedErrorID();
+           var data = (service ? service.getItems(projection) : []);
+           var getTransform = svgPointTransform(projection);
 
            // Draw markers..
-           const markers = drawLayer.selectAll('.qaItem.keepRight')
-             .data(data, d => d.id);
+           var markers = drawLayer.selectAll('.qaItem.keepRight')
+             .data(data, function (d) { return d.id; });
 
            // exit
            markers.exit()
              .remove();
 
            // enter
-           const markersEnter = markers.enter()
+           var markersEnter = markers.enter()
              .append('g')
-               .attr('class', d => `qaItem ${d.service} itemId-${d.id} itemType-${d.parentIssueType}`);
+               .attr('class', function (d) { return ("qaItem " + (d.service) + " itemId-" + (d.id) + " itemType-" + (d.parentIssueType)); });
 
            markersEnter
              .append('ellipse')
            markers
              .merge(markersEnter)
              .sort(sortY)
-               .classed('selected', d => d.id === selectedID)
+               .classed('selected', function (d) { return d.id === selectedID; })
                .attr('transform', getTransform);
 
 
            // Draw targets..
-           if (touchLayer.empty()) return;
-           const fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
+           if (touchLayer.empty()) { return; }
+           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
 
-           const targets = touchLayer.selectAll('.qaItem.keepRight')
-             .data(data, d => d.id);
+           var targets = touchLayer.selectAll('.qaItem.keepRight')
+             .data(data, function (d) { return d.id; });
 
            // exit
            targets.exit()
                .attr('y', '-22px')
              .merge(targets)
              .sort(sortY)
-               .attr('class', d => `qaItem ${d.service} target ${fillClass} itemId-${d.id}`)
+               .attr('class', function (d) { return ("qaItem " + (d.service) + " target " + fillClass + " itemId-" + (d.id)); })
                .attr('transform', getTransform);
 
 
 
          // Draw the keepRight layer and schedule loading issues and updating markers.
          function drawKeepRight(selection) {
-           const service = getService();
+           var service = getService();
 
-           const surface = context.surface();
+           var surface = context.surface();
            if (surface && !surface.empty()) {
              touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
            }
 
          // Toggles the layer on and off
          drawKeepRight.enabled = function(val) {
-           if (!arguments.length) return _layerEnabled;
+           if (!arguments.length) { return _layerEnabled; }
 
            _layerEnabled = val;
            if (_layerEnabled) {
            return this;
          };
 
-         drawKeepRight.supported = () => !!getService();
+         drawKeepRight.supported = function () { return !!getService(); };
 
          return drawKeepRight;
        }
 
 
            function init() {
-               if (svgGeolocate.initialized) return;  // run once
+               if (svgGeolocate.initialized) { return; }  // run once
                svgGeolocate.enabled = false;
                svgGeolocate.initialized = true;
            }
            }
 
            drawLocation.enabled = function (position, enabled) {
-               if (!arguments.length) return svgGeolocate.enabled;
+               if (!arguments.length) { return svgGeolocate.enabled; }
                _position = position;
                svgGeolocate.enabled = enabled;
                if (svgGeolocate.enabled) {
 
            function textWidth(text, size, elem) {
                var c = _textWidthCache[size];
-               if (!c) c = _textWidthCache[size] = {};
+               if (!c) { c = _textWidthCache[size] = {}; }
 
                if (c[text]) {
                    return c[text];
                    var icon = preset && !shouldSkipIcon(preset) && preset.icon;
 
                    if (!icon && !utilDisplayName(entity))
-                       continue;
+                       { continue; }
 
                    for (k = 0; k < labelStack.length; k++) {
                        var matchGeom = labelStack[k][0];
                        if (geometry === 'point' || geometry === 'vertex') {
                            // no point or vertex labels in wireframe mode
                            // no vertex labels at low zooms (vertices have no icons)
-                           if (wireframe) continue;
+                           if (wireframe) { continue; }
                            var renderAs = renderNodeAs[entity.id];
-                           if (renderAs === 'vertex' && zoom < 17) continue;
+                           if (renderAs === 'vertex' && zoom < 17) { continue; }
 
                            p = getPointLabel(entity, width, fontSize, renderAs);
 
                        .map(function(node) { return projection(node.loc); });
                    var length = geoPathLength(points);
 
-                   if (length < width + 20) return;
+                   if (length < width + 20) { return; }
 
                    // % along the line to attempt to place the label
                    var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
                        var middle = offset / 100 * length;
                        var start = middle - width / 2;
 
-                       if (start < 0 || start + width > length) continue;
+                       if (start < 0 || start + width > length) { continue; }
 
                        // generate subpath and ignore paths that are invalid or don't cross viewport.
                        var sub = subpath(points, start, start + width);
                    var extent = entity.extent(graph);
                    var areaWidth = projection(extent[1])[0] - projection(extent[0])[0];
 
-                   if (isNaN(centroid[0]) || areaWidth < 20) return;
+                   if (isNaN(centroid[0]) || areaWidth < 20) { return; }
 
                    var preset = _mainPresetIndex.match(entity, context.graph());
                    var picon = preset && preset.icon;
            return drawLabels;
        }
 
-       let _layerEnabled$1 = false;
-       let _qaService$1;
+       var _layerEnabled$1 = false;
+       var _qaService$1;
 
        function svgImproveOSM(projection, context, dispatch) {
-         const throttledRedraw = throttle(() => dispatch.call('change'), 1000);
-         const minZoom = 12;
+         var throttledRedraw = throttle(function () { return dispatch.call('change'); }, 1000);
+         var minZoom = 12;
 
-         let touchLayer = select(null);
-         let drawLayer = select(null);
-         let layerVisible = false;
+         var touchLayer = select(null);
+         var drawLayer = select(null);
+         var layerVisible = false;
 
          function markerPath(selection, klass) {
            selection
              .transition()
              .duration(250)
              .style('opacity', 1)
-             .on('end interrupt', () => dispatch.call('change'));
+             .on('end interrupt', function () { return dispatch.call('change'); });
          }
 
          // Disable the layer.  This transitions the layer invisible and then hides the markers.
              .transition()
              .duration(250)
              .style('opacity', 0)
-             .on('end interrupt', () => {
+             .on('end interrupt', function () {
                editOff();
                dispatch.call('change');
              });
 
          // Update the issue markers
          function updateMarkers() {
-           if (!layerVisible || !_layerEnabled$1) return;
+           if (!layerVisible || !_layerEnabled$1) { return; }
 
-           const service = getService();
-           const selectedID = context.selectedErrorID();
-           const data = (service ? service.getItems(projection) : []);
-           const getTransform = svgPointTransform(projection);
+           var service = getService();
+           var selectedID = context.selectedErrorID();
+           var data = (service ? service.getItems(projection) : []);
+           var getTransform = svgPointTransform(projection);
 
            // Draw markers..
-           const markers = drawLayer.selectAll('.qaItem.improveOSM')
-             .data(data, d => d.id);
+           var markers = drawLayer.selectAll('.qaItem.improveOSM')
+             .data(data, function (d) { return d.id; });
 
            // exit
            markers.exit()
              .remove();
 
            // enter
-           const markersEnter = markers.enter()
+           var markersEnter = markers.enter()
              .append('g')
-               .attr('class', d => `qaItem ${d.service} itemId-${d.id} itemType-${d.itemType}`);
+               .attr('class', function (d) { return ("qaItem " + (d.service) + " itemId-" + (d.id) + " itemType-" + (d.itemType)); });
 
            markersEnter
              .append('polygon')
                .attr('class', 'icon-annotation')
                .attr('width', '13px')
                .attr('height', '13px')
-               .attr('xlink:href', d => {
-                 const picon = d.icon;
+               .attr('xlink:href', function (d) {
+                 var picon = d.icon;
 
                  if (!picon) {
                  return '';
                  } else {
-                 const isMaki = /^maki-/.test(picon);
-                 return `#${picon}${isMaki ? '-11' : ''}`;
+                 var isMaki = /^maki-/.test(picon);
+                 return ("#" + picon + (isMaki ? '-11' : ''));
                  }
                });
 
            markers
              .merge(markersEnter)
              .sort(sortY)
-               .classed('selected', d => d.id === selectedID)
+               .classed('selected', function (d) { return d.id === selectedID; })
                .attr('transform', getTransform);
 
 
            // Draw targets..
-           if (touchLayer.empty()) return;
-           const fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
+           if (touchLayer.empty()) { return; }
+           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
 
-           const targets = touchLayer.selectAll('.qaItem.improveOSM')
-             .data(data, d => d.id);
+           var targets = touchLayer.selectAll('.qaItem.improveOSM')
+             .data(data, function (d) { return d.id; });
 
            // exit
            targets.exit()
                .attr('y', '-28px')
              .merge(targets)
              .sort(sortY)
-               .attr('class', d => `qaItem ${d.service} target ${fillClass} itemId-${d.id}`)
+               .attr('class', function (d) { return ("qaItem " + (d.service) + " target " + fillClass + " itemId-" + (d.id)); })
                .attr('transform', getTransform);
 
            function sortY(a, b) {
 
          // Draw the ImproveOSM layer and schedule loading issues and updating markers.
          function drawImproveOSM(selection) {
-           const service = getService();
+           var service = getService();
 
-           const surface = context.surface();
+           var surface = context.surface();
            if (surface && !surface.empty()) {
              touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
            }
 
          // Toggles the layer on and off
          drawImproveOSM.enabled = function(val) {
-           if (!arguments.length) return _layerEnabled$1;
+           if (!arguments.length) { return _layerEnabled$1; }
 
            _layerEnabled$1 = val;
            if (_layerEnabled$1) {
            return this;
          };
 
-         drawImproveOSM.supported = () => !!getService();
+         drawImproveOSM.supported = function () { return !!getService(); };
 
          return drawImproveOSM;
        }
 
-       let _layerEnabled$2 = false;
-       let _qaService$2;
+       var _layerEnabled$2 = false;
+       var _qaService$2;
 
        function svgOsmose(projection, context, dispatch) {
-         const throttledRedraw = throttle(() => dispatch.call('change'), 1000);
-         const minZoom = 12;
+         var throttledRedraw = throttle(function () { return dispatch.call('change'); }, 1000);
+         var minZoom = 12;
 
-         let touchLayer = select(null);
-         let drawLayer = select(null);
-         let layerVisible = false;
+         var touchLayer = select(null);
+         var drawLayer = select(null);
+         var layerVisible = false;
 
          function markerPath(selection, klass) {
            selection
              .transition()
              .duration(250)
              .style('opacity', 1)
-             .on('end interrupt', () => dispatch.call('change'));
+             .on('end interrupt', function () { return dispatch.call('change'); });
          }
 
          // Disable the layer.  This transitions the layer invisible and then hides the markers.
              .transition()
              .duration(250)
              .style('opacity', 0)
-             .on('end interrupt', () => {
+             .on('end interrupt', function () {
                editOff();
                dispatch.call('change');
              });
 
          // Update the issue markers
          function updateMarkers() {
-           if (!layerVisible || !_layerEnabled$2) return;
+           if (!layerVisible || !_layerEnabled$2) { return; }
 
-           const service = getService();
-           const selectedID = context.selectedErrorID();
-           const data = (service ? service.getItems(projection) : []);
-           const getTransform = svgPointTransform(projection);
+           var service = getService();
+           var selectedID = context.selectedErrorID();
+           var data = (service ? service.getItems(projection) : []);
+           var getTransform = svgPointTransform(projection);
 
            // Draw markers..
-           const markers = drawLayer.selectAll('.qaItem.osmose')
-             .data(data, d => d.id);
+           var markers = drawLayer.selectAll('.qaItem.osmose')
+             .data(data, function (d) { return d.id; });
 
            // exit
            markers.exit()
              .remove();
 
            // enter
-           const markersEnter = markers.enter()
+           var markersEnter = markers.enter()
              .append('g')
-               .attr('class', d => `qaItem ${d.service} itemId-${d.id} itemType-${d.itemType}`);
+               .attr('class', function (d) { return ("qaItem " + (d.service) + " itemId-" + (d.id) + " itemType-" + (d.itemType)); });
 
            markersEnter
              .append('polygon')
 
            markersEnter
              .append('polygon')
-               .attr('fill', d => service.getColor(d.item))
+               .attr('fill', function (d) { return service.getColor(d.item); })
                .call(markerPath, 'qaItem-fill');
 
            markersEnter
                .attr('class', 'icon-annotation')
                .attr('width', '13px')
                .attr('height', '13px')
-               .attr('xlink:href', d => {
-                 const picon = d.icon;
+               .attr('xlink:href', function (d) {
+                 var picon = d.icon;
 
                  if (!picon) {
                    return '';
                  } else {
-                   const isMaki = /^maki-/.test(picon);
-                   return `#${picon}${isMaki ? '-11' : ''}`;
+                   var isMaki = /^maki-/.test(picon);
+                   return ("#" + picon + (isMaki ? '-11' : ''));
                  }
                });
 
            markers
              .merge(markersEnter)
              .sort(sortY)
-               .classed('selected', d => d.id === selectedID)
+               .classed('selected', function (d) { return d.id === selectedID; })
                .attr('transform', getTransform);
 
            // Draw targets..
-           if (touchLayer.empty()) return;
-           const fillClass = context.getDebug('target') ? 'pink' : 'nocolor';
+           if (touchLayer.empty()) { return; }
+           var fillClass = context.getDebug('target') ? 'pink' : 'nocolor';
 
-           const targets = touchLayer.selectAll('.qaItem.osmose')
-             .data(data, d => d.id);
+           var targets = touchLayer.selectAll('.qaItem.osmose')
+             .data(data, function (d) { return d.id; });
 
            // exit
            targets.exit()
                .attr('y', '-28px')
              .merge(targets)
              .sort(sortY)
-               .attr('class', d => `qaItem ${d.service} target ${fillClass} itemId-${d.id}`)
+               .attr('class', function (d) { return ("qaItem " + (d.service) + " target " + fillClass + " itemId-" + (d.id)); })
                .attr('transform', getTransform);
 
            function sortY(a, b) {
 
          // Draw the Osmose layer and schedule loading issues and updating markers.
          function drawOsmose(selection) {
-           const service = getService();
+           var service = getService();
 
-           const surface = context.surface();
+           var surface = context.surface();
            if (surface && !surface.empty()) {
              touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
            }
 
          // Toggles the layer on and off
          drawOsmose.enabled = function(val) {
-           if (!arguments.length) return _layerEnabled$2;
+           if (!arguments.length) { return _layerEnabled$2; }
 
            _layerEnabled$2 = val;
            if (_layerEnabled$2) {
              // Also, If layer is toggled quickly multiple requests are sent
              getService().loadStrings()
                .then(layerOn)
-               .catch(err => {
+               .catch(function (err) {
                  console.log(err); // eslint-disable-line no-console
                });
            } else {
            return this;
          };
 
-         drawOsmose.supported = () => !!getService();
+         drawOsmose.supported = function () { return !!getService(); };
 
          return drawOsmose;
        }
             * init().
             */
            function init() {
-               if (svgStreetside.initialized) return;  // run once
+               if (svgStreetside.initialized) { return; }  // run once
                svgStreetside.enabled = false;
                svgStreetside.initialized = true;
            }
             */
            function showLayer() {
                var service = getService();
-               if (!service) return;
+               if (!service) { return; }
 
                editOn();
 
             */
            function click(d) {
                var service = getService();
-               if (!service) return;
+               if (!service) { return; }
 
                // try to preserve the viewer rotation when staying on the same sequence
                if (d.sequenceKey !== _selectedSequence) {
 
                service
                    .selectImage(context, d)
-                   .then(response => {
+                   .then(function (response) {
                        if (response.status === 'ok'){
                            service.showViewer(context, _viewerYaw);
                        }
             */
            function mouseover(d) {
                var service = getService();
-               if (service) service.setStyles(context, d);
+               if (service) { service.setStyles(context, d); }
            }
 
            /**
             */
            function mouseout() {
                var service = getService();
-               if (service) service.setStyles(context, null);
+               if (service) { service.setStyles(context, null); }
            }
 
            /**
 
            function viewerChanged() {
                var service = getService();
-               if (!service) return;
+               if (!service) { return; }
 
                var viewer = service.viewer();
-               if (!viewer) return;
+               if (!viewer) { return; }
 
                // update viewfield rotation
                _viewerYaw = viewer.getYaw();
 
                // avoid updating if the map is currently transformed
                // e.g. during drags or easing.
-               if (context.map().isTransformed()) return;
+               if (context.map().isTransformed()) { return; }
 
                layer.selectAll('.viewfield-group.currentView')
                    .attr('transform', transform);
             * drawImages.enabled().
             */
            drawImages.enabled = function(_) {
-               if (!arguments.length) return svgStreetside.enabled;
+               if (!arguments.length) { return svgStreetside.enabled; }
                svgStreetside.enabled = _;
                if (svgStreetside.enabled) {
                    showLayer();
 
 
            function init() {
-               if (svgMapillaryImages.initialized) return;  // run once
+               if (svgMapillaryImages.initialized) { return; }  // run once
                svgMapillaryImages.enabled = false;
                svgMapillaryImages.initialized = true;
            }
 
                        // avoid updating if the map is currently transformed
                        // e.g. during drags or easing.
-                       if (context.map().isTransformed()) return;
+                       if (context.map().isTransformed()) { return; }
 
                        layer.selectAll('.viewfield-group.currentView')
                            .filter(function(d) {
 
            function showLayer() {
                var service = getService();
-               if (!service) return;
+               if (!service) { return; }
 
                editOn();
 
 
            function click(d) {
                var service = getService();
-               if (!service) return;
+               if (!service) { return; }
 
                service
                    .selectImage(context, d.key)
 
            function mouseover(d) {
                var service = getService();
-               if (service) service.setStyles(context, d);
+               if (service) { service.setStyles(context, d); }
            }
 
 
            function mouseout() {
                var service = getService();
-               if (service) service.setStyles(context, null);
+               if (service) { service.setStyles(context, null); }
            }
 
 
                var showsFlat = context.photos().showsFlat();
                if (!showsPano || !showsFlat) {
                    images = images.filter(function(image) {
-                       if (image.pano) return showsPano;
+                       if (image.pano) { return showsPano; }
                        return showsFlat;
                    });
                }
                if (!showsPano || !showsFlat) {
                    sequences = sequences.filter(function(sequence) {
                        if (sequence.properties.hasOwnProperty('pano')) {
-                           if (sequence.properties.pano) return showsPano;
+                           if (sequence.properties.pano) { return showsPano; }
                            return showsFlat;
                        } else {
                            // if the sequence doesn't specify pano or not, search its images
                                    var imageKey = cProps.image_keys[index];
                                    var image = service.cachedImage(imageKey);
                                    if (image && image.hasOwnProperty('pano')) {
-                                       if (image.pano) return showsPano;
+                                       if (image.pano) { return showsPano; }
                                        return showsFlat;
                                    }
                                }
 
 
            drawImages.enabled = function(_) {
-               if (!arguments.length) return svgMapillaryImages.enabled;
+               if (!arguments.length) { return svgMapillaryImages.enabled; }
                svgMapillaryImages.enabled = _;
                if (svgMapillaryImages.enabled) {
                    showLayer();
 
 
            function init() {
-               if (svgMapillarySigns.initialized) return;  // run once
+               if (svgMapillarySigns.initialized) { return; }  // run once
                svgMapillarySigns.enabled = false;
                svgMapillarySigns.initialized = true;
            }
 
            function showLayer() {
                var service = getService();
-               if (!service) return;
+               if (!service) { return; }
 
                editOn();
            }
 
            function click(d) {
                var service = getService();
-               if (!service) return;
+               if (!service) { return; }
 
                context.map().centerEase(d.loc);
 
 
 
            drawSigns.enabled = function(_) {
-               if (!arguments.length) return svgMapillarySigns.enabled;
+               if (!arguments.length) { return svgMapillarySigns.enabled; }
                svgMapillarySigns.enabled = _;
                if (svgMapillarySigns.enabled) {
                    showLayer();
 
 
            function init() {
-               if (svgMapillaryMapFeatures.initialized) return;  // run once
+               if (svgMapillaryMapFeatures.initialized) { return; }  // run once
                svgMapillaryMapFeatures.enabled = false;
                svgMapillaryMapFeatures.initialized = true;
            }
 
            function showLayer() {
                var service = getService();
-               if (!service) return;
+               if (!service) { return; }
 
                editOn();
            }
 
            function click(d) {
                var service = getService();
-               if (!service) return;
+               if (!service) { return; }
 
                context.map().centerEase(d.loc);
 
 
 
            drawMapFeatures.enabled = function(_) {
-               if (!arguments.length) return svgMapillaryMapFeatures.enabled;
+               if (!arguments.length) { return svgMapillaryMapFeatures.enabled; }
                svgMapillaryMapFeatures.enabled = _;
                if (svgMapillaryMapFeatures.enabled) {
                    showLayer();
 
 
            function init() {
-               if (svgOpenstreetcamImages.initialized) return;  // run once
+               if (svgOpenstreetcamImages.initialized) { return; }  // run once
                svgOpenstreetcamImages.enabled = false;
                svgOpenstreetcamImages.initialized = true;
            }
 
            function showLayer() {
                var service = getService();
-               if (!service) return;
+               if (!service) { return; }
 
                editOn();
 
 
            function click(d) {
                var service = getService();
-               if (!service) return;
+               if (!service) { return; }
 
                service
                    .selectImage(context, d)
 
            function mouseover(d) {
                var service = getService();
-               if (service) service.setStyles(context, d);
+               if (service) { service.setStyles(context, d); }
            }
 
 
            function mouseout() {
                var service = getService();
-               if (service) service.setStyles(context, null);
+               if (service) { service.setStyles(context, null); }
            }
 
 
 
 
            drawImages.enabled = function(_) {
-               if (!arguments.length) return svgOpenstreetcamImages.enabled;
+               if (!arguments.length) { return svgOpenstreetcamImages.enabled; }
                svgOpenstreetcamImages.enabled = _;
                if (svgOpenstreetcamImages.enabled) {
                    showLayer();
 
 
            drawOsm.enabled = function(val) {
-               if (!arguments.length) return enabled;
+               if (!arguments.length) { return enabled; }
                enabled = val;
 
                if (enabled) {
 
            // Update the note markers
            function updateMarkers() {
-               if (!_notesVisible || !_notesEnabled) return;
+               if (!_notesVisible || !_notesEnabled) { return; }
 
                var service = getService();
                var selectedID = context.selectedNoteID();
 
 
                // Draw targets..
-               if (touchLayer.empty()) return;
+               if (touchLayer.empty()) { return; }
                var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
 
                var targets = touchLayer.selectAll('.note')
 
            // Toggles the layer on and off
            drawNotes.enabled = function(val) {
-               if (!arguments.length) return _notesEnabled;
+               if (!arguments.length) { return _notesEnabled; }
 
                _notesEnabled = val;
                if (_notesEnabled) {
 
 
            drawLayers.dimensions = function(val) {
-               if (!arguments.length) return utilGetDimensions(svg);
+               if (!arguments.length) { return utilGetDimensions(svg); }
                utilSetDimensions(svg, val);
                return this;
            };
                        var data = pathdata[layer] || [];
                        return data.filter(function(d) {
                            if (isSelected)
-                               return context.selectedIDs().indexOf(d.id) !== -1;
+                               { return context.selectedIDs().indexOf(d.id) !== -1; }
                            else
-                               return context.selectedIDs().indexOf(d.id) === -1;
+                               { return context.selectedIDs().indexOf(d.id) === -1; }
                        });
                    };
                }
                for (var i = 0; i < entities.length; i++) {
                    var entity = entities[i];
 
-                   if (entity.type !== 'way') continue;
-                   if (!filter(entity)) continue;
-                   if (context.selectedIDs().indexOf(entity.id) < 0) continue;
+                   if (entity.type !== 'way') { continue; }
+                   if (!filter(entity)) { continue; }
+                   if (context.selectedIDs().indexOf(entity.id) < 0) { continue; }
 
                    var nodes = graph.childNodes(entity);
                    for (var j = 0; j < nodes.length - 1; j++) {
 
                function midpointFilter(d) {
                    if (midpoints[d.id])
-                       return true;
+                       { return true; }
 
                    for (var i = 0; i < d.parents.length; i++) {
                        if (filter(d.parents[i])) {
                var data = [];
 
                entities.forEach(function(node) {
-                   if (activeID === node.id) return;   // draw no target on the activeID
+                   if (activeID === node.id) { return; }   // draw no target on the activeID
 
                    data.push({
                        type: 'Feature',
 
            function icon(turn) {
                var u = turn.u ? '-u' : '';
-               if (turn.no) return '#iD-turn-no' + u;
-               if (turn.only) return '#iD-turn-only' + u;
+               if (turn.no) { return '#iD-turn-no' + u; }
+               if (turn.only) { return '#iD-turn-only' + u; }
                return '#iD-turn-yes' + u;
            }
 
                function getIcon(d) {
                    // always check latest entity, as fastEntityKey avoids enter/exit now
                    var entity = graph.entity(d.id);
-                   if (entity.id in icons) return icons[entity.id];
+                   if (entity.id in icons) { return icons[entity.id]; }
 
                    icons[entity.id] =
                        entity.hasInterestingTags() &&
 
                // memoize directions results, return false for empty arrays (for use in filter)
                function getDirections(entity) {
-                   if (entity.id in directions) return directions[entity.id];
+                   if (entity.id in directions) { return directions[entity.id]; }
 
                    var angles = entity.directions(graph, projection);
                    directions[entity.id] = angles.length ? angles : false;
                var data = { targets: [], nopes: [] };
 
                entities.forEach(function(node) {
-                   if (activeID === node.id) return;   // draw no target on the activeID
+                   if (activeID === node.id) { return; }   // draw no target on the activeID
 
                    var vertexType = svgPassiveVertex(node, graph, activeID);
                    if (vertexType !== 0) {     // passive or adjacent - allow to connect
                function addChildVertices(entity) {
 
                    // avoid redunant work and infinite recursion of circular relations
-                   if (seenIds[entity.id]) return;
+                   if (seenIds[entity.id]) { return; }
                    seenIds[entity.id] = true;
 
                    var geometry = entity.geometry(graph);
 
                ids.forEach(function(id) {
                    var entity = graph.hasEntity(id);
-                   if (!entity) return;
+                   if (!entity) { return; }
 
                    if (entity.type === 'node') {
                        if (renderAsVertex(entity, graph, wireframe, zoom)) {
                    _currSelected = {};
                    context.selectedIDs().forEach(function(id) {
                        var entity = graph.hasEntity(id);
-                       if (!entity) return;
+                       if (!entity) { return; }
 
                        if (entity.type === 'node') {
                            if (renderAsVertex(entity, graph, wireframe, zoom)) {
 
            // partial redraw - only update the hovered items..
            drawVertices.drawHover = function(selection, graph, target, extent) {
-               if (target === _currHoverTarget) return;  // continue only if something changed
+               if (target === _currHoverTarget) { return; }  // continue only if something changed
 
                var wireframe = context.surface().classed('fill-wireframe');
                var zoom = geoScaleToZoom(projection.scale());
                      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.
+                   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);
                  };
              return this;
            },
            zoom: function(key, transform) {
-             if (this.mouse && key !== 'mouse') this.mouse[1] = transform.invert(this.mouse[0]);
-             if (this.pointer0 && key !== 'touch') this.pointer0[1] = transform.invert(this.pointer0[0]);
-             if (this.pointer1 && key !== 'touch') this.pointer1[1] = transform.invert(this.pointer1[0]);
+             if (this.mouse && key !== 'mouse') { this.mouse[1] = transform.invert(this.mouse[0]); }
+             if (this.pointer0 && key !== 'touch') { this.pointer0[1] = transform.invert(this.pointer0[0]); }
+             if (this.pointer1 && key !== 'touch') { this.pointer1[1] = transform.invert(this.pointer1[0]); }
              _transform = transform;
              this.emit('zoom');
              return this;
          };
 
          function wheeled() {
-           if (!filter.apply(this, arguments)) return;
+           if (!filter.apply(this, arguments)) { return; }
            var g = gesture(this, arguments),
                t = _transform,
                k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
          function pointerdown() {
            _downPointerIDs.add(event.pointerId);
 
-           if (!filter.apply(this, arguments)) return;
+           if (!filter.apply(this, arguments)) { return; }
 
            var g = gesture(this, arguments, _downPointerIDs.size === 1);
            var started;
          }
 
          function pointermove() {
-           if (!_downPointerIDs.has(event.pointerId)) return;
+           if (!_downPointerIDs.has(event.pointerId)) { return; }
 
-           if (!_activeGesture || !_pointerLocGetter) return;
+           if (!_activeGesture || !_pointerLocGetter) { return; }
 
            var g = gesture(this, arguments);
 
            if ((isPointer0 || isPointer1) && 'buttons' in event && !event.buttons) {
              // The pointer went up without ending the gesture somehow, e.g.
              // a down mouse was moved off the map and released. End it here.
-             if (g.pointer0) _downPointerIDs.delete(g.pointer0[2]);
-             if (g.pointer1) _downPointerIDs.delete(g.pointer1[2]);
+             if (g.pointer0) { _downPointerIDs.delete(g.pointer0[2]); }
+             if (g.pointer1) { _downPointerIDs.delete(g.pointer1[2]); }
              g.end();
              return;
            }
            var loc = _pointerLocGetter(event);
            var t, p, l;
 
-           if (isPointer0) g.pointer0[0] = loc;
-           else if (isPointer1) g.pointer1[0] = loc;
+           if (isPointer0) { g.pointer0[0] = loc; }
+           else if (isPointer1) { g.pointer1[0] = loc; }
 
            t = _transform;
            if (g.pointer1) {
              p = g.pointer0[0];
              l = g.pointer0[1];
            }
-           else return;
+           else { return; }
            g.zoom('touch', constrain(translate(t, p, l), g.extent, translateExtent));
          }
 
          function pointerup() {
-           if (!_downPointerIDs.has(event.pointerId)) return;
+           if (!_downPointerIDs.has(event.pointerId)) { return; }
 
            _downPointerIDs.delete(event.pointerId);
 
-           if (!_activeGesture) return;
+           if (!_activeGesture) { return; }
 
            var g = gesture(this, arguments);
 
            event.stopImmediatePropagation();
 
-           if (g.pointer0 && g.pointer0[2] === event.pointerId) delete g.pointer0;
-           else if (g.pointer1 && g.pointer1[2] === event.pointerId) delete g.pointer1;
+           if (g.pointer0 && g.pointer0[2] === event.pointerId) { delete g.pointer0; }
+           else if (g.pointer1 && g.pointer1[2] === event.pointerId) { delete g.pointer1; }
 
            if (g.pointer1 && !g.pointer0) {
              g.pointer0 = g.pointer1;
              delete g.pointer1;
            }
-           if (g.pointer0) g.pointer0[1] = _transform.invert(g.pointer0[0]);
+           if (g.pointer0) { g.pointer0[1] = _transform.invert(g.pointer0[0]); }
            else {
              g.end();
            }
            function pointerdown() {
 
                // ignore right-click
-               if (event.ctrlKey || event.button === 2) return;
+               if (event.ctrlKey || event.button === 2) { return; }
 
                var loc = [event.clientX, event.clientY];
 
            function pointerup() {
 
                // ignore right-click
-               if (event.ctrlKey || event.button === 2) return;
+               if (event.ctrlKey || event.button === 2) { return; }
 
-               if (!_pointer || _pointer.pointerId !== event.pointerId) return;
+               if (!_pointer || _pointer.pointerId !== event.pointerId) { return; }
 
                _pointer.upCount += 1;
 
 
                function didUndoOrRedo(targetTransform) {
                    var mode = context.mode().id;
-                   if (mode !== 'browse' && mode !== 'select') return;
+                   if (mode !== 'browse' && mode !== 'select') { return; }
                    if (targetTransform) {
                        map.transformEase(targetTransform);
                    }
                updateAreaFill();
 
                _doubleUpHandler.on('doubleUp.map', function(p0) {
-                   if (!_dblClickZoomEnabled) return;
+                   if (!_dblClickZoomEnabled) { return; }
 
                    // don't zoom if targeting something other than the map itself
                    if (typeof event.target.__data__ === 'object' &&
                        // or area fills
-                       !select(event.target).classed('fill')) return;
+                       !select(event.target).classed('fill')) { return; }
 
                    var zoomOut = event.shiftKey;
 
                });
 
                context.on('enter.map',  function() {
-                   if (!map.editableDataEnabled(true /* skip zoom check */)) return;
+                   if (!map.editableDataEnabled(true /* skip zoom check */)) { return; }
 
                    // redraw immediately any objects affected by a change in selectedIDs.
                    var graph = context.graph();
                    data = [];
                    utilEntityAndDeepMemberIDs(mode.selectedIDs(), context.graph()).forEach(function(id) {
                        var entity = context.hasEntity(id);
-                       if (entity) data.push(entity);
+                       if (entity) { data.push(entity); }
                    });
                    fullRedraw = true;
                    filter = utilFunctor(true);
                if (source && source.type === 'wheel') {
 
                    // assume that the gesture is already handled by pointer events
-                   if (_pointerDown) return;
+                   if (_pointerDown) { return; }
 
                    var detected = utilDetect();
                    var dX = source.deltaX;
 
 
            function resetTransform() {
-               if (!_isTransformed) return false;
+               if (!_isTransformed) { return false; }
 
                utilSetTransform(supersurface, 0, 0);
                _isTransformed = false;
 
 
            function redraw(difference, extent) {
-               if (surface.empty() || !_redrawEnabled) return;
+               if (surface.empty() || !_redrawEnabled) { return; }
 
                // If we are in the middle of a zoom/pan, we can't do differenced redraws.
                // It would result in artifacts where differenced entities are redrawn with
 
 
            var immediateRedraw = function(difference, extent) {
-               if (!difference && !extent) cancelPendingRedraw();
+               if (!difference && !extent) { cancelPendingRedraw(); }
                redraw(difference, extent);
            };
 
 
 
            map.dblclickZoomEnable = function(val) {
-               if (!arguments.length) return _dblClickZoomEnabled;
+               if (!arguments.length) { return _dblClickZoomEnabled; }
                _dblClickZoomEnabled = val;
                return map;
            };
 
 
            map.redrawEnable = function(val) {
-               if (!arguments.length) return _redrawEnabled;
+               if (!arguments.length) { return _redrawEnabled; }
                _redrawEnabled = val;
                return map;
            };
 
            function setTransform(t2, duration, force) {
                var t = projection.transform();
-               if (!force && t2.k === t.k && t2.x === t.x && t2.y === t.y) return false;
+               if (!force && t2.k === t.k && t2.x === t.x && t2.y === t.y) { return false; }
 
                if (duration) {
                    _selection
            function setCenterZoom(loc2, z2, duration, force) {
                var c = map.center();
                var z = map.zoom();
-               if (loc2[0] === c[0] && loc2[1] === c[1] && z2 === z && !force) return false;
+               if (loc2[0] === c[0] && loc2[1] === c[1] && z2 === z && !force) { return false; }
 
                var proj = geoRawMercator().transform(projection.transform());  // copy projection
 
 
 
            map.dimensions = function(val) {
-               if (!arguments.length) return _dimensions;
+               if (!arguments.length) { return _dimensions; }
 
                _dimensions = val;
                drawLayers.dimensions(_dimensions);
 
            map.zoomTo = function(entity) {
                var extent = entity.extent(context.graph());
-               if (!isFinite(extent.area())) return map;
+               if (!isFinite(extent.area())) { return map; }
 
                var z2 = clamp(map.trimmedExtentZoom(extent), 0, 20);
                return map.centerZoom(extent.center(), z2);
                } else {
                    extent = obj.extent(context.graph());
                }
-               if (!isFinite(extent.area())) return map;
+               if (!isFinite(extent.area())) { return map; }
 
                var z2 = clamp(map.trimmedExtentZoom(extent), 0, 20);
                return map.centerZoomEase(extent.center(), z2, duration);
            map.editableDataEnabled = function(skipZoomCheck) {
 
                var layer = context.layers().layer('osm');
-               if (!layer || !layer.enabled()) return false;
+               if (!layer || !layer.enabled()) { return false; }
 
                return skipZoomCheck || map.withinEditableZoom();
            };
 
            map.notesEditable = function() {
                var layer = context.layers().layer('notes');
-               if (!layer || !layer.enabled()) return false;
+               if (!layer || !layer.enabled()) { return false; }
 
                return map.withinEditableZoom();
            };
 
 
            map.minzoom = function(val) {
-               if (!arguments.length) return _minzoom;
+               if (!arguments.length) { return _minzoom; }
                _minzoom = val;
                return map;
            };
            map.areaFillOptions = ['wireframe', 'partial', 'full'];
 
            map.activeAreaFill = function(val) {
-               if (!arguments.length) return corePreferences('area-fill') || 'partial';
+               if (!arguments.length) { return corePreferences('area-fill') || 'partial'; }
 
                corePreferences('area-fill', val);
                if (val !== 'wireframe') {
            }
 
 
-           map.layers = () => drawLayers;
+           map.layers = function () { return drawLayers; };
 
 
            map.doubleUpHandler = function() {
            function photos() {}
 
            function updateStorage() {
-               if (window.mocha) return;
+               if (window.mocha) { return; }
 
                var hash = utilStringQs(window.location.hash);
                var enabled = context.layers().all().filter(function(d) {
            };
 
            photos.showsPhotoType = function(val) {
-               if (!photos.shouldFilterByPhotoType()) return true;
+               if (!photos.shouldFilterByPhotoType()) { return true; }
 
                return _shownPhotoTypes.indexOf(val) !== -1;
            };
                    var hashOverlayIDs = hash.photo_overlay.replace(/;/g, ',').split(',');
                    hashOverlayIDs.forEach(function(id) {
                        var layer = context.layers().layer(id);
-                       if (layer) layer.enabled(true);
+                       if (layer) { layer.enabled(true); }
                    });
                }
 
 
 
            function update(selection) {
-               if (!osm) return;
+               if (!osm) { return; }
 
                if (!osm.authenticated()) {
                    selection.selectAll('.userLink, .logoutLink')
                    userLink.html('');
                    logoutLink.html('');
 
-                   if (err || !details) return;
+                   if (err || !details) { return; }
 
                    selection.selectAll('.userLink, .logoutLink')
                        .classed('hide', false);
        }
 
        function uiAttribution(context) {
-         let _selection = select(null);
+         var _selection = select(null);
 
 
          function render(selection, data, klass) {
-           let div = selection.selectAll(`.${klass}`)
+           var div = selection.selectAll(("." + klass))
              .data([0]);
 
            div = div.enter()
              .merge(div);
 
 
-           let attributions = div.selectAll('.attribution')
-             .data(data, d => d.id);
+           var attributions = div.selectAll('.attribution')
+             .data(data, function (d) { return d.id; });
 
            attributions.exit()
              .remove();
            attributions = attributions.enter()
              .append('span')
              .attr('class', 'attribution')
-             .each((d, i, nodes) => {
-               let attribution = select(nodes[i]);
+             .each(function (d, i, nodes) {
+               var attribution = select(nodes[i]);
 
                if (d.terms_html) {
                  attribution.html(d.terms_html);
                    .attr('target', '_blank');
                }
 
-               const sourceID = d.id.replace(/\./g, '<TX_DOT>');
-               const terms_text = _t(`imagery.${sourceID}.attribution.text`,
+               var sourceID = d.id.replace(/\./g, '<TX_DOT>');
+               var terms_text = _t(("imagery." + sourceID + ".attribution.text"),
                  { default: d.terms_text || d.id || d.name() }
                );
 
              .merge(attributions);
 
 
-           let copyright = attributions.selectAll('.copyright-notice')
-             .data(d => {
-               let notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
+           var copyright = attributions.selectAll('.copyright-notice')
+             .data(function (d) {
+               var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
                return notice ? [notice] : [];
              });
 
 
 
          function update() {
-           let baselayer = context.background().baseLayerSource();
+           var baselayer = context.background().baseLayerSource();
            _selection
              .call(render, (baselayer ? [baselayer] : []), 'base-layer-attribution');
 
-           const z = context.map().zoom();
-           let overlays = context.background().overlayLayerSources() || [];
+           var z = context.map().zoom();
+           var overlays = context.background().overlayLayerSources() || [];
            _selection
-             .call(render, overlays.filter(s => s.validZoom(z)), 'overlay-layer-attribution');
+             .call(render, overlays.filter(function (s) { return s.validZoom(z); }), 'overlay-layer-attribution');
          }
 
 
 
 
            function update() {
-               if (!osm) return;
+               if (!osm) { return; }
 
                var users = {},
                    entities = context.history().intersects(context.map().extent());
 
                entities.forEach(function(entity) {
-                   if (entity && entity.user) users[entity.user] = true;
+                   if (entity && entity.user) { users[entity.user] = true; }
                });
 
                var u = Object.keys(users),
 
 
            return function(selection) {
-               if (!osm) return;
+               if (!osm) { return; }
                wrap = selection;
                update();
 
                        }
 
                        // don't show if buttons are pressed, e.g. during click and drag of map
-                       if (event.buttons !== 0) return;
+                       if (event.buttons !== 0) { return; }
 
                        show.apply(this, arguments);
                    });
            var _keys = utilFunctor(null);
 
            tooltip.title = function(val) {
-               if (!arguments.length) return _title;
+               if (!arguments.length) { return _title; }
                _title = utilFunctor(val);
                return tooltip;
            };
 
            tooltip.heading = function(val) {
-               if (!arguments.length) return _heading;
+               if (!arguments.length) { return _heading; }
                _heading = utilFunctor(val);
                return tooltip;
            };
 
            tooltip.keys = function(val) {
-               if (!arguments.length) return _keys;
+               if (!arguments.length) { return _keys; }
                _keys = utilFunctor(val);
                return tooltip;
            };
                    return !isTouchMenu || !op.mouseOnly;
                });
 
-               if (!ops.length) return;
+               if (!ops.length) { return; }
 
                _tooltips = [];
 
                        }
                    })
                    .on('drawn.edit-menu', function(info) {
-                       if (info.full) updatePosition();
+                       if (info.full) { updatePosition(); }
                    });
 
                var lastPointerUpType;
 
            function updatePosition() {
 
-               if (!_menu || _menu.empty()) return;
+               if (!_menu || _menu.empty()) { return; }
 
                var anchorLoc = context.projection(_anchorLocLonLat);
 
            };
 
            editMenu.anchorLoc = function(val) {
-               if (!arguments.length) return _anchorLoc;
+               if (!arguments.length) { return _anchorLoc; }
                _anchorLoc = val;
                _anchorLocLonLat = context.projection.invert(_anchorLoc);
                return editMenu;
            };
 
            editMenu.triggerType = function(val) {
-               if (!arguments.length) return _triggerType;
+               if (!arguments.length) { return _triggerType; }
                _triggerType = val;
                return editMenu;
            };
 
            editMenu.operations = function(val) {
-               if (!arguments.length) return _operations;
+               if (!arguments.length) { return _operations; }
                _operations = val;
                return editMenu;
            };
 
 
            flash.duration = function(_) {
-               if (!arguments.length) return _duration;
+               if (!arguments.length) { return _duration; }
                _duration = _;
                return flash;
            };
 
            flash.text = function(_) {
-               if (!arguments.length) return _text;
+               if (!arguments.length) { return _text; }
                _text = _;
                return flash;
            };
 
            flash.textClass = function(_) {
-               if (!arguments.length) return _textClass;
+               if (!arguments.length) { return _textClass; }
                _textClass = _;
                return flash;
            };
 
            flash.iconName = function(_) {
-               if (!arguments.length) return _iconName;
+               if (!arguments.length) { return _iconName; }
                _iconName = _;
                return flash;
            };
 
            flash.iconClass = function(_) {
-               if (!arguments.length) return _iconClass;
+               if (!arguments.length) { return _iconClass; }
                _iconClass = _;
                return flash;
            };
 
 
            return function() { // selection) {
-               if (!isSupported()) return;
+               if (!isSupported()) { return; }
 
                // button = selection.append('button')
                //     .attr('title', t('full_screen'))
            var _button = select(null);
 
            function click() {
-               if (context.inIntro()) return;
+               if (context.inIntro()) { return; }
                if (!_layer.enabled() && !_locating.isShown()) {
 
                    // This timeout ensures that we still call finish() even if
            }
 
            return function(selection) {
-               if (!navigator.geolocation || !navigator.geolocation.getCurrentPosition) return;
+               if (!navigator.geolocation || !navigator.geolocation.getCurrentPosition) { return; }
 
                _button = selection
                    .append('button')
 
            function redraw(selection) {
                var source = background.baseLayerSource();
-               if (!source) return;
+               if (!source) { return; }
 
                var isDG = (source.id.match(/^DigitalGlobe/i) !== null);
 
 
                metadataKeys.forEach(function(k) {
                    // DigitalGlobe vintage is available in raster layers for now.
-                   if (isDG && k === 'vintage') return;
+                   if (isDG && k === 'vintage') { return; }
 
                    list
                        .append('li')
 
            function getMetadata(selection) {
                var tile = context.container().select('.layer-background img.tile-center');   // tile near viewport center
-               if (tile.empty()) return;
+               if (tile.empty()) { return; }
 
                var sourceName = currSourceName;
                var d = tile.datum();
                    .selectAll('.background-info-span-zoom')
                    .text(metadata.zoom);
 
-               if (!d || !d.length >= 3) return;
+               if (!d || !d.length >= 3) { return; }
 
                background.baseLayerSource().getMetadata(center, d, function(err, result) {
-                   if (err || currSourceName !== sourceName) return;
+                   if (err || currSourceName !== sourceName) { return; }
 
                    // update vintage
                    var vintage = result.vintage;
 
                    // update other metdata
                    metadataKeys.forEach(function(k) {
-                       if (k === 'zoom' || k === 'vintage') return;  // done already
+                       if (k === 'zoom' || k === 'vintage') { return; }  // done already
                        var val = result[k];
                        metadata[k] = val;
                        selection.selectAll('.background-info-list-' + k)
            var osm;
 
            function displayTimestamp(timestamp) {
-               if (!timestamp) return _t('info_panels.history.unknown');
+               if (!timestamp) { return _t('info_panels.history.unknown'); }
                var options = {
                    day: 'numeric', month: 'short', year: 'numeric',
                    hour: 'numeric', minute: 'numeric', second: 'numeric'
                };
                var d = new Date(timestamp);
-               if (isNaN(d.getTime())) return _t('info_panels.history.unknown');
+               if (isNaN(d.getTime())) { return _t('info_panels.history.unknown'); }
                return d.toLocaleString(_mainLocalizer.localeCode(), options);
            }
 
                    .attr('class', 'history-heading')
                    .text(singular || _t('info_panels.history.selected', { n: selected.length }));
 
-               if (!singular) return;
+               if (!singular) { return; }
 
                if (entity) {
                    selection.call(redrawEntity, entity);
 
 
            function toLineString(feature) {
-               if (feature.type === 'LineString') return feature;
+               if (feature.type === 'LineString') { return feature; }
 
                var result = { type: 'LineString', coordinates: [] };
                if (feature.type === 'Polygon') {
 
                ids.forEach(function(k) {
                    var key = _t('info_panels.' + k + '.key', { default: null });
-                   if (!key) return;
+                   if (!key) { return; }
                    context.keybinding()
                        .on(uiCmd('⌘⇧' + key), function() { info.toggle(k); });
                });
        // with custom `replacements`
        function helpString(id, replacements) {
            // only load these the first time
-           if (!helpStringReplacements) helpStringReplacements = {
+           if (!helpStringReplacements) helpStringReplacements = {
                // insert icons corresponding to various UI elements
                point_icon: icon('#iD-icon-point', 'pre-text'),
                line_icon: icon('#iD-icon-line', 'pre-text'),
                point: _t('modes.add_point.title'),
                line: _t('modes.add_line.title'),
                area: _t('modes.add_area.title'),
-               note: _t('modes.add_note.title'),
+               note: _t('modes.add_note.label'),
                delete: _t('operations.delete.title'),
                move: _t('operations.move.title'),
                orthogonalize: _t('operations.orthogonalize.title'),
                start_the_walkthrough: _t('splash.walkthrough'),
                help: _t('help.title'),
                ok: _t('intro.ok')
-           };
+           }; }
 
            var reps;
            if (replacements) {
        var missingStrings = {};
        function checkKey(key, text) {
            if (_t(key, { default: undefined}) === undefined) {
-               if (missingStrings.hasOwnProperty(key)) return;  // warn once
+               if (missingStrings.hasOwnProperty(key)) { return; }  // warn once
                missingStrings[key] = text;
                var missing = key + ': ' + text;
-               if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
+               if (typeof console !== 'undefined') { console.log(missing); } // eslint-disable-line
            }
        }
 
        function transitionTime(point1, point2) {
            var distance = geoSphericalDistance(point1, point2);
            if (distance === 0)
-               return 0;
+               { return 0; }
            else if (distance < 80)
-               return 500;
+               { return 500; }
            else
-               return 1000;
+               { return 1000; }
        }
 
        // Tooltips and svg mask used to highlight certain features
                            containerWidth + ',' + containerHeight + 'L' +
                            containerWidth + ',0 Z';
 
-                       if (!d) return string;
+                       if (!d) { return string; }
                        return string + 'M' +
                            d.left + ',' + d.top + 'L' +
                            d.left + ',' + (d.top + d.height) + 'L' +
                context.history().reset('initial');
 
                var entity = context.hasEntity(hallId);
-               if (!entity) return;
+               if (!entity) { return; }
                reveal(null, null, { duration: 0 });
                context.map().centerZoomEase(entity.loc, 19, 500);
 
                timeout(function() {
                    var entity = context.hasEntity(hallId);
-                   if (!entity) return;
+                   if (!entity) { return; }
                    var box = pointBox(entity.loc, context);
                    var textId = context.lastPointerType() === 'mouse' ? 'click_townhall' : 'tap_townhall';
                    reveal(box, helpString('intro.navigation.' + textId));
 
                    context.map().on('move.intro drawn.intro', function() {
                        var entity = context.hasEntity(hallId);
-                       if (!entity) return;
+                       if (!entity) { return; }
                        var box = pointBox(entity.loc, context);
                        reveal(box, helpString('intro.navigation.' + textId), { duration: 0 });
                    });
 
                    context.on('enter.intro', function() {
-                       if (isTownHallSelected()) continueTo(selectedTownHall);
+                       if (isTownHallSelected()) { continueTo(selectedTownHall); }
                    });
 
                }, 550);  // after centerZoomEase
 
 
            function selectedTownHall() {
-               if (!isTownHallSelected()) return clickTownHall();
+               if (!isTownHallSelected()) { return clickTownHall(); }
 
                var entity = context.hasEntity(hallId);
-               if (!entity) return clickTownHall();
+               if (!entity) { return clickTownHall(); }
 
                var box = pointBox(entity.loc, context);
                var onClick = function() { continueTo(editorTownHall); };
 
                context.map().on('move.intro drawn.intro', function() {
                    var entity = context.hasEntity(hallId);
-                   if (!entity) return;
+                   if (!entity) { return; }
                    var box = pointBox(entity.loc, context);
                    reveal(box, helpString('intro.navigation.selected_townhall'),
                        { duration: 0, buttonText: _t('intro.ok'), buttonCallback: onClick }
 
 
            function editorTownHall() {
-               if (!isTownHallSelected()) return clickTownHall();
+               if (!isTownHallSelected()) { return clickTownHall(); }
 
                // disallow scrolling
                context.container().select('.inspector-wrap').on('wheel.intro', eventCancel);
 
 
            function presetTownHall() {
-               if (!isTownHallSelected()) return clickTownHall();
+               if (!isTownHallSelected()) { return clickTownHall(); }
 
                // reset pane, in case user happened to change it..
                context.container().select('.inspector-wrap .panewrap').style('right', '0%');
 
 
            function fieldsTownHall() {
-               if (!isTownHallSelected()) return clickTownHall();
+               if (!isTownHallSelected()) { return clickTownHall(); }
 
                // reset pane, in case user happened to change it..
                context.container().select('.inspector-wrap .panewrap').style('right', '0%');
 
 
            function closeTownHall() {
-               if (!isTownHallSelected()) return clickTownHall();
+               if (!isTownHallSelected()) { return clickTownHall(); }
 
                var selector = '.entity-editor-pane button.close svg use';
                var href = select(selector).attr('href') || '#iD-icon-close';
                timeout(function() {
                    context.map().on('move.intro drawn.intro', function() {
                        var entity = context.hasEntity(springStreetEndId);
-                       if (!entity) return;
+                       if (!entity) { return; }
                        var box = pointBox(entity.loc, context);
                        box.height = 500;
                        reveal(box,
                        .attr('xlink:href', '#iD-graphic-points');
 
                    context.on('enter.intro', function(mode) {
-                       if (mode.id !== 'add-point') return;
+                       if (mode.id !== 'add-point') { return; }
                        continueTo(placePoint);
                    });
                }, msec + 100);
                });
 
                context.on('enter.intro', function(mode) {
-                   if (mode.id !== 'select') return chapter.restart();
+                   if (mode.id !== 'select') { return chapter.restart(); }
                    _pointID = context.mode().selectedIDs()[0];
                    continueTo(searchPreset);
                });
 
 
            function reselectPoint() {
-               if (!_pointID) return chapter.restart();
+               if (!_pointID) { return chapter.restart(); }
                var entity = context.hasEntity(_pointID);
-               if (!entity) return chapter.restart();
+               if (!entity) { return chapter.restart(); }
 
                // make sure it's still a cafe, in case user somehow changed it..
                var oldPreset = _mainPresetIndex.match(entity, context.graph());
                    timeout(function() {
                        context.map().on('move.intro drawn.intro', function() {
                            var entity = context.hasEntity(_pointID);
-                           if (!entity) return chapter.restart();
+                           if (!entity) { return chapter.restart(); }
                            var box = pointBox(entity.loc, context);
                            reveal(box, helpString('intro.points.reselect'), { duration: 0 });
                        });
                    }, 600); // after reveal..
 
                    context.on('enter.intro', function(mode) {
-                       if (mode.id !== 'select') return;
+                       if (mode.id !== 'select') { return; }
                        continueTo(updatePoint);
                    });
 
 
 
            function rightClickPoint() {
-               if (!_pointID) return chapter.restart();
+               if (!_pointID) { return chapter.restart(); }
                var entity = context.hasEntity(_pointID);
-               if (!entity) return chapter.restart();
+               if (!entity) { return chapter.restart(); }
 
                context.enter(modeBrowse(context));
 
                timeout(function() {
                    context.map().on('move.intro', function() {
                        var entity = context.hasEntity(_pointID);
-                       if (!entity) return chapter.restart();
+                       if (!entity) { return chapter.restart(); }
                        var box = pointBox(entity.loc, context);
                        reveal(box, helpString('intro.points.' + textId), { duration: 0 });
                    });
                }, 600); // after reveal
 
                context.on('enter.intro', function(mode) {
-                   if (mode.id !== 'select') return;
+                   if (mode.id !== 'select') { return; }
                    var ids = context.selectedIDs();
-                   if (ids.length !== 1 || ids[0] !== _pointID) return;
+                   if (ids.length !== 1 || ids[0] !== _pointID) { return; }
 
                    timeout(function() {
                        var node = selectMenuItem(context, 'delete').node();
-                       if (!node) return;
+                       if (!node) { return; }
                        continueTo(enterDelete);
                    }, 50);  // after menu visible
                });
 
 
            function enterDelete() {
-               if (!_pointID) return chapter.restart();
+               if (!_pointID) { return chapter.restart(); }
                var entity = context.hasEntity(_pointID);
-               if (!entity) return chapter.restart();
+               if (!entity) { return chapter.restart(); }
 
                var node = selectMenuItem(context, 'delete').node();
                if (!node) { return continueTo(rightClickPoint); }
                }, 300); // after menu visible
 
                context.on('exit.intro', function() {
-                   if (!_pointID) return chapter.restart();
+                   if (!_pointID) { return chapter.restart(); }
                    var entity = context.hasEntity(_pointID);
-                   if (entity) return continueTo(rightClickPoint);  // point still exists
+                   if (entity) { return continueTo(rightClickPoint); }  // point still exists
                });
 
                context.history().on('change.intro', function(changed) {
                        .attr('xlink:href', '#iD-graphic-areas');
 
                    context.on('enter.intro', function(mode) {
-                       if (mode.id !== 'add-area') return;
+                       if (mode.id !== 'add-area') { return; }
                        continueTo(startPlayground);
                    });
                }, msec + 100);
                            );
                        });
                        context.on('enter.intro', function(mode) {
-                           if (mode.id !== 'draw-area') return chapter.restart();
+                           if (mode.id !== 'draw-area') { return chapter.restart(); }
                            continueTo(continuePlayground);
                        });
                    }, 250);  // after reveal
                });
 
                function continueTo(nextStep) {
-                   if (watcher) window.clearInterval(watcher);
+                   if (watcher) { window.clearInterval(watcher); }
                    context.on('exit.intro', null);
                    nextStep();
                }
                        .attr('xlink:href', '#iD-graphic-lines');
 
                    context.on('enter.intro', function(mode) {
-                       if (mode.id !== 'add-line') return;
+                       if (mode.id !== 'add-line') { return; }
                        continueTo(startLine);
                    });
                }, msec + 100);
 
 
            function startLine() {
-               if (context.mode().id !== 'add-line') return chapter.restart();
+               if (context.mode().id !== 'add-line') { return chapter.restart(); }
 
                _tulipRoadID = null;
 
                });
 
                context.on('enter.intro', function(mode) {
-                   if (mode.id !== 'draw-line') return chapter.restart();
+                   if (mode.id !== 'draw-line') { return chapter.restart(); }
                    continueTo(drawLine);
                });
 
 
 
            function drawLine() {
-               if (context.mode().id !== 'draw-line') return chapter.restart();
+               if (context.mode().id !== 'draw-line') { return chapter.restart(); }
 
                _tulipRoadID = context.mode().selectedIDs()[0];
                context.map().centerEase(tulipRoadMidpoint, 500);
 
            function isLineConnected() {
                var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
-               if (!entity) return false;
+               if (!entity) { return false; }
 
                var drawNodes = context.graph().childNodes(entity);
                return drawNodes.some(function(node) {
 
 
            function continueLine() {
-               if (context.mode().id !== 'draw-line') return chapter.restart();
+               if (context.mode().id !== 'draw-line') { return chapter.restart(); }
                var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
-               if (!entity) return chapter.restart();
+               if (!entity) { return chapter.restart(); }
 
                context.map().centerEase(tulipRoadIntersection, 500);
 
 
                context.on('enter.intro', function(mode) {
                    if (mode.id === 'draw-line')
-                       return;
+                       { return; }
                    else if (mode.id === 'select')
-                       return continueTo(chooseCategoryRoad);
+                       { return continueTo(chooseCategoryRoad); }
                    else
-                       return chapter.restart();
+                       { return chapter.restart(); }
                });
 
                function continueTo(nextStep) {
 
 
            function chooseCategoryRoad() {
-               if (context.mode().id !== 'select') return chapter.restart();
+               if (context.mode().id !== 'select') { return chapter.restart(); }
 
                context.on('exit.intro', function() {
                    return chapter.restart();
                });
 
                var button = context.container().select('.preset-category-road_minor .preset-list-button');
-               if (button.empty()) return chapter.restart();
+               if (button.empty()) { return chapter.restart(); }
 
                // disallow scrolling
                context.container().select('.inspector-wrap').on('wheel.intro', eventCancel);
 
 
            function choosePresetResidential() {
-               if (context.mode().id !== 'select') return chapter.restart();
+               if (context.mode().id !== 'select') { return chapter.restart(); }
 
                context.on('exit.intro', function() {
                    return chapter.restart();
                });
 
                var subgrid = context.container().select('.preset-category-road_minor .subgrid');
-               if (subgrid.empty()) return chapter.restart();
+               if (subgrid.empty()) { return chapter.restart(); }
 
                subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
                    .on('click.intro', function() {
 
            // selected wrong road type
            function retryPresetResidential() {
-               if (context.mode().id !== 'select') return chapter.restart();
+               if (context.mode().id !== 'select') { return chapter.restart(); }
 
                context.on('exit.intro', function() {
                    return chapter.restart();
                    });
 
                    context.on('enter.intro', function(mode) {
-                       if (mode.id !== 'select') return;
+                       if (mode.id !== 'select') { return; }
                        var ids = context.selectedIDs();
-                       if (ids.length !== 1 || ids[0] !== eleventhAvenueEndID) return;
+                       if (ids.length !== 1 || ids[0] !== eleventhAvenueEndID) { return; }
 
                        timeout(function() {
                            var node = selectMenuItem(context, 'split').node();
-                           if (!node) return;
+                           if (!node) { return; }
                            continueTo(splitIntersection);
                        }, 50);  // after menu visible
                    });
                });
 
                context.ui().editMenu().on('toggled.intro', function(open) {
-                   if (!open) return;
+                   if (!open) { return; }
 
                    timeout(function() {
                        var ids = context.selectedIDs();
                            ids.indexOf(twelfthAvenueID) !== -1 &&
                            ids.indexOf(_washingtonSegmentID) !== -1) {
                                var node = selectMenuItem(context, 'delete').node();
-                               if (!node) return;
+                               if (!node) { return; }
                                continueTo(multiDelete);
                        } else if (ids.length === 1 &&
                            ids.indexOf(_washingtonSegmentID) !== -1) {
                }
 
                var node = selectMenuItem(context, 'delete').node();
-               if (!node) return continueTo(multiRightClick);
+               if (!node) { return continueTo(multiRightClick); }
 
                reveal('.edit-menu',
                    helpString('intro.lines.multi_delete'),
                        .attr('xlink:href', '#iD-graphic-buildings');
 
                    context.on('enter.intro', function(mode) {
-                       if (mode.id !== 'add-area') return;
+                       if (mode.id !== 'add-area') { return; }
                        continueTo(startHouse);
                    });
                }, msec + 100);
                    });
 
                    context.on('enter.intro', function(mode) {
-                       if (mode.id !== 'draw-area') return chapter.restart();
+                       if (mode.id !== 'draw-area') { return chapter.restart(); }
                        continueTo(continueHouse);
                    });
 
 
 
            function rightClickHouse() {
-               if (!_houseID) return chapter.restart();
+               if (!_houseID) { return chapter.restart(); }
 
                context.enter(modeBrowse(context));
                context.history().reset('hasHouse');
                context.map().centerZoomEase(house, zoom, 500);
 
                context.on('enter.intro', function(mode) {
-                   if (mode.id !== 'select') return;
+                   if (mode.id !== 'select') { return; }
                    var ids = context.selectedIDs();
-                   if (ids.length !== 1 || ids[0] !== _houseID) return;
+                   if (ids.length !== 1 || ids[0] !== _houseID) { return; }
 
                    timeout(function() {
                        var node = selectMenuItem(context, 'orthogonalize').node();
-                       if (!node) return;
+                       if (!node) { return; }
                        continueTo(clickSquare);
                    }, 50);  // after menu visible
                });
 
 
            function clickSquare() {
-               if (!_houseID) return chapter.restart();
+               if (!_houseID) { return chapter.restart(); }
                var entity = context.hasEntity(_houseID);
-               if (!entity) return continueTo(rightClickHouse);
+               if (!entity) { return continueTo(rightClickHouse); }
 
                var node = selectMenuItem(context, 'orthogonalize').node();
                if (!node) { return continueTo(rightClickHouse); }
                    );
 
                    context.on('enter.intro', function(mode) {
-                       if (mode.id !== 'add-area') return;
+                       if (mode.id !== 'add-area') { return; }
                        continueTo(startTank);
                    });
                }, msec + 100);
                    });
 
                    context.on('enter.intro', function(mode) {
-                       if (mode.id !== 'draw-area') return chapter.restart();
+                       if (mode.id !== 'draw-area') { return chapter.restart(); }
                        continueTo(continueTank);
                    });
 
 
 
            function rightClickTank() {
-               if (!_tankID) return continueTo(addTank);
+               if (!_tankID) { return continueTo(addTank); }
 
                context.enter(modeBrowse(context));
                context.history().reset('hasTank');
 
                timeout(function() {
                    context.on('enter.intro', function(mode) {
-                       if (mode.id !== 'select') return;
+                       if (mode.id !== 'select') { return; }
                        var ids = context.selectedIDs();
-                       if (ids.length !== 1 || ids[0] !== _tankID) return;
+                       if (ids.length !== 1 || ids[0] !== _tankID) { return; }
 
                        timeout(function() {
                            var node = selectMenuItem(context, 'circularize').node();
-                           if (!node) return;
+                           if (!node) { return; }
                            continueTo(clickCircle);
                        }, 50);  // after menu visible
                    });
 
 
            function clickCircle() {
-               if (!_tankID) return chapter.restart();
+               if (!_tankID) { return chapter.restart(); }
                var entity = context.hasEntity(_tankID);
-               if (!entity) return continueTo(rightClickTank);
+               if (!entity) { return continueTo(rightClickTank); }
 
                var node = selectMenuItem(context, 'circularize').node();
                if (!node) { return continueTo(rightClickTank); }
            return utilRebind(chapter, dispatch$1, 'on');
        }
 
-       const chapterUi = {
+       var chapterUi = {
          welcome: uiIntroWelcome,
          navigation: uiIntroNavigation,
          point: uiIntroPoint,
          startEditing: uiIntroStartEditing
        };
 
-       const chapterFlow = [
+       var chapterFlow = [
          'welcome',
          'navigation',
          'point',
 
 
        function uiIntro(context) {
-         const INTRO_IMAGERY = 'EsriWorldImageryClarity';
-         let _introGraph = {};
-         let _currChapter;
+         var INTRO_IMAGERY = 'EsriWorldImageryClarity';
+         var _introGraph = {};
+         var _currChapter;
 
 
          function intro(selection) {
            _mainFileFetcher.get('intro_graph')
-             .then(dataIntroGraph => {
+             .then(function (dataIntroGraph) {
                // create entities for intro graph and localize names
-               for (let id in dataIntroGraph) {
+               for (var id in dataIntroGraph) {
                  if (!_introGraph[id]) {
                    _introGraph[id] = osmEntity(localize(dataIntroGraph[id]));
                  }
            context.enter(modeBrowse(context));
 
            // Save current map state
-           let osm = context.connection();
-           let history = context.history().toJSON();
-           let hash = window.location.hash;
-           let center = context.map().center();
-           let zoom = context.map().zoom();
-           let background = context.background().baseLayerSource();
-           let overlays = context.background().overlayLayerSources();
-           let opacity = context.container().selectAll('.main-map .layer-background').style('opacity');
-           let caches = osm && osm.caches();
-           let baseEntities = context.history().graph().base().entities;
+           var osm = context.connection();
+           var history = context.history().toJSON();
+           var hash = window.location.hash;
+           var center = context.map().center();
+           var zoom = context.map().zoom();
+           var background = context.background().baseLayerSource();
+           var overlays = context.background().overlayLayerSources();
+           var opacity = context.container().selectAll('.main-map .layer-background').style('opacity');
+           var caches = osm && osm.caches();
+           var baseEntities = context.history().graph().base().entities;
 
            // Show sidebar and disable the sidebar resizing button
            // (this needs to be before `context.inIntro(true)`)
            context.history().checkpoint('initial');
 
            // Setup imagery
-           let imagery = context.background().findSource(INTRO_IMAGERY);
+           var imagery = context.background().findSource(INTRO_IMAGERY);
            if (imagery) {
              context.background().baseLayerSource(imagery);
            } else {
              context.background().bing();
            }
-           overlays.forEach(d => context.background().toggleOverlayLayer(d));
+           overlays.forEach(function (d) { return context.background().toggleOverlayLayer(d); });
 
            // Setup data layers (only OSM)
-           let layers = context.layers();
-           layers.all().forEach(item => {
+           var layers = context.layers();
+           layers.all().forEach(function (item) {
              // if the layer has the function `enabled`
              if (typeof item.layer.enabled === 'function') {
                item.layer.enabled(item.id === 'osm');
 
            context.container().selectAll('.main-map .layer-background').style('opacity', 1);
 
-           let curtain = uiCurtain(context.container().node());
+           var curtain = uiCurtain(context.container().node());
            selection.call(curtain);
 
            // Store that the user started the walkthrough..
            corePreferences('walkthrough_started', 'yes');
 
            // Restore previous walkthrough progress..
-           let storedProgress = corePreferences('walkthrough_progress') || '';
-           let progress = storedProgress.split(';').filter(Boolean);
+           var storedProgress = corePreferences('walkthrough_progress') || '';
+           var progress = storedProgress.split(';').filter(Boolean);
 
-           let chapters = chapterFlow.map((chapter, i) => {
-             let s = chapterUi[chapter](context, curtain.reveal)
-               .on('done', () => {
+           var chapters = chapterFlow.map(function (chapter, i) {
+             var s = chapterUi[chapter](context, curtain.reveal)
+               .on('done', function () {
 
                  buttons
-                   .filter(d => d.title === s.title)
+                   .filter(function (d) { return d.title === s.title; })
                    .classed('finished', true);
 
                  if (i < chapterFlow.length - 1) {
-                   const next = chapterFlow[i + 1];
-                   context.container().select(`button.chapter-${next}`)
+                   var next = chapterFlow[i + 1];
+                   context.container().select(("button.chapter-" + next))
                      .classed('next', true);
                  }
 
              return s;
            });
 
-           chapters[chapters.length - 1].on('startEditing', () => {
+           chapters[chapters.length - 1].on('startEditing', function () {
              // Store walkthrough progress..
              progress.push('startEditing');
              corePreferences('walkthrough_progress', utilArrayUniq(progress).join(';'));
 
              // Store if walkthrough is completed..
-             let incomplete = utilArrayDifference(chapterFlow, progress);
+             var incomplete = utilArrayDifference(chapterFlow, progress);
              if (!incomplete.length) {
                corePreferences('walkthrough_completed', 'yes');
              }
              if (osm) { osm.toggle(true).reset().caches(caches); }
              context.history().reset().merge(Object.values(baseEntities));
              context.background().baseLayerSource(background);
-             overlays.forEach(d => context.background().toggleOverlayLayer(d));
+             overlays.forEach(function (d) { return context.background().toggleOverlayLayer(d); });
              if (history) { context.history().fromJSON(history, false); }
              context.map().centerZoom(center, zoom);
              window.location.replace(hash);
              context.inIntro(false);
            });
 
-           let navwrap = selection
+           var navwrap = selection
              .append('div')
              .attr('class', 'intro-nav-wrap fillD');
 
              .append('use')
              .attr('xlink:href', '#iD-logo-walkthrough');
 
-           let buttonwrap = navwrap
+           var buttonwrap = navwrap
              .append('div')
              .attr('class', 'joined')
              .selectAll('button.chapter');
 
-           let buttons = buttonwrap
+           var buttons = buttonwrap
              .data(chapters)
              .enter()
              .append('button')
-             .attr('class', (d, i) => `chapter chapter-${chapterFlow[i]}`)
+             .attr('class', function (d, i) { return ("chapter chapter-" + (chapterFlow[i])); })
              .on('click', enterChapter);
 
            buttons
              .append('span')
-             .text(d => _t(d.title));
+             .text(function (d) { return _t(d.title); });
 
            buttons
              .append('span')
 
              buttons
                .classed('next', false)
-               .classed('active', d => d.title === _currChapter.title);
+               .classed('active', function (d) { return d.title === _currChapter.title; });
            }
          }
 
 
 
                function zoomStarted() {
-                   if (_skipEvents) return;
+                   if (_skipEvents) { return; }
                    _tStart = _tCurr = projection.transform();
                    _gesture = null;
                }
 
 
                function zoomed() {
-                   if (_skipEvents) return;
+                   if (_skipEvents) { return; }
 
                    var x = event.transform.x;
                    var y = event.transform.y;
 
 
                function zoomEnded() {
-                   if (_skipEvents) return;
-                   if (_gesture !== 'pan') return;
+                   if (_skipEvents) { return; }
+                   if (_gesture !== 'pan') { return; }
 
                    updateProjection();
                    _gesture = null;
 
                function redraw() {
                    clearTimeout(_timeoutID);
-                   if (_isHidden) return;
+                   if (_isHidden) { return; }
 
                    updateProjection();
                    var zMini = geoScaleToZoom(projection.scale());
                    var activeOverlayLayers = [];
                    for (var i = 0; i < overlaySources.length; i++) {
                        if (overlaySources[i].validZoom(zMini)) {
-                           if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
+                           if (!overlayLayers[i]) { overlayLayers[i] = rendererTileLayer(context); }
                            activeOverlayLayers.push(overlayLayers[i]
                                .source(overlaySources[i])
                                .projection(projection)
 
 
                function toggle() {
-                   if (event) event.preventDefault();
+                   if (event) { event.preventDefault(); }
 
                    _isHidden = !_isHidden;
 
                    var startHeight;
 
                    function startResize() {
-                       if (pointerId !== (event.pointerId || 'mouse')) return;
+                       if (pointerId !== (event.pointerId || 'mouse')) { return; }
 
                        event.preventDefault();
                        event.stopPropagation();
                    }
 
                    function stopResize() {
-                       if (pointerId !== (event.pointerId || 'mouse')) return;
+                       if (pointerId !== (event.pointerId || 'mouse')) { return; }
 
                        event.preventDefault();
                        event.stopPropagation();
                if (photoDimensions[0] > mapDimensions[0] || photoDimensions[1] > (mapDimensions[1] - 90)) {
                    var setPhotoDimensions = [
                        Math.min(photoDimensions[0], mapDimensions[0]),
-                       Math.min(photoDimensions[1], mapDimensions[1] - 90),
-                   ];
+                       Math.min(photoDimensions[1], mapDimensions[1] - 90) ];
 
                    photoviewer
                        .style('width', setPhotoDimensions[0] + 'px')
 
        function uiRestore(context) {
          return function(selection) {
-           if (!context.history().hasRestorableChanges()) return;
+           if (!context.history().hasRestorableChanges()) { return; }
 
-           let modalSelection = uiModal(selection, true);
+           var modalSelection = uiModal(selection, true);
 
            modalSelection.select('.modal')
              .attr('class', 'modal fillL');
 
-           let introModal = modalSelection.select('.content');
+           var introModal = modalSelection.select('.content');
 
            introModal
              .append('div')
              .append('p')
              .text(_t('restore.description'));
 
-           let buttonWrap = introModal
+           var buttonWrap = introModal
              .append('div')
              .attr('class', 'modal-actions');
 
-           let restore = buttonWrap
+           var restore = buttonWrap
              .append('button')
              .attr('class', 'restore')
-             .on('click', () => {
+             .on('click', function () {
                context.history().restore();
                modalSelection.remove();
              });
              .append('div')
              .text(_t('restore.restore'));
 
-           let reset = buttonWrap
+           var reset = buttonWrap
              .append('button')
              .attr('class', 'reset')
-             .on('click', () => {
+             .on('click', function () {
                context.history().clearSaved();
                modalSelection.remove();
              });
 
 
        function search(input, dims) {
-         if (!dims) dims = 'NSEW';
-         if (typeof input !== 'string') return null;
+         if (!dims) { dims = 'NSEW'; }
+         if (typeof input !== 'string') { return null; }
 
          input = input.toUpperCase();
          var regex = /^[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)[°º˚]?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/;
 
          var m = input.match(regex);
-         if (!m) return null;  // no match
+         if (!m) { return null; }  // no match
 
          var matched = m[0];
 
          }
 
          // if unrecognized dimension
-         if (dim && dims.indexOf(dim) === -1) return null;
+         if (dim && dims.indexOf(dim) === -1) { return null; }
 
          // extract DMS
          var deg = m[2] ? parseFloat(m[2]) : 0;
          var min = m[3] ? parseFloat(m[3]) / 60 : 0;
          var sec = m[4] ? parseFloat(m[4]) / 3600 : 0;
          var sign = (deg < 0) ? -1 : 1;
-         if (dim === 'S' || dim === 'W') sign *= -1;
+         if (dim === 'S' || dim === 'W') { sign *= -1; }
 
          return {
            val: (Math.abs(deg) + min + sec) * sign,
        function pair(input, dims) {
          input = input.trim();
          var one = search(input, dims);
-         if (!one) return null;
+         if (!one) { return null; }
 
          input = one.remain.trim();
          var two = search(input, dims);
-         if (!two || two.remain) return null;
+         if (!two || two.remain) { return null; }
 
          if (one.dim) {
            return swapdim(one.val, two.val, one.dim);
 
 
        function swapdim(a, b, dim) {
-         if (dim === 'N' || dim === 'S') return [a, b];
-         if (dim === 'W' || dim === 'E') return [b, a];
+         if (dim === 'N' || dim === 'S') { return [a, b]; }
+         if (dim === 'W' || dim === 'E') { return [b, a]; }
        }
 
        function uiFeatureList(context) {
 
                function focusSearch() {
                    var mode = context.mode() && context.mode().id;
-                   if (mode !== 'browse') return;
+                   if (mode !== 'browse') { return; }
 
                    event.preventDefault();
                    search.node().focus();
                    var visibleCenter = context.map().extent().center();
                    var q = search.property('value').toLowerCase();
 
-                   if (!q) return result;
+                   if (!q) { return result; }
 
                    var idMatch = q.match(/(?:^|\W)(node|way|relation|[nwr])\W?0*([1-9]\d*)(?:\W|$)/i);
 
                    var localResults = [];
                    for (var id in allEntities) {
                        var entity = allEntities[id];
-                       if (!entity) continue;
+                       if (!entity) { continue; }
 
                        var name = utilDisplayName(entity) || '';
-                       if (name.toLowerCase().indexOf(q) < 0) continue;
+                       if (name.toLowerCase().indexOf(q) < 0) { continue; }
 
                        var matched = _mainPresetIndex.match(entity, graph);
                        var type = (matched && matched.name()) || utilDisplayType(entity.id);
                            distance: distance
                        });
 
-                       if (localResults.length > 100) break;
+                       if (localResults.length > 100) { break; }
                    }
                    localResults = localResults.sort(function byDistance(a, b) {
                        return a.distance - b.distance;
 
 
                function mouseover(d) {
-                   if (d.id === -1) return;
+                   if (d.id === -1) { return; }
 
                    utilHighlightEntities([d.id], true, context);
                }
 
 
                function mouseout(d) {
-                   if (d.id === -1) return;
+                   if (d.id === -1) { return; }
 
                    utilHighlightEntities([d.id], false, context);
                }
                    .attr('class', 'issue-fix-item')
                    .on('click', function(d) {
                        // not all fixes are actionable
-                       if (!select(this).classed('actionable') || !d.onClick) return;
+                       if (!select(this).classed('actionable') || !d.onClick) { return; }
 
                        // Don't run another fix for this issue within a second of running one
                        // (Necessary for "Select a feature type" fix. Most fixes should only ever run once)
-                       if (d.issue.dateLastRanFix && new Date() - d.issue.dateLastRanFix < 1000) return;
+                       if (d.issue.dateLastRanFix && new Date() - d.issue.dateLastRanFix < 1000) { return; }
                        d.issue.dateLastRanFix = new Date();
 
                        // remove hover-highlighting
            }
 
            section.entityIDs = function(val) {
-               if (!arguments.length) return _entityIDs;
+               if (!arguments.length) { return _entityIDs; }
                if (!_entityIDs || !val || !utilArrayIdentical(_entityIDs, val)) {
                    _entityIDs = val;
                    _activeIssueID = null;
        }
 
        function uiPresetIcon() {
-         let _preset;
-         let _geometry;
-         let _sizeClass = 'medium';
+         var _preset;
+         var _geometry;
+         var _sizeClass = 'medium';
 
 
          function isSmall() {
 
          function getIcon(p, geom) {
            if (isSmall() && p.isFallback && p.isFallback())
-             return 'iD-icon-' + p.id;
+             { return 'iD-icon-' + p.id; }
            else if (p.icon)
-             return p.icon;
+             { return p.icon; }
            else if (geom === 'line')
-             return 'iD-other-line';
+             { return 'iD-other-line'; }
            else if (geom === 'vertex')
-             return p.isFallback() ? '' : 'temaki-vertex';
+             { return p.isFallback() ? '' : 'temaki-vertex'; }
            else if (isSmall() && geom === 'point')
-             return '';
+             { return ''; }
            else
-             return 'maki-marker-stroked';
+             { return 'maki-marker-stroked'; }
          }
 
 
          function renderPointBorder(enter) {
-           const w = 40;
-           const h = 40;
+           var w = 40;
+           var h = 40;
 
            enter
              .append('svg')
              .attr('class', 'preset-icon-fill preset-icon-point-border')
              .attr('width', w)
              .attr('height', h)
-             .attr('viewBox', `0 0 ${w} ${h}`)
+             .attr('viewBox', ("0 0 " + w + " " + h))
              .append('path')
              .attr('transform', 'translate(11.5, 8)')
              .attr('d', 'M 17,8 C 17,13 11,21 8.5,23.5 C 6,21 0,13 0,8 C 0,4 4,-0.5 8.5,-0.5 C 13,-0.5 17,4 17,8 z');
 
 
          function renderCircleFill(fillEnter) {
-           const w = 60;
-           const h = 60;
-           const d = 40;
+           var w = 60;
+           var h = 60;
+           var d = 40;
 
            fillEnter
              .append('svg')
              .attr('class', 'preset-icon-fill preset-icon-fill-vertex')
              .attr('width', w)
              .attr('height', h)
-             .attr('viewBox', `0 0 ${w} ${h}`)
+             .attr('viewBox', ("0 0 " + w + " " + h))
              .append('circle')
              .attr('cx', w / 2)
              .attr('cy', h / 2)
 
 
          function renderSquareFill(fillEnter) {
-           const d = isSmall() ? 40 : 60;
-           const w = d;
-           const h = d;
-           const l = d * 2/3;
-           const c1 = (w-l) / 2;
-           const c2 = c1 + l;
+           var d = isSmall() ? 40 : 60;
+           var w = d;
+           var h = d;
+           var l = d * 2/3;
+           var c1 = (w-l) / 2;
+           var c2 = c1 + l;
 
            fillEnter = fillEnter
              .append('svg')
              .attr('class', 'preset-icon-fill preset-icon-fill-area')
              .attr('width', w)
              .attr('height', h)
-             .attr('viewBox', `0 0 ${w} ${h}`);
+             .attr('viewBox', ("0 0 " + w + " " + h));
 
-           ['fill', 'stroke'].forEach(klass => {
+           ['fill', 'stroke'].forEach(function (klass) {
              fillEnter
                .append('path')
-               .attr('d', `M${c1} ${c1} L${c1} ${c2} L${c2} ${c2} L${c2} ${c1} Z`)
-               .attr('class', `line area ${klass}`);
+               .attr('d', ("M" + c1 + " " + c1 + " L" + c1 + " " + c2 + " L" + c2 + " " + c2 + " L" + c2 + " " + c1 + " Z"))
+               .attr('class', ("line area " + klass));
            });
 
-           const rVertex = 2.5;
-           [[c1, c1], [c1, c2], [c2, c2], [c2, c1]].forEach(point => {
+           var rVertex = 2.5;
+           [[c1, c1], [c1, c2], [c2, c2], [c2, c1]].forEach(function (point) {
              fillEnter
                .append('circle')
                .attr('class', 'vertex')
            });
 
            if (!isSmall()) {
-             const rMidpoint = 1.25;
-             [[c1, w/2], [c2, w/2], [h/2, c1], [h/2, c2]].forEach(point => {
+             var rMidpoint = 1.25;
+             [[c1, w/2], [c2, w/2], [h/2, c1], [h/2, c2]].forEach(function (point) {
                fillEnter
                  .append('circle')
                  .attr('class', 'midpoint')
 
 
          function renderLine(lineEnter) {
-           const d = isSmall() ? 40 : 60;
+           var d = isSmall() ? 40 : 60;
            // draw the line parametrically
-           const w = d;
-           const h = d;
-           const y = Math.round(d * 0.72);
-           const l = Math.round(d * 0.6);
-           const r = 2.5;
-           const x1 = (w - l) / 2;
-           const x2 = x1 + l;
+           var w = d;
+           var h = d;
+           var y = Math.round(d * 0.72);
+           var l = Math.round(d * 0.6);
+           var r = 2.5;
+           var x1 = (w - l) / 2;
+           var x2 = x1 + l;
 
            lineEnter = lineEnter
              .append('svg')
              .attr('class', 'preset-icon-line')
              .attr('width', w)
              .attr('height', h)
-             .attr('viewBox', `0 0 ${w} ${h}`);
+             .attr('viewBox', ("0 0 " + w + " " + h));
 
-           ['casing', 'stroke'].forEach(klass => {
+           ['casing', 'stroke'].forEach(function (klass) {
              lineEnter
                .append('path')
-               .attr('d', `M${x1} ${y} L${x2} ${y}`)
-               .attr('class', `line ${klass}`);
+               .attr('d', ("M" + x1 + " " + y + " L" + x2 + " " + y))
+               .attr('class', ("line " + klass));
            });
 
-           [[x1-1, y], [x2+1, y]].forEach(point => {
+           [[x1-1, y], [x2+1, y]].forEach(function (point) {
              lineEnter
                .append('circle')
                .attr('class', 'vertex')
 
 
          function renderRoute(routeEnter) {
-           const d = isSmall() ? 40 : 60;
+           var d = isSmall() ? 40 : 60;
            // draw the route parametrically
-           const w = d;
-           const h = d;
-           const y1 = Math.round(d * 0.80);
-           const y2 = Math.round(d * 0.68);
-           const l = Math.round(d * 0.6);
-           const r = 2;
-           const x1 = (w - l) / 2;
-           const x2 = x1 + l / 3;
-           const x3 = x2 + l / 3;
-           const x4 = x3 + l / 3;
+           var w = d;
+           var h = d;
+           var y1 = Math.round(d * 0.80);
+           var y2 = Math.round(d * 0.68);
+           var l = Math.round(d * 0.6);
+           var r = 2;
+           var x1 = (w - l) / 2;
+           var x2 = x1 + l / 3;
+           var x3 = x2 + l / 3;
+           var x4 = x3 + l / 3;
 
            routeEnter = routeEnter
              .append('svg')
              .attr('class', 'preset-icon-route')
              .attr('width', w)
              .attr('height', h)
-             .attr('viewBox', `0 0 ${w} ${h}`);
+             .attr('viewBox', ("0 0 " + w + " " + h));
 
-           ['casing', 'stroke'].forEach(klass => {
+           ['casing', 'stroke'].forEach(function (klass) {
              routeEnter
                .append('path')
-               .attr('d', `M${x1} ${y1} L${x2} ${y2}`)
-               .attr('class', `segment0 line ${klass}`);
+               .attr('d', ("M" + x1 + " " + y1 + " L" + x2 + " " + y2))
+               .attr('class', ("segment0 line " + klass));
              routeEnter
                .append('path')
-               .attr('d', `M${x2} ${y2} L${x3} ${y1}`)
-               .attr('class', `segment1 line ${klass}`);
+               .attr('d', ("M" + x2 + " " + y2 + " L" + x3 + " " + y1))
+               .attr('class', ("segment1 line " + klass));
              routeEnter
                .append('path')
-               .attr('d', `M${x3} ${y1} L${x4} ${y2}`)
-               .attr('class', `segment2 line ${klass}`);
+               .attr('d', ("M" + x3 + " " + y1 + " L" + x4 + " " + y2))
+               .attr('class', ("segment2 line " + klass));
            });
 
-           [[x1, y1], [x2, y2], [x3, y1], [x4, y2]].forEach(point => {
+           [[x1, y1], [x2, y2], [x3, y1], [x4, y2]].forEach(function (point) {
              routeEnter
                .append('circle')
                .attr('class', 'vertex')
          //    / \ /
          //   o   o
          // This dataset defines the styles that are used to draw the zigzag segments.
-         const routeSegments = {
+         var routeSegments = {
            bicycle: ['highway/cycleway', 'highway/cycleway', 'highway/cycleway'],
            bus: ['highway/unclassified', 'highway/secondary', 'highway/primary'],
            trolleybus: ['highway/unclassified', 'highway/secondary', 'highway/primary'],
 
 
          function render() {
-           let p = _preset.apply(this, arguments);
-           let geom = _geometry ? _geometry.apply(this, arguments) : null;
+           var p = _preset.apply(this, arguments);
+           var geom = _geometry ? _geometry.apply(this, arguments) : null;
            if (geom === 'relation' && p.tags && ((p.tags.type === 'route' && p.tags.route && routeSegments[p.tags.route]) || p.tags.type === 'waterway')) {
              geom = 'route';
            }
 
-           const showThirdPartyIcons = corePreferences('preferences.privacy.thirdpartyicons') || 'true';
-           const isFallback = isSmall() && p.isFallback && p.isFallback();
-           const imageURL = (showThirdPartyIcons === 'true') && p.imageURL;
-           const picon = getIcon(p, geom);
-           const isMaki = picon && /^maki-/.test(picon);
-           const isTemaki = picon && /^temaki-/.test(picon);
-           const isFa = picon && /^fa[srb]-/.test(picon);
-           const isTnp = picon && /^tnp-/.test(picon);
-           const isiDIcon = picon && !(isMaki || isTemaki || isFa || isTnp);
-           const isCategory = !p.setTags;
-           const drawPoint = picon && geom === 'point' && isSmall() && !isFallback;
-           const drawVertex = picon !== null && geom === 'vertex' && (!isSmall() || !isFallback);
-           const drawLine = picon && geom === 'line' && !isFallback && !isCategory;
-           const drawArea = picon && geom === 'area' && !isFallback;
-           const drawRoute = picon && geom === 'route';
-           const isFramed = (drawVertex || drawArea || drawLine || drawRoute);
-
-           let tags = !isCategory ? p.setTags({}, geom) : {};
-           for (let k in tags) {
+           var showThirdPartyIcons = corePreferences('preferences.privacy.thirdpartyicons') || 'true';
+           var isFallback = isSmall() && p.isFallback && p.isFallback();
+           var imageURL = (showThirdPartyIcons === 'true') && p.imageURL;
+           var picon = getIcon(p, geom);
+           var isMaki = picon && /^maki-/.test(picon);
+           var isTemaki = picon && /^temaki-/.test(picon);
+           var isFa = picon && /^fa[srb]-/.test(picon);
+           var isTnp = picon && /^tnp-/.test(picon);
+           var isiDIcon = picon && !(isMaki || isTemaki || isFa || isTnp);
+           var isCategory = !p.setTags;
+           var drawPoint = picon && geom === 'point' && isSmall() && !isFallback;
+           var drawVertex = picon !== null && geom === 'vertex' && (!isSmall() || !isFallback);
+           var drawLine = picon && geom === 'line' && !isFallback && !isCategory;
+           var drawArea = picon && geom === 'area' && !isFallback;
+           var drawRoute = picon && geom === 'route';
+           var isFramed = (drawVertex || drawArea || drawLine || drawRoute);
+
+           var tags = !isCategory ? p.setTags({}, geom) : {};
+           for (var k in tags) {
              if (tags[k] === '*') {
                tags[k] = 'yes';
              }
            }
 
-           let tagClasses = svgTagClasses().getClassesString(tags, '');
-           let selection = select(this);
+           var tagClasses = svgTagClasses().getClassesString(tags, '');
+           var selection = select(this);
 
-           let container = selection.selectAll('.preset-icon-container')
+           var container = selection.selectAll('.preset-icon-container')
              .data([0]);
 
            container = container.enter()
              .append('div')
-             .attr('class', `preset-icon-container ${_sizeClass}`)
+             .attr('class', ("preset-icon-container " + _sizeClass))
              .merge(container);
 
            container
              .classed('fallback', isFallback);
 
 
-           let pointBorder = container.selectAll('.preset-icon-point-border')
+           var pointBorder = container.selectAll('.preset-icon-point-border')
              .data(drawPoint ? [0] : []);
 
            pointBorder.exit()
              .remove();
 
-           let pointBorderEnter = pointBorder.enter();
+           var pointBorderEnter = pointBorder.enter();
            renderPointBorder(pointBorderEnter);
            pointBorder = pointBorderEnter.merge(pointBorder);
 
 
-           let vertexFill = container.selectAll('.preset-icon-fill-vertex')
+           var vertexFill = container.selectAll('.preset-icon-fill-vertex')
              .data(drawVertex ? [0] : []);
 
            vertexFill.exit()
              .remove();
 
-           let vertexFillEnter = vertexFill.enter();
+           var vertexFillEnter = vertexFill.enter();
            renderCircleFill(vertexFillEnter);
            vertexFill = vertexFillEnter.merge(vertexFill);
 
 
-           let fill = container.selectAll('.preset-icon-fill-area')
+           var fill = container.selectAll('.preset-icon-fill-area')
              .data(drawArea ? [0] : []);
 
            fill.exit()
              .remove();
 
-           let fillEnter = fill.enter();
+           var fillEnter = fill.enter();
            renderSquareFill(fillEnter);
            fill = fillEnter.merge(fill);
 
            fill.selectAll('path.stroke')
-             .attr('class', `area stroke ${tagClasses}`);
+             .attr('class', ("area stroke " + tagClasses));
            fill.selectAll('path.fill')
-             .attr('class', `area fill ${tagClasses}`);
+             .attr('class', ("area fill " + tagClasses));
 
 
-           let line = container.selectAll('.preset-icon-line')
+           var line = container.selectAll('.preset-icon-line')
              .data(drawLine ? [0] : []);
 
            line.exit()
              .remove();
 
-           let lineEnter = line.enter();
+           var lineEnter = line.enter();
            renderLine(lineEnter);
            line = lineEnter.merge(line);
 
            line.selectAll('path.stroke')
-             .attr('class', `line stroke ${tagClasses}`);
+             .attr('class', ("line stroke " + tagClasses));
            line.selectAll('path.casing')
-             .attr('class', `line casing ${tagClasses}`);
+             .attr('class', ("line casing " + tagClasses));
 
 
-           let route = container.selectAll('.preset-icon-route')
+           var route = container.selectAll('.preset-icon-route')
              .data(drawRoute ? [0] : []);
 
            route.exit()
              .remove();
 
-           let routeEnter = route.enter();
+           var routeEnter = route.enter();
            renderRoute(routeEnter);
            route = routeEnter.merge(route);
 
            if (drawRoute) {
-             let routeType = p.tags.type === 'waterway' ? 'waterway' : p.tags.route;
-             const segmentPresetIDs = routeSegments[routeType];
-             for (let i in segmentPresetIDs) {
-               const segmentPreset = _mainPresetIndex.item(segmentPresetIDs[i]);
-               const segmentTagClasses = svgTagClasses().getClassesString(segmentPreset.tags, '');
-               route.selectAll(`path.stroke.segment${i}`)
-                 .attr('class', `segment${i} line stroke ${segmentTagClasses}`);
-               route.selectAll(`path.casing.segment${i}`)
-                 .attr('class', `segment${i} line casing ${segmentTagClasses}`);
+             var routeType = p.tags.type === 'waterway' ? 'waterway' : p.tags.route;
+             var segmentPresetIDs = routeSegments[routeType];
+             for (var i in segmentPresetIDs) {
+               var segmentPreset = _mainPresetIndex.item(segmentPresetIDs[i]);
+               var segmentTagClasses = svgTagClasses().getClassesString(segmentPreset.tags, '');
+               route.selectAll(("path.stroke.segment" + i))
+                 .attr('class', ("segment" + i + " line stroke " + segmentTagClasses));
+               route.selectAll(("path.casing.segment" + i))
+                 .attr('class', ("segment" + i + " line casing " + segmentTagClasses));
              }
            }
 
 
-           let icon = container.selectAll('.preset-icon')
+           var icon = container.selectAll('.preset-icon')
              .data(picon ? [0] : []);
 
            icon.exit()
            icon.selectAll('use')
              .attr('href', '#' + picon + (isMaki ? (isSmall() && geom === 'point' ? '-11' : '-15') : ''));
 
-           let imageIcon = container.selectAll('img.image-icon')
+           var imageIcon = container.selectAll('img.image-icon')
              .data(imageURL ? [0] : []);
 
            imageIcon.exit()
            imageIcon = imageIcon.enter()
              .append('img')
              .attr('class', 'image-icon')
-             .on('load', () => container.classed('showing-img', true) )
-             .on('error', () => container.classed('showing-img', false) )
+             .on('load', function () { return container.classed('showing-img', true); } )
+             .on('error', function () { return container.classed('showing-img', false); } )
              .merge(imageIcon);
 
            imageIcon
 
 
          presetIcon.preset = function(val) {
-           if (!arguments.length) return _preset;
+           if (!arguments.length) { return _preset; }
            _preset = utilFunctor(val);
            return presetIcon;
          };
 
 
          presetIcon.geometry = function(val) {
-           if (!arguments.length) return _geometry;
+           if (!arguments.length) { return _geometry; }
            _geometry = utilFunctor(val);
            return presetIcon;
          };
 
 
          presetIcon.sizeClass = function(val) {
-           if (!arguments.length) return _sizeClass;
+           if (!arguments.length) { return _sizeClass; }
            _sizeClass = val;
            return presetIcon;
          };
            }
 
            section.entityIDs = function(val) {
-               if (!arguments.length) return _entityIDs;
+               if (!arguments.length) { return _entityIDs; }
                _entityIDs = val;
                return section;
            };
 
            section.presets = function(val) {
-               if (!arguments.length) return _presets;
+               if (!arguments.length) { return _presets; }
 
                // don't reload the same preset
                if (!utilArrayIdentical(val, _presets)) {
 
                for (var i in _entityIDs) {
                    var geometry = context.graph().geometry(_entityIDs[i]);
-                   if (!counts[geometry]) counts[geometry] = 0;
+                   if (!counts[geometry]) { counts[geometry] = 0; }
                    counts[geometry] += 1;
                }
 
 
 
            fieldHelp.button = function(selection) {
-               if (_body.empty()) return;
+               if (_body.empty()) { return; }
 
                var button = selection.selectAll('.field-help-button')
                    .data([0]);
            fieldHelp.body = function(selection) {
                // This control expects the field to have a form-field-input-wrap div
                _wrap = selection.selectAll('.form-field-input-wrap');
-               if (_wrap.empty()) return;
+               if (_wrap.empty()) { return; }
 
                // absolute position relative to the inspector, so it "floats" above the fields
                _inspector = context.container().select('.sidebar .entity-editor-pane .inspector-body');
-               if (_inspector.empty()) return;
+               if (_inspector.empty()) { return; }
 
                _body = _inspector.selectAll('.field-help-body')
                    .data([0]);
 
 
            function reverserHidden() {
-               if (!context.container().select('div.inspector-hover').empty()) return true;
+               if (!context.container().select('div.inspector-hover').empty()) { return true; }
                return !(_value === 'yes' || (_impliedYes && !_value));
            }
 
 
            function reverserSetText(selection) {
                var entity = _entityIDs.length && context.hasEntity(_entityIDs[0]);
-               if (reverserHidden() || !entity) return selection;
+               if (reverserHidden() || !entity) { return selection; }
 
                var first = entity.first();
                var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
 
 
            check.entityIDs = function(val) {
-               if (!arguments.length) return _entityIDs;
+               if (!arguments.length) { return _entityIDs; }
                _entityIDs = val;
                return check;
            };
                }
 
                function textFor(val) {
-                   if (val === '') val = undefined;
+                   if (val === '') { val = undefined; }
                    var index = values.indexOf(val);
                    return (index !== -1 ? texts[index] : ('"' + val + '"'));
                }
 
 
            function setStaticValues(callback) {
-               if (!(optstrings || optarray)) return;
+               if (!(optstrings || optarray)) { return; }
 
                if (optstrings) {
                    _comboData = Object.keys(optstrings).map(function(k) {
                }
 
                combobox.data(objectDifference(_comboData, _multiData));
-               if (callback) callback(_comboData);
+               if (callback) { callback(_comboData); }
            }
 
 
                }
 
                taginfo[fn](params, function(err, data) {
-                   if (err) return;
+                   if (err) { return; }
 
                    data = data.filter(function(d) {
 
 
                    _comboData = data.map(function(d) {
                        var k = d.value;
-                       if (isMulti) k = k.replace(field.key, '');
+                       if (isMulti) { k = k.replace(field.key, ''); }
                        var v = snake_case ? unsnake(k) : k;
                        return {
                            key: k,
                    });
 
                    _comboData = objectDifference(_comboData, _multiData);
-                   if (callback) callback(_comboData);
+                   if (callback) { callback(_comboData); }
                });
            }
 
                    utilGetSetValue(input, '');
 
                    var vals = val.split(';').filter(Boolean);
-                   if (!vals.length) return;
+                   if (!vals.length) { return; }
 
                    if (isMulti) {
                        utilArrayUniq(vals).forEach(function(v) {
                                // don't set a multicombo value to 'yes' if it already has a non-'no' value
                                // e.g. `language:de=main`
                                var old = _tags[key];
-                               if (typeof old === 'string' && old.toLowerCase() !== 'no') return;
+                               if (typeof old === 'string' && old.toLowerCase() !== 'no') { return; }
                            }
                            key = context.cleanTagKey(key);
                            field.keys.push(key);
                    var rawValue = utilGetSetValue(input);
 
                    // don't override multiple values with blank string
-                   if (!rawValue && Array.isArray(_tags[field.key])) return;
+                   if (!rawValue && Array.isArray(_tags[field.key])) { return; }
 
                    val = context.cleanTagValue(tagValue(rawValue));
                    t[field.key] = val || undefined;
                    if (isMulti) {
                        // Build _multiData array containing keys already set..
                        for (var k in tags) {
-                           if (k.indexOf(field.key) !== 0) continue;
+                           if (k.indexOf(field.key) !== 0) { continue; }
                            var v = tags[k];
-                           if (!v || (typeof v === 'string' && v.toLowerCase() === 'no')) continue;
+                           if (!v || (typeof v === 'string' && v.toLowerCase() === 'no')) { continue; }
 
                            var suffix = k.substring(field.key.length);
                            _multiData.push({
                                if (!commonValues) {
                                    commonValues = thisVals;
                                } else {
-                                   commonValues = commonValues.filter(value => thisVals.includes(value));
+                                   commonValues = commonValues.filter(function (value) { return thisVals.includes(value); });
                                }
                            });
                            allValues = utilArrayUniq(allValues).filter(Boolean);
 
                        if (!select(this).classed('dragging') &&
                            // don't display drag until dragging beyond a distance threshold
-                           Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) <= 5) return;
+                           Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) <= 5) { return; }
 
                        select(this)
                            .classed('dragging', true);
 
 
            combo.entityIDs = function(val) {
-               if (!arguments.length) return _entityIDs;
+               if (!arguments.length) { return _entityIDs; }
                _entityIDs = val;
                return combo;
            };
 
 
            function updatePhonePlaceholder() {
-               if (input.empty() || !Object.keys(_phoneFormats).length) return;
+               if (input.empty() || !Object.keys(_phoneFormats).length) { return; }
 
                var extent = combinedEntityExtent();
                var countryCode = extent && iso1A2Code(extent.center());
                var format = countryCode && _phoneFormats[countryCode.toLowerCase()];
-               if (format) input.attr('placeholder', format);
+               if (format) { input.attr('placeholder', format); }
            }
 
 
                return function() {
                    var t = {};
                    var val = utilGetSetValue(input);
-                   if (!onInput) val = context.cleanTagValue(val);
+                   if (!onInput) { val = context.cleanTagValue(val); }
 
                    // don't override multiple values with blank string
-                   if (!val && Array.isArray(_tags[field.key])) return;
+                   if (!val && Array.isArray(_tags[field.key])) { return; }
 
                    if (!onInput) {
                        if (field.type === 'number' && val) {
 
 
            i.entityIDs = function(val) {
-               if (!arguments.length) return _entityIDs;
+               if (!arguments.length) { return _entityIDs; }
                _entityIDs = val;
                return i;
            };
 
            i.focus = function() {
                var node = input.node();
-               if (node) node.focus();
+               if (node) { node.focus(); }
            };
 
            function combinedEntityExtent() {
                var value = context.cleanTagValue(utilGetSetValue(select(this)));
 
                // don't override multiple values with blank string
-               if (!value && typeof _tags[d] !== 'string') return;
+               if (!value && typeof _tags[d] !== 'string') { return; }
 
                tag[d] = value || undefined;
                dispatch$1.call('change', this, tag);
                function isAddressable(d) {
                    if (d.tags.name) {
                        if (d.tags.admin_level === '8' && d.tags.boundary === 'administrative')
-                           return true;
+                           { return true; }
                        if (d.tags.border_type === 'city')
-                           return true;
+                           { return true; }
                        if (d.tags.place === 'city' || d.tags.place === 'town' || d.tags.place === 'village')
-                           return true;
+                           { return true; }
                    }
 
                    if (d.tags['addr:city'])
-                       return true;
+                       { return true; }
 
                    return false;
                }
 
            function updateForCountryCode() {
 
-               if (!_countryCode) return;
+               if (!_countryCode) { return; }
 
                var addressFormat;
                for (var i = 0; i < _addressFormats.length; i++) {
 
 
                function addDropdown(d) {
-                   if (dropdowns.indexOf(d.id) === -1) return;  // not a dropdown
+                   if (dropdowns.indexOf(d.id) === -1) { return; }  // not a dropdown
 
                    var nearValues = (d.id === 'street') ? getNearStreets
                        : (d.id === 'city') ? getNearCities
                _wrap.selectAll('input:not(.combobox-input)')
                    .on('input', change(true));
 
-               if (_tags) updateTags(_tags);
+               if (_tags) { updateTags(_tags); }
            }
 
 
                            var key = field.key + ':' + subfield.id;
 
                            var value = this.value;
-                           if (!onInput) value = context.cleanTagValue(value);
+                           if (!onInput) { value = context.cleanTagValue(value); }
 
                            // don't override multiple values with blank string
-                           if (Array.isArray(_tags[key]) && !value) return;
+                           if (Array.isArray(_tags[key]) && !value) { return; }
 
                            tags[key] = value || undefined;
                        });
 
 
            address.entityIDs = function(val) {
-               if (!arguments.length) return _entityIDs;
+               if (!arguments.length) { return _entityIDs; }
                _entityIDs = val;
                return address;
            };
 
            address.focus = function() {
                var node = _wrap.selectAll('input').node();
-               if (node) node.focus();
+               if (node) { node.focus(); }
            };
 
 
                var newValue = context.cleanTagValue(utilGetSetValue(select(this)));
 
                // don't override multiple values with blank string
-               if (!newValue && (Array.isArray(_tags.cycleway) || Array.isArray(_tags[key]))) return;
+               if (!newValue && (Array.isArray(_tags.cycleway) || Array.isArray(_tags[key]))) { return; }
 
                if (newValue === 'none' || newValue === '') { newValue = undefined; }
 
                var commonValue = typeof tags.cycleway === 'string' && tags.cycleway;
 
                utilGetSetValue(items.selectAll('.preset-input-cycleway'), function(d) {
-                       if (commonValue) return commonValue;
+                       if (commonValue) { return commonValue; }
                        return !tags.cycleway && typeof tags[d] === 'string' ? tags[d] : '';
                    })
                    .attr('title', function(d) {
 
            cycleway.focus = function() {
                var node = wrap.selectAll('input').node();
-               if (node) node.focus();
+               if (node) { node.focus(); }
            };
 
 
 
 
            function loadLanguagesArray(dataLanguages) {
-               if (_languagesArray.length !== 0) return;
+               if (_languagesArray.length !== 0) { return; }
 
                // some conversion is needed to ensure correct OSM tags are used
                var replacements = {
                };
 
                for (var code in dataLanguages) {
-                   if (replacements[code] === false) continue;
+                   if (replacements[code] === false) { continue; }
                    var metaCode = code;
-                   if (replacements[code]) metaCode = replacements[code];
+                   if (replacements[code]) { metaCode = replacements[code]; }
 
                    _languagesArray.push({
                        localName: _mainLocalizer.languageName(metaCode, { localOnly: true }),
                    _entityIDs.some(function(entityID) {
 
                        var entity = context.graph().hasEntity(entityID);
-                       if (!entity) return false;
+                       if (!entity) { return false; }
 
                        var original = context.graph().base().entities[_entityIDs[0]];
                        var hasOriginalName = original && entity.tags.name && entity.tags.name === original.tags.name;
                        // if the name was already edited manually then allow further editing
-                       if (!hasOriginalName) return false;
+                       if (!hasOriginalName) { return false; }
 
                        // features linked to Wikidata are likely important and should be protected
-                       if (entity.tags.wikidata) return true;
+                       if (entity.tags.wikidata) { return true; }
 
                        // assume the name has already been confirmed if its source has been researched
-                       if (entity.tags['name:etymology:wikidata']) return true;
+                       if (entity.tags['name:etymology:wikidata']) { return true; }
 
                        var preset = _mainPresetIndex.match(entity, context.graph());
                        var isSuggestion = preset && preset.suggestion;
                        // - false = churches, parks, hospitals, etc. (things not in the index)
                        var isFallback = preset.isFallback();
                        var goodSuggestions = allSuggestions.filter(function(s) {
-                           if (isFallback) return true;
+                           if (isFallback) { return true; }
                            var sTag = s.id.split('/', 2);
                            var sKey = sTag[0];
                            var sValue = sTag[1];
                // So compare the current field value against the suggestions one last time.
                function checkBrandOnBlur() {
                    var latest = _entityIDs.length === 1 && context.hasEntity(_entityIDs[0]);
-                   if (!latest) return;   // deleting the entity blurred the field?
+                   if (!latest) { return; }   // deleting the entity blurred the field?
 
                    var preset = _mainPresetIndex.match(latest, context.graph());
-                   if (preset && preset.suggestion) return;   // already accepted
+                   if (preset && preset.suggestion) { return; }   // already accepted
 
                    // note: here we are testing against "decorated" names, i.e. 'Starbucks – Cafe'
                    var name = utilGetSetValue(input).trim();
 
                                // don't suggest brands from incompatible countries
                                if (_countryCode && s.countryCodes &&
-                                   s.countryCodes.indexOf(_countryCode) === -1) continue;
+                                   s.countryCodes.indexOf(_countryCode) === -1) { continue; }
 
                                var sTag = s.id.split('/', 2);
                                var sKey = sTag[0];
 
                function addNew() {
                    event.preventDefault();
-                   if (field.locked()) return;
+                   if (field.locked()) { return; }
 
                    var defaultLang = _mainLocalizer.languageCode().toLowerCase();
                    var langExists = _multilingual.find(function(datum) { return datum.lang === defaultLang; });
                        }
 
                        var val = utilGetSetValue(select(this));
-                       if (!onInput) val = context.cleanTagValue(val);
+                       if (!onInput) { val = context.cleanTagValue(val); }
 
                        // don't override multiple values with blank string
-                       if (!val && Array.isArray(_tags[field.key])) return;
+                       if (!val && Array.isArray(_tags[field.key])) { return; }
 
                        var t = {};
 
                        (d.localName && d.localName.toLowerCase() === lang) ||
                        (d.nativeName && d.nativeName.toLowerCase() === lang);
                });
-               if (language) lang = language.code;
+               if (language) { lang = language.code; }
 
                if (d.lang && d.lang !== lang) {
                    tags[key(d.lang)] = undefined;
 
 
            function changeValue(d) {
-               if (!d.lang) return;
+               if (!d.lang) { return; }
                var value = context.cleanTagValue(utilGetSetValue(select(this))) || undefined;
 
                // don't override multiple values with blank string
-               if (!value && Array.isArray(d.value)) return;
+               if (!value && Array.isArray(d.value)) { return; }
 
                var t = {};
                t[key(d.lang)] = value;
                    var langItem = _languagesArray.find(function(item) {
                        return item.code === code;
                    });
-                   if (langItem) langItems.push(langItem);
+                   if (langItem) { langItems.push(langItem); }
                });
                langItems = utilArrayUniq(langItems.concat(_languagesArray));
 
                            .append('button')
                            .attr('class', 'remove-icon-multilingual')
                            .on('click', function(d, index) {
-                               if (field.locked()) return;
+                               if (field.locked()) { return; }
                                event.preventDefault();
 
                                if (!d.lang || !d.value) {
                    var wm = tags.wikipedia.match(/([^:]+):(.+)/);
                    if (wm && wm[0] && wm[1]) {
                        wikipedia.translations(wm[1], wm[2], function(err, d) {
-                           if (err || !d) return;
+                           if (err || !d) { return; }
                            _wikiTitles = d;
                        });
                    }
 
 
            localized.entityIDs = function(val) {
-               if (!arguments.length) return _entityIDs;
+               if (!arguments.length) { return _entityIDs; }
                _entityIDs = val;
                _multilingual = [];
                loadCountryCode();
                var value = utilGetSetValue(input).trim();
 
                // don't override multiple values with blank string
-               if (!value && Array.isArray(_tags[field.key])) return;
+               if (!value && Array.isArray(_tags[field.key])) { return; }
 
                if (!value) {
                    tag[field.key] = undefined;
 
            function changeType(t, onInput) {
                var key = selectedKey();
-               if (!key) return;
+               if (!key) { return; }
 
                var val = t[key];
                if (val !== 'no') {
 
                radios.each(function(d) {
                    var active = select(this).property('checked');
-                   if (active) activeKey = d;
+                   if (active) { activeKey = d; }
 
                    if (field.key) {
-                       if (active) t[field.key] = d;
+                       if (active) { t[field.key] = d; }
                    } else {
                        var val = _oldType[activeKey] || 'yes';
                        t[d] = active ? val : undefined;
 
 
            radio.entityIDs = function(val) {
-               if (!arguments.length) return _entityIDs;
+               if (!arguments.length) { return _entityIDs; }
                _entityIDs = val;
                _oldType = {};
                return radio;
 
 
            function renderViewer(selection) {
-               if (!_intersection) return;
+               if (!_intersection) { return; }
 
                var vgraph = _intersection.graph;
                var filter = utilFunctor(true);
                            _oldTurns = [];
                            for (i = 0; i < turns.length; i++) {
                                var turn = turns[i];
-                               if (seen[turn.restrictionID]) continue;  // avoid deleting the turn twice (#4968, #4928)
+                               if (seen[turn.restrictionID]) { continue; }  // avoid deleting the turn twice (#4968, #4928)
 
                                if (turn.direct && turn.path[1] === datum.path[1]) {
                                    seen[turns[i].restrictionID] = true;
                                var prev = names[names.length - 1];
                                var curr = displayName(datum.via.ways[i], vgraph);
                                if (!prev || curr !== prev)   // collapse identical names
-                                   names.push(curr);
+                                   { names.push(curr); }
                            }
 
                            help
 
 
            restrictions.off = function(selection) {
-               if (!_initialized) return;
+               if (!_initialized) { return; }
 
                selection.selectAll('.surface')
                    .call(breathe.off)
                return function() {
 
                    var val = utilGetSetValue(input);
-                   if (!onInput) val = context.cleanTagValue(val);
+                   if (!onInput) { val = context.cleanTagValue(val); }
 
                    // don't override multiple values with blank string
-                   if (!val && Array.isArray(_tags[field.key])) return;
+                   if (!val && Array.isArray(_tags[field.key])) { return; }
 
                    var t = {};
                    t[field.key] = val || undefined;
                    .call(svgIcon('#iD-icon-out-link'))
                    .on('click', function() {
                        event.preventDefault();
-                       if (_wikiURL) window.open(_wikiURL, '_blank');
+                       if (_wikiURL) { window.open(_wikiURL, '_blank'); }
                    });
 
                searchRow = searchRow.merge(searchRowEnter);
                }
 
                wikidata.itemsForSearchQuery(q, function(err, data) {
-                   if (err) return;
+                   if (err) { return; }
 
                    for (var i in data) {
                        data[i].value = data[i].label + ' (' +  data[i].id + ')';
                        data[i].title = data[i].description;
                    }
 
-                   if (callback) callback(data);
+                   if (callback) { callback(data); }
                });
            }
 
                var initEntityIDs = _entityIDs;
 
                wikidata.entityByQID(_qid, function(err, entity) {
-                   if (err) return;
+                   if (err) { return; }
 
                    // If graph has changed, we can't apply this update.
-                   if (context.graph() !== initGraph) return;
+                   if (context.graph() !== initGraph) { return; }
 
-                   if (!entity.sitelinks) return;
+                   if (!entity.sitelinks) { return; }
 
                    var langs = wikidata.languagesToQuery();
                    // use the label and description languages as fallbacks
                    ['labels', 'descriptions'].forEach(function(key) {
-                       if (!entity[key]) return;
+                       if (!entity[key]) { return; }
 
                        var valueLangs = Object.keys(entity[key]);
-                       if (valueLangs.length === 0) return;
+                       if (valueLangs.length === 0) { return; }
                        var valueLang = valueLangs[0];
 
                        if (langs.indexOf(valueLang) === -1) {
                        newWikipediaValue = context.cleanTagValue(newWikipediaValue);
                    }
 
-                   if (typeof newWikipediaValue === 'undefined') return;
+                   if (typeof newWikipediaValue === 'undefined') { return; }
 
                    var actions = initEntityIDs.map(function(entityID) {
                        var entity = context.hasEntity(entityID);
-                       if (!entity) return;
+                       if (!entity) { return; }
 
                        var currTags = Object.assign({}, entity.tags);  // shallow copy
                        if (newWikipediaValue === null) {
-                           if (!currTags[_wikipediaKey]) return;
+                           if (!currTags[_wikipediaKey]) { return; }
 
                            delete currTags[_wikipediaKey];
                        } else {
                        return actionChangeTags(entityID, currTags);
                    }).filter(Boolean);
 
-                   if (!actions.length) return;
+                   if (!actions.length) { return; }
 
                    // Coalesce the update of wikidata tag into the previous tag change
                    context.overwrite(
            };
 
            function entityPropertyForDisplay(wikidataEntity, propKey) {
-               if (!wikidataEntity[propKey]) return '';
+               if (!wikidataEntity[propKey]) { return ''; }
                var propObj = wikidataEntity[propKey];
                var langKeys = Object.keys(propObj);
-               if (langKeys.length === 0) return '';
+               if (langKeys.length === 0) { return ''; }
                // sorted by priority, since we want to show the user's language first if possible
                var langs = wikidata.languagesToQuery();
                for (var i in langs) {
                    var lang = langs[i];
                    var valueObj = propObj[lang];
-                   if (valueObj && valueObj.value && valueObj.value.length > 0) return valueObj.value;
+                   if (valueObj && valueObj.value && valueObj.value.length > 0) { return valueObj.value; }
                }
                // default to any available value
                return propObj[langKeys[0]].value;
 
 
            wiki.entityIDs = function(val) {
-               if (!arguments.length) return _entityIDs;
+               if (!arguments.length) { return _entityIDs; }
                _entityIDs = val;
                return wiki;
            };
        }
 
        function uiFieldWikipedia(field, context) {
-         const dispatch$1 = dispatch('change');
-         const wikipedia = services.wikipedia;
-         const wikidata = services.wikidata;
-         let _langInput = select(null);
-         let _titleInput = select(null);
-         let _wikiURL = '';
-         let _entityIDs;
-         let _tags;
-
-         let _dataWikipedia = [];
+         var arguments$1 = arguments;
+
+         var dispatch$1 = dispatch('change');
+         var wikipedia = services.wikipedia;
+         var wikidata = services.wikidata;
+         var _langInput = select(null);
+         var _titleInput = select(null);
+         var _wikiURL = '';
+         var _entityIDs;
+         var _tags;
+
+         var _dataWikipedia = [];
          _mainFileFetcher.get('wmf_sitematrix')
-           .then(d => {
+           .then(function (d) {
              _dataWikipedia = d;
-             if (_tags) updateForTags(_tags);
+             if (_tags) { updateForTags(_tags); }
            })
-           .catch(() => { /* ignore */ });
+           .catch(function () { /* ignore */ });
 
 
-         const langCombo = uiCombobox(context, 'wikipedia-lang')
-           .fetcher((value, callback) => {
-             const v = value.toLowerCase();
+         var langCombo = uiCombobox(context, 'wikipedia-lang')
+           .fetcher(function (value, callback) {
+             var v = value.toLowerCase();
              callback(_dataWikipedia
-               .filter(d => {
+               .filter(function (d) {
                  return d[0].toLowerCase().indexOf(v) >= 0 ||
                    d[1].toLowerCase().indexOf(v) >= 0 ||
                    d[2].toLowerCase().indexOf(v) >= 0;
                })
-               .map(d => ({ value: d[1] }))
+               .map(function (d) { return ({ value: d[1] }); })
              );
            });
 
-         const titleCombo = uiCombobox(context, 'wikipedia-title')
-           .fetcher((value, callback) => {
+         var titleCombo = uiCombobox(context, 'wikipedia-title')
+           .fetcher(function (value, callback) {
              if (!value) {
                value = '';
-               for (let i in _entityIDs) {
-                 let entity = context.hasEntity(_entityIDs[i]);
+               for (var i in _entityIDs) {
+                 var entity = context.hasEntity(_entityIDs[i]);
                  if (entity.tags.name) {
                    value = entity.tags.name;
                    break;
                  }
                }
              }
-             const searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
-             searchfn(language()[2], value, (query, data) => {
-               callback( data.map(d => ({ value: d })) );
+             var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
+             searchfn(language()[2], value, function (query, data) {
+               callback( data.map(function (d) { return ({ value: d }); }) );
              });
            });
 
 
          function wiki(selection) {
-           let wrap = selection.selectAll('.form-field-input-wrap')
+           var wrap = selection.selectAll('.form-field-input-wrap')
              .data([0]);
 
            wrap = wrap.enter()
              .append('div')
-             .attr('class', `form-field-input-wrap form-field-input-${field.type}`)
+             .attr('class', ("form-field-input-wrap form-field-input-" + (field.type)))
              .merge(wrap);
 
 
-           let langContainer = wrap.selectAll('.wiki-lang-container')
+           var langContainer = wrap.selectAll('.wiki-lang-container')
              .data([0]);
 
            langContainer = langContainer.enter()
              .on('change', changeLang);
 
 
-           let titleContainer = wrap.selectAll('.wiki-title-container')
+           var titleContainer = wrap.selectAll('.wiki-title-container')
              .data([0]);
 
            titleContainer = titleContainer.enter()
              .on('change', change);
 
 
-           let link = titleContainer.selectAll('.wiki-link')
+           var link = titleContainer.selectAll('.wiki-link')
              .data([0]);
 
            link = link.enter()
              .merge(link);
 
            link
-             .on('click', () => {
+             .on('click', function () {
                event.preventDefault();
-               if (_wikiURL) window.open(_wikiURL, '_blank');
+               if (_wikiURL) { window.open(_wikiURL, '_blank'); }
              });
          }
 
 
          function language() {
-           const value = utilGetSetValue(_langInput).toLowerCase();
-           const locale = _mainLocalizer.localeCode().toLowerCase();
-           let localeLanguage;
-           return _dataWikipedia.find(d => {
-             if (d[2] === locale) localeLanguage = d;
+           var value = utilGetSetValue(_langInput).toLowerCase();
+           var locale = _mainLocalizer.localeCode().toLowerCase();
+           var localeLanguage;
+           return _dataWikipedia.find(function (d) {
+             if (d[2] === locale) { localeLanguage = d; }
              return d[0].toLowerCase() === value || d[1].toLowerCase() === value || d[2] === value;
            }) || localeLanguage || ['English', 'English', 'en'];
          }
 
 
          function change(skipWikidata) {
-           let value = utilGetSetValue(_titleInput);
-           const m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/);
-           const l = m && _dataWikipedia.find(d => m[1] === d[2]);
-           let syncTags = {};
+           var value = utilGetSetValue(_titleInput);
+           var m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/);
+           var l = m && _dataWikipedia.find(function (d) { return m[1] === d[2]; });
+           var syncTags = {};
 
            if (l) {
              // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
              value = decodeURIComponent(m[2]).replace(/_/g, ' ');
              if (m[3]) {
-               let anchor;
+               var anchor;
                // try {
                // leave this out for now - #6232
                  // Best-effort `anchordecode:` implementation
            dispatch$1.call('change', this, syncTags);
 
 
-           if (skipWikidata || !value || !language()[2]) return;
+           if (skipWikidata || !value || !language()[2]) { return; }
 
            // attempt asynchronous update of wikidata tag..
-           const initGraph = context.graph();
-           const initEntityIDs = _entityIDs;
+           var initGraph = context.graph();
+           var initEntityIDs = _entityIDs;
 
-           wikidata.itemsByTitle(language()[2], value, (err, data) => {
-             if (err || !data || !Object.keys(data).length) return;
+           wikidata.itemsByTitle(language()[2], value, function (err, data) {
+             if (err || !data || !Object.keys(data).length) { return; }
 
              // If graph has changed, we can't apply this update.
-             if (context.graph() !== initGraph) return;
+             if (context.graph() !== initGraph) { return; }
 
-             const qids = Object.keys(data);
-             const value = qids && qids.find(id => id.match(/^Q\d+$/));
+             var qids = Object.keys(data);
+             var value = qids && qids.find(function (id) { return id.match(/^Q\d+$/); });
 
-             let actions = initEntityIDs.map((entityID) => {
-               let entity = context.entity(entityID).tags;
-               let currTags = Object.assign({}, entity);  // shallow copy
+             var actions = initEntityIDs.map(function (entityID) {
+               var entity = context.entity(entityID).tags;
+               var currTags = Object.assign({}, entity);  // shallow copy
                if (currTags.wikidata !== value) {
                    currTags.wikidata = value;
                    return actionChangeTags(entityID, currTags);
                }
              }).filter(Boolean);
 
-             if (!actions.length) return;
+             if (!actions.length) { return; }
 
              // Coalesce the update of wikidata tag into the previous tag change
              context.overwrite(
          }
 
 
-         wiki.tags = (tags) => {
+         wiki.tags = function (tags) {
            _tags = tags;
            updateForTags(tags);
          };
 
          function updateForTags(tags) {
 
-           const value = typeof tags[field.key] === 'string' ? tags[field.key] : '';
-           const m = value.match(/([^:]+):([^#]+)(?:#(.+))?/);
-           const l = m && _dataWikipedia.find(d => m[1] === d[2]);
-           let anchor = m && m[3];
+           var value = typeof tags[field.key] === 'string' ? tags[field.key] : '';
+           var m = value.match(/([^:]+):([^#]+)(?:#(.+))?/);
+           var l = m && _dataWikipedia.find(function (d) { return m[1] === d[2]; });
+           var anchor = m && m[3];
 
            // value in correct format
            if (l) {
              utilGetSetValue(_titleInput, value);
              if (value && value !== '') {
                utilGetSetValue(_langInput, '');
-               _wikiURL = `https://en.wikipedia.org/wiki/Special:Search?search=${value}`;
+               _wikiURL = "https://en.wikipedia.org/wiki/Special:Search?search=" + value;
              } else {
                _wikiURL = '';
              }
          }
 
 
-         wiki.entityIDs = (val) => {
-           if (!arguments.length) return _entityIDs;
+         wiki.entityIDs = function (val) {
+           if (!arguments$1.length) { return _entityIDs; }
            _entityIDs = val;
            return wiki;
          };
 
 
-         wiki.focus = () => {
+         wiki.focus = function () {
            _titleInput.node().focus();
          };
 
 
 
            function isModified() {
-               if (!entityIDs || !entityIDs.length) return false;
+               if (!entityIDs || !entityIDs.length) { return false; }
                return entityIDs.some(function(entityID) {
                    var original = context.graph().base().entities[entityID];
                    var latest = context.graph().entity(entityID);
            function revert(d) {
                event.stopPropagation();
                event.preventDefault();
-               if (!entityIDs || _locked) return;
+               if (!entityIDs || _locked) { return; }
 
                dispatch$1.call('revert', d, d.keys);
            }
            function remove(d) {
                event.stopPropagation();
                event.preventDefault();
-               if (_locked) return;
+               if (_locked) { return; }
 
                var t = {};
                d.keys.forEach(function(key) {
 
 
            field.state = function(val) {
-               if (!arguments.length) return _state;
+               if (!arguments.length) { return _state; }
                _state = val;
                return field;
            };
 
 
            field.tags = function(val) {
-               if (!arguments.length) return _tags;
+               if (!arguments.length) { return _tags; }
                _tags = val;
 
                if (tagsContainFieldKey() && !_show) {
 
 
            field.locked = function(val) {
-               if (!arguments.length) return _locked;
+               if (!arguments.length) { return _locked; }
                _locked = val;
                return field;
            };
 
                if (entityIDs &&
                    entityIDs.length > 1 &&
-                   uiFields[field.type].supportsMultiselection === false) return false;
+                   uiFields[field.type].supportsMultiselection === false) { return false; }
 
                if (field.geometry && !entityIDs.every(function(entityID) {
                    return field.matchGeometry(context.graph().geometry(entityID));
-               })) return false;
+               })) { return false; }
 
                if (field.countryCodes || field.notCountryCodes) {
                    var extent = combinedEntityExtent();
-                   if (!extent) return true;
+                   if (!extent) { return true; }
 
                    var center = extent.center();
                    var countryCode = iso1A2Code(center);
 
-                   if (!countryCode) return false;
+                   if (!countryCode) { return false; }
 
                    countryCode = countryCode.toLowerCase();
 
                        var entity = context.graph().entity(entityID);
                        if (prerequisiteTag.key) {
                            var value = entity.tags[prerequisiteTag.key];
-                           if (!value) return false;
+                           if (!value) { return false; }
 
                            if (prerequisiteTag.valueNot) {
                                return prerequisiteTag.valueNot !== value;
                                return prerequisiteTag.value === value;
                            }
                        } else if (prerequisiteTag.keyNot) {
-                           if (entity.tags[prerequisiteTag.keyNot]) return false;
+                           if (entity.tags[prerequisiteTag.keyNot]) { return false; }
                        }
                        return true;
-                   })) return false;
+                   })) { return false; }
                }
 
                return true;
                    titles.push(label);
 
                    var terms = field.terms();
-                   if (field.key) terms.push(field.key);
-                   if (field.keys) terms = terms.concat(field.keys);
+                   if (field.key) { terms.push(field.key); }
+                   if (field.keys) { terms = terms.concat(field.keys); }
 
                    return {
                        title: label,
                    .call(moreCombo
                        .data(moreFields)
                        .on('accept', function (d) {
-                           if (!d) return;  // user entered something that was not matched
+                           if (!d) { return; }  // user entered something that was not matched
                            var field = d.field;
                            field.show();
                            selection.call(formFields);  // rerender
 
 
            formFields.fieldsArr = function(val) {
-               if (!arguments.length) return _fieldsArr;
+               if (!arguments.length) { return _fieldsArr; }
                _fieldsArr = val || [];
                return formFields;
            };
 
            formFields.state = function(val) {
-               if (!arguments.length) return _state;
+               if (!arguments.length) { return _state; }
                _state = val;
                return formFields;
            };
 
            formFields.klass = function(val) {
-               if (!arguments.length) return _klass;
+               if (!arguments.length) { return _klass; }
                _klass = val;
                return formFields;
            };
            }
 
            section.presets = function(val) {
-               if (!arguments.length) return _presets;
+               if (!arguments.length) { return _presets; }
                if (!_presets || !val || !utilArrayIdentical(_presets, val)) {
                    _presets = val;
                    _fieldsArr = null;
            };
 
            section.state = function(val) {
-               if (!arguments.length) return _state;
+               if (!arguments.length) { return _state; }
                _state = val;
                return section;
            };
 
            section.tags = function(val) {
-               if (!arguments.length) return _tags;
+               if (!arguments.length) { return _tags; }
                _tags = val;
                // Don't reset _fieldsArr here.
                return section;
            };
 
            section.entityIDs = function(val) {
-               if (!arguments.length) return _entityIDs;
+               if (!arguments.length) { return _entityIDs; }
                if (!val || !_entityIDs || !utilArrayIdentical(_entityIDs, val)) {
                    _entityIDs = val;
                    _fieldsArr = null;
 
            var section = uiSection('raw-member-editor', context)
                .shouldDisplay(function() {
-                   if (!_entityIDs || _entityIDs.length !== 1) return false;
+                   if (!_entityIDs || _entityIDs.length !== 1) { return false; }
 
                    var entity = context.hasEntity(_entityIDs[0]);
                    return entity && entity.type === 'relation';
                })
                .title(function() {
                    var entity = context.hasEntity(_entityIDs[0]);
-                   if (!entity) return '';
+                   if (!entity) { return ''; }
 
                    var gt = entity.members.length > _maxMembers ? '>' : '';
                    var count = gt + entity.members.slice(0, _maxMembers).length;
 
                        if (!select(this).classed('dragging') &&
                            // don't display drag until dragging beyond a distance threshold
-                           Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) <= 5) return;
+                           Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) <= 5) { return; }
 
                        select(this)
                            .classed('dragging', true);
                                geometry: geometry,
                                query: role
                            }, function(err, data) {
-                               if (!err) callback(sort(role, data));
+                               if (!err) { callback(sort(role, data)); }
                            });
                        })
                        .on('cancel', function() {
            }
 
            section.entityIDs = function(val) {
-               if (!arguments.length) return _entityIDs;
+               if (!arguments.length) { return _entityIDs; }
                _entityIDs = val;
                return section;
            };
                })
                .title(function() {
                    var entity = context.hasEntity(_entityIDs[0]);
-                   if (!entity) return '';
+                   if (!entity) { return ''; }
 
                    var parents = context.graph().parentRelations(entity);
                    var gt = parents.length > _maxMemberships ? '>' : '';
                .minItems(1)
                .fetcher(fetchNearbyRelations)
                .itemsMouseEnter(function(d) {
-                   if (d.relation) utilHighlightEntities([d.relation.id], true, context);
+                   if (d.relation) { utilHighlightEntities([d.relation.id], true, context); }
                })
                .itemsMouseLeave(function(d) {
-                   if (d.relation) utilHighlightEntities([d.relation.id], false, context);
+                   if (d.relation) { utilHighlightEntities([d.relation.id], false, context); }
                });
            var _inChange = false;
            var _entityIDs = [];
 
 
            function changeRole(d) {
-               if (d === 0) return;    // called on newrow (shoudn't happen)
-               if (_inChange) return;  // avoid accidental recursive call #5731
+               if (d === 0) { return; }    // called on newrow (shoudn't happen)
+               if (_inChange) { return; }  // avoid accidental recursive call #5731
 
                var oldRole = d.member.role;
                var newRole = context.cleanRelationRole(select(this).property('value'));
 
            function deleteMembership(d) {
                this.blur();           // avoid keeping focus on the button
-               if (d === 0) return;   // called on newrow (shoudn't happen)
+               if (d === 0) { return; }   // called on newrow (shoudn't happen)
 
                // remove the hover-highlight styling
                utilHighlightEntities([d.relation.id], false, context);
                } else {
 
                    context.history().intersects(context.map().extent()).forEach(function(entity) {
-                       if (entity.type !== 'relation' || entity.id === entityID) return;
+                       if (entity.type !== 'relation' || entity.id === entityID) { return; }
 
                        var value = baseDisplayLabel(entity);
-                       if (q && (value + ' ' + entity.id).toLowerCase().indexOf(q.toLowerCase()) === -1) return;
+                       if (q && (value + ' ' + entity.id).toLowerCase().indexOf(q.toLowerCase()) === -1) { return; }
 
                        result.push({ relation: entity, value: value });
                    });
                        return;
                    }
                    // remove hover-higlighting
-                   if (d.relation) utilHighlightEntities([d.relation.id], false, context);
+                   if (d.relation) { utilHighlightEntities([d.relation.id], false, context); }
 
                    var role = context.cleanRelationRole(list.selectAll('.member-row-new .member-role').property('value'));
                    addMembership(d, role);
                                geometry: context.graph().geometry(entityID),
                                query: role
                            }, function(err, data) {
-                               if (!err) callback(sort(role, data));
+                               if (!err) { callback(sort(role, data)); }
                            });
                        })
                        .on('cancel', function() {
 
 
            section.entityIDs = function(val) {
-               if (!arguments.length) return _entityIDs;
+               if (!arguments.length) { return _entityIDs; }
                _entityIDs = val;
                _showBlank = false;
                return section;
                });
 
            section.entityIDs = function(val) {
-               if (!arguments.length) return _selectedIDs;
+               if (!arguments.length) { return _selectedIDs; }
                _selectedIDs = val;
                return section;
            };
                    .on('change.entity-editor', historyChanged);
 
                function historyChanged(difference) {
-                   if (selection.selectAll('.entity-editor').empty()) return;
-                   if (_state === 'hide') return;
+                   if (selection.selectAll('.entity-editor').empty()) { return; }
+                   if (_state === 'hide') { return; }
                    var significant = !difference ||
                            difference.didChange.properties ||
                            difference.didChange.addition ||
                            difference.didChange.deletion;
-                   if (!significant) return;
+                   if (!significant) { return; }
 
                    _entityIDs = _entityIDs.filter(context.hasEntity);
-                   if (!_entityIDs.length) return;
+                   if (!_entityIDs.length) { return; }
 
                    var priorActivePreset = _activePresets.length === 1 && _activePresets[0];
 
                    var tags = Object.assign({}, entity.tags);   // shallow copy
 
                    for (var k in changed) {
-                       if (!k) continue;
+                       if (!k) { continue; }
                        var v = changed[k];
                        if (v !== undefined || tags.hasOwnProperty(k)) {
                            tags[k] = v;
                    var tags = Object.assign({}, entity.tags);   // shallow copy
 
                    for (var k in changed) {
-                       if (!k) continue;
+                       if (!k) { continue; }
                        var v = changed[k];
                        if (v !== undefined || tags.hasOwnProperty(k)) {
                            tags[k] = v;
 
 
            entityEditor.modified = function(val) {
-               if (!arguments.length) return _modified;
+               if (!arguments.length) { return _modified; }
                _modified = val;
                return entityEditor;
            };
 
 
            entityEditor.state = function(val) {
-               if (!arguments.length) return _state;
+               if (!arguments.length) { return _state; }
                _state = val;
                return entityEditor;
            };
 
 
            entityEditor.entityIDs = function(val) {
-               if (!arguments.length) return _entityIDs;
-               if (val && _entityIDs && utilArrayIdentical(_entityIDs, val)) return entityEditor;  // exit early if no change
+               if (!arguments.length) { return _entityIDs; }
+               if (val && _entityIDs && utilArrayIdentical(_entityIDs, val)) { return entityEditor; }  // exit early if no change
 
                _entityIDs = val;
                _base = context.graph();
                _coalesceChanges = false;
 
-               loadActivePresets();
+               loadActivePresets(true);
 
                return entityEditor
                    .modified(false);
 
 
            entityEditor.newFeature = function(val) {
-               if (!arguments.length) return _newFeature;
+               if (!arguments.length) { return _newFeature; }
                _newFeature = val;
                return entityEditor;
            };
 
 
-           function loadActivePresets() {
+           function loadActivePresets(isForNewSelection) {
 
                var graph = context.graph();
 
 
                for (var i in _entityIDs) {
                    var entity = graph.hasEntity(_entityIDs[i]);
-                   if (!entity) return;
+                   if (!entity) { return; }
 
                    var match = _mainPresetIndex.match(entity, graph);
 
-                   if (!counts[match.id]) counts[match.id] = 0;
+                   if (!counts[match.id]) { counts[match.id] = 0; }
                    counts[match.id] += 1;
                }
 
                    return _mainPresetIndex.item(pID);
                });
 
-               // A "weak" preset doesn't set any tags. (e.g. "Address")
-               var weakPreset = _activePresets.length === 1 &&
-                   Object.keys(_activePresets[0].addTags || {}).length === 0;
-               // Don't replace a weak preset with a fallback preset (e.g. "Point")
-               if (weakPreset && matches.length === 1 && matches[0].isFallback()) return;
+               if (!isForNewSelection) {
+                   // A "weak" preset doesn't set any tags. (e.g. "Address")
+                   var weakPreset = _activePresets.length === 1 &&
+                       !_activePresets[0].isFallback() &&
+                       Object.keys(_activePresets[0].addTags || {}).length === 0;
+                   // Don't replace a weak preset with a fallback preset (e.g. "Point")
+                   if (weakPreset && matches.length === 1 && matches[0].isFallback()) { return; }
+               }
 
                entityEditor.presets(matches);
            }
 
            entityEditor.presets = function(val) {
-               if (!arguments.length) return _activePresets;
+               if (!arguments.length) { return _activePresets; }
 
                // don't reload the same preset
                if (!utilArrayIdentical(val, _activePresets)) {
 
 
            function presetList(selection) {
-               if (!_entityIDs) return;
+               if (!_entityIDs) { return; }
 
                var presets = _mainPresetIndex.matchAllGeometry(entityGeometries());
 
                        event.stopPropagation();
                        // move focus to the first item in the preset list
                        var buttons = list.selectAll('.preset-list-button');
-                       if (!buttons.empty()) buttons.nodes()[0].focus();
+                       if (!buttons.empty()) { buttons.nodes()[0].focus(); }
                    }
                }
 
            function drawList(list, presets) {
                presets = presets.matchAllGeometry(entityGeometries());
                var collection = presets.collection.reduce(function(collection, preset) {
-                   if (!preset) return collection;
+                   if (!preset) { return collection; }
 
                    if (preset.members) {
                        if (preset.members.collection.filter(function(preset) {
 
 
                item.choose = function() {
-                   if (!box || !sublist) return;
+                   if (!box || !sublist) { return; }
 
                    if (shown) {
                        shown = false;
                }
 
                item.choose = function() {
-                   if (select(this).classed('disabled')) return;
+                   if (select(this).classed('disabled')) { return; }
                    if (!context.inIntro()) {
                        _mainPresetIndex.setMostRecent(preset, entityGeometries()[0]);
                    }
 
 
            function updateForFeatureHiddenState() {
-               if (!_entityIDs.every(context.hasEntity)) return;
+               if (!_entityIDs.every(context.hasEntity)) { return; }
 
                var geometries = entityGeometries();
                var button = context.container().selectAll('.preset-list .preset-list-button');
                    var hiddenPresetFeaturesId;
                    for (var i in geometries) {
                        hiddenPresetFeaturesId = context.features().isHiddenPreset(item.preset, geometries[i]);
-                       if (hiddenPresetFeaturesId) break;
+                       if (hiddenPresetFeaturesId) { break; }
                    }
                    var isHiddenPreset = !context.inIntro() &&
                        !!hiddenPresetFeaturesId &&
            }
 
            presetList.autofocus = function(val) {
-               if (!arguments.length) return _autofocus;
+               if (!arguments.length) { return _autofocus; }
                _autofocus = val;
                return presetList;
            };
 
            presetList.entityIDs = function(val) {
-               if (!arguments.length) return _entityIDs;
+               if (!arguments.length) { return _entityIDs; }
                _entityIDs = val;
                if (_entityIDs && _entityIDs.length) {
                    var presets = _entityIDs.map(function(entityID) {
            };
 
            presetList.presets = function(val) {
-               if (!arguments.length) return _currentPresets;
+               if (!arguments.length) { return _currentPresets; }
                _currentPresets = val;
                return presetList;
            };
                        geometry = 'point';
                    }
 
-                   if (!counts[geometry]) counts[geometry] = 0;
+                   if (!counts[geometry]) { counts[geometry] = 0; }
                    counts[geometry] += 1;
                }
 
 
                function shouldDefaultToPresetList() {
                    // always show the inspector on hover
-                   if (_state !== 'select') return false;
+                   if (_state !== 'select') { return false; }
 
                    // can only change preset on single selection
-                   if (_entityIDs.length !== 1) return false;
+                   if (_entityIDs.length !== 1) { return false; }
 
                    var entityID = _entityIDs[0];
                    var entity = context.hasEntity(entityID);
-                   if (!entity) return false;
+                   if (!entity) { return false; }
 
                    // default to inspector if there are already tags
-                   if (entity.hasNonGeometryTags()) return false;
+                   if (entity.hasNonGeometryTags()) { return false; }
 
                    // prompt to select preset if feature is new and untagged
-                   if (_newFeature) return true;
+                   if (_newFeature) { return true; }
 
                    // all existing features except vertices should default to inspector
-                   if (entity.geometry(context.graph()) !== 'vertex') return false;
+                   if (entity.geometry(context.graph()) !== 'vertex') { return false; }
 
                    // show vertex relations if any
-                   if (context.graph().parentRelations(entity).length) return false;
+                   if (context.graph().parentRelations(entity).length) { return false; }
 
                    // show vertex issues if there are any
-                   if (context.validator().getEntityIssues(entityID).length) return false;
+                   if (context.validator().getEntityIssues(entityID).length) { return false; }
 
                    // show turn retriction editor for junction vertices
-                   if (entity.isHighwayIntersection(context.graph())) return false;
+                   if (entity.isHighwayIntersection(context.graph())) { return false; }
 
                    // otherwise show preset list for uninteresting vertices
                    return true;
            };
 
            inspector.state = function(val) {
-               if (!arguments.length) return _state;
+               if (!arguments.length) { return _state; }
                _state = val;
                entityEditor.state(_state);
 
 
 
            inspector.entityIDs = function(val) {
-               if (!arguments.length) return _entityIDs;
+               if (!arguments.length) { return _entityIDs; }
                _entityIDs = val;
                return inspector;
            };
 
 
            inspector.newFeature = function(val) {
-               if (!arguments.length) return _newFeature;
+               if (!arguments.length) { return _newFeature; }
                _newFeature = val;
                return inspector;
            };
                var downPointerId, lastClientX, containerLocGetter;
 
                function pointerdown() {
-                   if (downPointerId) return;
+                   if (downPointerId) { return; }
 
-                   if ('button' in event && event.button !== 0) return;
+                   if ('button' in event && event.button !== 0) { return; }
 
                    downPointerId = event.pointerId || 'mouse';
 
 
                function pointermove() {
 
-                   if (downPointerId !== (event.pointerId || 'mouse')) return;
+                   if (downPointerId !== (event.pointerId || 'mouse')) { return; }
 
                    event.preventDefault();
 
                }
 
                function pointerup() {
-                   if (downPointerId !== (event.pointerId || 'mouse')) return;
+                   if (downPointerId !== (event.pointerId || 'mouse')) { return; }
 
                    downPointerId = null;
 
                            .classed('inspector-hover', true);
 
                    } else if (datum instanceof osmNote) {
-                       if (context.mode().id === 'drag-note') return;
+                       if (context.mode().id === 'drag-note') { return; }
                        _wasNote = true;
 
                        var osm = services.osm;
                    inspectorWrap
                        .classed('inspector-hidden', true);
 
-                   if (_current) _current.remove();
+                   if (_current) { _current.remove(); }
                    _current = selection
                        .append('div')
                        .attr('class', 'sidebar-component')
                    inspectorWrap
                        .classed('inspector-hidden', true);
 
-                   if (_current) _current.remove();
+                   if (_current) { _current.remove(); }
                    _current = null;
                };
 
                    }
 
                    // Don't allow sidebar to toggle when the user is in the walkthrough.
-                   if (context.inIntro()) return;
+                   if (context.inIntro()) { return; }
 
                    var isCollapsed = selection.classed('collapsed');
                    var isCollapsing = !isCollapsed;
                event.preventDefault();
 
                var osm = context.connection();
-               if (!osm) return;
+               if (!osm) { return; }
 
-               if (context.inIntro()) return;
+               if (context.inIntro()) { return; }
 
                if (context.history().hasChanges() &&
-                   !window.confirm(_t('source_switch.lose_changes'))) return;
+                   !window.confirm(_t('source_switch.lose_changes'))) { return; }
 
                var isLive = select(this)
                    .classed('live');
 
 
            sourceSwitch.keys = function(_) {
-               if (!arguments.length) return keys;
+               if (!arguments.length) { return keys; }
                keys = _;
                return sourceSwitch;
            };
        }
 
        function uiSplash(context) {
-         return (selection) => {
+         return function (selection) {
            // Exception - if there are restorable changes, skip this splash screen.
            // This is because we currently only support one `uiModal` at a time
            //  and we need to show them `uiRestore`` instead of this one.
-           if (context.history().hasRestorableChanges()) return;
+           if (context.history().hasRestorableChanges()) { return; }
 
            // If user has not seen this version of the privacy policy, show the splash again.
-           let updateMessage = '';
-           const sawPrivacyVersion = corePreferences('sawPrivacyVersion');
-           let showSplash = !corePreferences('sawSplash');
+           var updateMessage = '';
+           var sawPrivacyVersion = corePreferences('sawPrivacyVersion');
+           var showSplash = !corePreferences('sawSplash');
            if (sawPrivacyVersion !== context.privacyVersion) {
              updateMessage = _t('splash.privacy_update');
              showSplash = true;
            }
 
-           if (!showSplash) return;
+           if (!showSplash) { return; }
 
            corePreferences('sawSplash', true);
            corePreferences('sawPrivacyVersion', context.privacyVersion);
            // fetch intro graph data now, while user is looking at the splash screen
            _mainFileFetcher.get('intro_graph');
 
-           let modalSelection = uiModal(selection);
+           var modalSelection = uiModal(selection);
 
            modalSelection.select('.modal')
              .attr('class', 'modal-splash modal');
 
-           let introModal = modalSelection.select('.content')
+           var introModal = modalSelection.select('.content')
              .append('div')
              .attr('class', 'fillL');
 
              .append('h3')
              .text(_t('splash.welcome'));
 
-           let modalSection = introModal
+           var modalSection = introModal
              .append('div')
              .attr('class','modal-section');
 
                  _t('splash.privacy_policy') + '</a>'
              }));
 
-           let buttonWrap = introModal
+           var buttonWrap = introModal
              .append('div')
              .attr('class', 'modal-actions');
 
-           let walkthrough = buttonWrap
+           var walkthrough = buttonWrap
              .append('button')
              .attr('class', 'walkthrough')
-             .on('click', () => {
+             .on('click', function () {
                context.container().call(uiIntro(context));
                modalSelection.close();
              });
              .append('div')
              .text(_t('splash.walkthrough'));
 
-           let startEditing = buttonWrap
+           var startEditing = buttonWrap
              .append('button')
              .attr('class', 'start-editing')
              .on('click', modalSelection.close);
 
 
            return function(selection) {
-               if (!osm) return;
+               if (!osm) { return; }
 
                function update(err, apiStatus) {
                    selection.html('');
                .on('startFromNode', startFromNode);
 
            var defaultTags = { area: 'yes' };
-           if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'area');
+           if (mode.preset) { defaultTags = mode.preset.setTags(defaultTags, 'area'); }
 
 
            function actionClose(wayId) {
                .on('startFromNode', startFromNode);
 
            var defaultTags = {};
-           if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'line');
+           if (mode.preset) { defaultTags = mode.preset.setTags(defaultTags, 'line'); }
 
 
            function start(loc) {
                .on('finish', cancel);
 
            var defaultTags = {};
-           if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'point');
+           if (mode.preset) { defaultTags = mode.preset.setTags(defaultTags, 'point'); }
 
 
            function add(loc) {
 
            function add(loc) {
                var osm = services.osm;
-               if (!osm) return;
+               if (!osm) { return; }
 
                var note = osmNote({ loc: loc, status: 'open', comments: [] });
                osm.replaceNote(note);
 
 
            function choose(ul, datum) {
-               if (event) event.preventDefault();
+               if (event) { event.preventDefault(); }
 
                select(ul)
                    .selectAll('li')
                var entity;
 
                entity = context.graph().hasEntity(datum.id);
-               if (entity) extent._extend(entity.extent(context.graph()));
+               if (entity) { extent._extend(entity.extent(context.graph())); }
 
                datum.action();
 
                entity = context.graph().hasEntity(datum.id);
-               if (entity) extent._extend(entity.extent(context.graph()));
+               if (entity) { extent._extend(entity.extent(context.graph())); }
 
                zoomToEntity(datum.id, extent);
            }
            //     ]
            // }
            conflicts.conflictList = function(_) {
-               if (!arguments.length) return _conflictList;
+               if (!arguments.length) { return _conflictList; }
                _conflictList = _;
                return conflicts;
            };
 
 
            conflicts.origChanges = function(_) {
-               if (!arguments.length) return _origChanges;
+               if (!arguments.length) { return _origChanges; }
                _origChanges = _;
                return conflicts;
            };
                    _fieldsArr = [
                        uiField(context, presets.field('comment'), null, { show: true, revert: false }),
                        uiField(context, presets.field('source'), null, { show: false, revert: false }),
-                       uiField(context, presets.field('hashtags'), null, { show: false, revert: false }),
-                   ];
+                       uiField(context, presets.field('hashtags'), null, { show: false, revert: false }) ];
 
                    _fieldsArr.forEach(function(field) {
                        field
                    var osm = context.connection();
                    if (osm) {
                        osm.userChangesets(function (err, changesets) {
-                           if (err) return;
+                           if (err) { return; }
 
                            var comments = changesets.map(function(changeset) {
                                var comment = changeset.tags.comment;
 
 
            changesetEditor.tags = function(_) {
-               if (!arguments.length) return _tags;
+               if (!arguments.length) { return _tags; }
                _tags = _;
                // Don't reset _fieldsArr here.
                return changesetEditor;
 
 
            changesetEditor.changesetID = function(_) {
-               if (!arguments.length) return _changesetID;
-               if (_changesetID === _) return changesetEditor;
+               if (!arguments.length) { return _changesetID; }
+               if (_changesetID === _) { return changesetEditor; }
                _changesetID = _;
                _fieldsArr = null;
                return changesetEditor;
                _selection = selection;
 
                // Initialize changeset if one does not exist yet.
-               if (!context.changeset) initChangeset();
+               if (!context.changeset) { initChangeset(); }
 
                loadDerivedChangesetTags();
 
            function loadDerivedChangesetTags() {
 
                var osm = context.connection();
-               if (!osm) return;
+               if (!osm) { return; }
 
                var tags = Object.assign({}, context.changeset.tags);   // shallow copy
 
            function render(selection) {
 
                var osm = context.connection();
-               if (!osm) return;
+               if (!osm) { return; }
 
                var header = selection.selectAll('.header')
                    .data([0]);
                // always check if this has changed, but only update prose.html()
                // if needed, because it can trigger a style recalculation
                osm.userDetails(function(err, user) {
-                   if (err) return;
+                   if (err) { return; }
 
-                   if (_userDetails === user) return;  // no change
+                   if (_userDetails === user) { return; }  // no change
                    _userDetails = user;
 
                    var userLink = select(document.createElement('div'));
 
            function isReviewRequested(tags) {
                var rr = tags.review_requested;
-               if (rr === undefined) return false;
+               if (rr === undefined) { return false; }
                rr = rr.trim().toLowerCase();
                return !(rr === '' || rr === 'no');
            }
                Object.keys(changed).forEach(function(k) {
                    var v = changed[k];
                    k = context.cleanTagKey(k);
-                   if (readOnlyTags.indexOf(k) !== -1) return;
+                   if (readOnlyTags.indexOf(k) !== -1) { return; }
 
                    if (k !== '' && v !== undefined) {
                        if (onInput) {
        }
 
        function validateCenter(center) {
-         const validCenterLengths = [2, 3];
+         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");
          }
-         const [lng, lat] = center;
+         var lng = center[0];
+         var lat = center[1];
          if (typeof lng !== "number" || typeof lat !== "number") {
            throw new Error(
-             `ERROR! Longitude and Latitude has to be numbers but where ${typeof lng} and ${typeof lat}`
+             ("ERROR! Longitude and Latitude has to be numbers but where " + (typeof lng) + " and " + (typeof lat))
            );
          }
          if (lng > 180 || lng < -180) {
            throw new Error(
-             `ERROR! Longitude has to be between -180 and 180 but was ${lng}`
+             ("ERROR! Longitude has to be between -180 and 180 but was " + lng)
            );
          }
 
          if (lat > 90 || lat < -90) {
            throw new Error(
-             `ERROR! Latitude has to be between -90 and 90 but was ${lat}`
+             ("ERROR! Latitude has to be between -90 and 90 but was " + lat)
            );
          }
        }
        function validateRadius(radius) {
          if (typeof radius !== "number") {
            throw new Error(
-             `ERROR! Radius has to be a positive number but was: ${typeof radius}`
+             ("ERROR! Radius has to be a positive number but was: " + (typeof radius))
            );
          }
 
          if (radius <= 0) {
            throw new Error(
-             `ERROR! Radius has to be a positive number but was: ${radius}`
+             ("ERROR! Radius has to be a positive number but was: " + radius)
            );
          }
        }
        function validateNumberOfSegments(numberOfSegments) {
          if (typeof numberOfSegments !== "number" && numberOfSegments !== undefined) {
            throw new Error(
-             `ERROR! Number of segments has to be a number but was: ${typeof numberOfSegments}`
+             ("ERROR! Number of segments has to be a number but was: " + (typeof numberOfSegments))
            );
          }
 
          if (numberOfSegments < 3) {
            throw new Error(
-             `ERROR! Number of segments has to be at least 3 but was: ${numberOfSegments}`
+             ("ERROR! Number of segments has to be at least 3 but was: " + numberOfSegments)
            );
          }
        }
 
-       function validateInput({ center, radius, numberOfSegments }) {
+       function validateInput(ref) {
+         var center = ref.center;
+         var radius = ref.radius;
+         var numberOfSegments = ref.numberOfSegments;
+
          validateCenter(center);
          validateRadius(radius);
          validateNumberOfSegments(numberOfSegments);
          var n = numberOfSegments ? numberOfSegments : 32;
 
          // validateInput() throws error on invalid input and do nothing on valid input
-         validateInput({ center, radius, numberOfSegments });
+         validateInput({ center: center, radius: radius, numberOfSegments: numberOfSegments });
 
          var coordinates = [];
          for (var i = 0; i < n; ++i) {
                        this.stack = (new Error()).stack;
                }
 
-               if ( Error ) IllegalArgumentException.__proto__ = Error;
+               if ( Error ) { IllegalArgumentException.__proto__ = Error; }
                IllegalArgumentException.prototype = Object.create( Error && Error.prototype );
                IllegalArgumentException.prototype.constructor = IllegalArgumentException;
 
            Exception$$1.call(this, 'Projective point not representable on the Cartesian plane.');
          }
 
-         if ( Exception$$1 ) NotRepresentableException.__proto__ = Exception$$1;
+         if ( Exception$$1 ) { NotRepresentableException.__proto__ = Exception$$1; }
          NotRepresentableException.prototype = Object.create( Exception$$1 && Exception$$1.prototype );
          NotRepresentableException.prototype.constructor = NotRepresentableException;
          NotRepresentableException.prototype.interfaces_ = function interfaces_ () {
            this.stack = (new Error()).stack;
          }
 
-         if ( Error ) RuntimeException.__proto__ = Error;
+         if ( Error ) { RuntimeException.__proto__ = Error; }
          RuntimeException.prototype = Object.create( Error && Error.prototype );
          RuntimeException.prototype.constructor = RuntimeException;
 
            }
          }
 
-         if ( RuntimeException$$1 ) AssertionFailedException.__proto__ = RuntimeException$$1;
+         if ( RuntimeException$$1 ) { AssertionFailedException.__proto__ = RuntimeException$$1; }
          AssertionFailedException.prototype = Object.create( RuntimeException$$1 && RuntimeException$$1.prototype );
          AssertionFailedException.prototype.constructor = AssertionFailedException;
          AssertionFailedException.prototype.interfaces_ = function interfaces_ () {
            LineIntersector$$1.apply(this, arguments);
          }
 
-         if ( LineIntersector$$1 ) RobustLineIntersector.__proto__ = LineIntersector$$1;
+         if ( LineIntersector$$1 ) { RobustLineIntersector.__proto__ = LineIntersector$$1; }
          RobustLineIntersector.prototype = Object.create( LineIntersector$$1 && LineIntersector$$1.prototype );
          RobustLineIntersector.prototype.constructor = RobustLineIntersector;
 
            Collection$$1.apply(this, arguments);
          }
 
-         if ( Collection$$1 ) List.__proto__ = Collection$$1;
+         if ( Collection$$1 ) { List.__proto__ = Collection$$1; }
          List.prototype = Object.create( Collection$$1 && Collection$$1.prototype );
          List.prototype.constructor = List;
 
            }
          }
 
-         if ( List$$1 ) ArrayList.__proto__ = List$$1;
+         if ( List$$1 ) { ArrayList.__proto__ = List$$1; }
          ArrayList.prototype = Object.create( List$$1 && List$$1.prototype );
          ArrayList.prototype.constructor = ArrayList;
 
            this.position_ = 0;
          }
 
-         if ( Iterator$$1 ) Iterator_.__proto__ = Iterator$$1;
+         if ( Iterator$$1 ) { Iterator_.__proto__ = Iterator$$1; }
          Iterator_.prototype = Object.create( Iterator$$1 && Iterator$$1.prototype );
          Iterator_.prototype.constructor = Iterator_;
 
            }
          }
 
-         if ( ArrayList$$1 ) CoordinateList.__proto__ = ArrayList$$1;
+         if ( ArrayList$$1 ) { CoordinateList.__proto__ = ArrayList$$1; }
          CoordinateList.prototype = Object.create( ArrayList$$1 && ArrayList$$1.prototype );
          CoordinateList.prototype.constructor = CoordinateList;
 
        var SortedMap = (function (Map) {
                function SortedMap () {
                        Map.apply(this, arguments);
-               }if ( Map ) SortedMap.__proto__ = Map;
+               }if ( Map ) { SortedMap.__proto__ = Map; }
                SortedMap.prototype = Object.create( Map && Map.prototype );
                SortedMap.prototype.constructor = SortedMap;
 
            }
          }
 
-         if ( Set$$1 ) HashSet.__proto__ = Set$$1;
+         if ( Set$$1 ) { HashSet.__proto__ = Set$$1; }
          HashSet.prototype = Object.create( Set$$1 && Set$$1.prototype );
          HashSet.prototype.constructor = HashSet;
 
            this.position_ = 0;
          }
 
-         if ( Iterator$$1 ) Iterator_.__proto__ = Iterator$$1;
+         if ( Iterator$$1 ) { Iterator_.__proto__ = Iterator$$1; }
          Iterator_.prototype = Object.create( Iterator$$1 && Iterator$$1.prototype );
          Iterator_.prototype.constructor = Iterator_;
 
            }
          }
 
-         if ( Geometry$$1 ) GeometryCollection.__proto__ = Geometry$$1;
+         if ( Geometry$$1 ) { GeometryCollection.__proto__ = Geometry$$1; }
          GeometryCollection.prototype = Object.create( Geometry$$1 && Geometry$$1.prototype );
          GeometryCollection.prototype.constructor = GeometryCollection;
 
            GeometryCollection$$1.apply(this, arguments);
          }
 
-         if ( GeometryCollection$$1 ) MultiLineString.__proto__ = GeometryCollection$$1;
+         if ( GeometryCollection$$1 ) { MultiLineString.__proto__ = GeometryCollection$$1; }
          MultiLineString.prototype = Object.create( GeometryCollection$$1 && GeometryCollection$$1.prototype );
          MultiLineString.prototype.constructor = MultiLineString;
 
            this.init(points);
          }
 
-         if ( Geometry$$1 ) LineString.__proto__ = Geometry$$1;
+         if ( Geometry$$1 ) { LineString.__proto__ = Geometry$$1; }
          LineString.prototype = Object.create( Geometry$$1 && Geometry$$1.prototype );
          LineString.prototype.constructor = LineString;
 
            this.init(this._coordinates);
          }
 
-         if ( Geometry$$1 ) Point.__proto__ = Geometry$$1;
+         if ( Geometry$$1 ) { Point.__proto__ = Geometry$$1; }
          Point.prototype = Object.create( Geometry$$1 && Geometry$$1.prototype );
          Point.prototype.constructor = Point;
 
            this._holes = holes;
          }
 
-         if ( Geometry$$1 ) Polygon.__proto__ = Geometry$$1;
+         if ( Geometry$$1 ) { Polygon.__proto__ = Geometry$$1; }
          Polygon.prototype = Object.create( Geometry$$1 && Geometry$$1.prototype );
          Polygon.prototype.constructor = Polygon;
 
            GeometryCollection$$1.apply(this, arguments);
          }
 
-         if ( GeometryCollection$$1 ) MultiPoint.__proto__ = GeometryCollection$$1;
+         if ( GeometryCollection$$1 ) { MultiPoint.__proto__ = GeometryCollection$$1; }
          MultiPoint.prototype = Object.create( GeometryCollection$$1 && GeometryCollection$$1.prototype );
          MultiPoint.prototype.constructor = MultiPoint;
 
            this.validateConstruction();
          }
 
-         if ( LineString$$1 ) LinearRing.__proto__ = LineString$$1;
+         if ( LineString$$1 ) { LinearRing.__proto__ = LineString$$1; }
          LinearRing.prototype = Object.create( LineString$$1 && LineString$$1.prototype );
          LinearRing.prototype.constructor = LinearRing;
 
            GeometryCollection$$1.apply(this, arguments);
          }
 
-         if ( GeometryCollection$$1 ) MultiPolygon.__proto__ = GeometryCollection$$1;
+         if ( GeometryCollection$$1 ) { MultiPolygon.__proto__ = GeometryCollection$$1; }
          MultiPolygon.prototype = Object.create( GeometryCollection$$1 && GeometryCollection$$1.prototype );
          MultiPolygon.prototype.constructor = MultiPolygon;
 
            this.map_ = new Map();
          }
 
-         if ( MapInterface ) HashMap.__proto__ = MapInterface;
+         if ( MapInterface ) { HashMap.__proto__ = MapInterface; }
          HashMap.prototype = Object.create( MapInterface && MapInterface.prototype );
          HashMap.prototype.constructor = HashMap;
          /**
            this.name = 'TopologyException';
          }
 
-         if ( RuntimeException$$1 ) TopologyException.__proto__ = RuntimeException$$1;
+         if ( RuntimeException$$1 ) { TopologyException.__proto__ = RuntimeException$$1; }
          TopologyException.prototype = Object.create( RuntimeException$$1 && RuntimeException$$1.prototype );
          TopologyException.prototype.constructor = TopologyException;
          TopologyException.prototype.getCoordinate = function getCoordinate () {
            EdgeRing$$1.call(this, start, geometryFactory);
          }
 
-         if ( EdgeRing$$1 ) MinimalEdgeRing.__proto__ = EdgeRing$$1;
+         if ( EdgeRing$$1 ) { MinimalEdgeRing.__proto__ = EdgeRing$$1; }
          MinimalEdgeRing.prototype = Object.create( EdgeRing$$1 && EdgeRing$$1.prototype );
          MinimalEdgeRing.prototype.constructor = MinimalEdgeRing;
          MinimalEdgeRing.prototype.setEdgeRing = function setEdgeRing (de, er) {
            EdgeRing$$1.call(this, start, geometryFactory);
          }
 
-         if ( EdgeRing$$1 ) MaximalEdgeRing.__proto__ = EdgeRing$$1;
+         if ( EdgeRing$$1 ) { MaximalEdgeRing.__proto__ = EdgeRing$$1; }
          MaximalEdgeRing.prototype = Object.create( EdgeRing$$1 && EdgeRing$$1.prototype );
          MaximalEdgeRing.prototype.constructor = MaximalEdgeRing;
          MaximalEdgeRing.prototype.buildMinimalRings = function buildMinimalRings () {
            this._label = new Label(0, Location.NONE);
          }
 
-         if ( GraphComponent$$1 ) Node.__proto__ = GraphComponent$$1;
+         if ( GraphComponent$$1 ) { Node.__proto__ = GraphComponent$$1; }
          Node.prototype = Object.create( GraphComponent$$1 && GraphComponent$$1.prototype );
          Node.prototype.constructor = Node;
          Node.prototype.isIncidentEdgeInResult = function isIncidentEdgeInResult () {
            this.computeDirectedLabel();
          }
 
-         if ( EdgeEnd$$1 ) DirectedEdge.__proto__ = EdgeEnd$$1;
+         if ( EdgeEnd$$1 ) { DirectedEdge.__proto__ = EdgeEnd$$1; }
          DirectedEdge.prototype = Object.create( EdgeEnd$$1 && EdgeEnd$$1.prototype );
          DirectedEdge.prototype.constructor = DirectedEdge;
          DirectedEdge.prototype.getNextMin = function getNextMin () {
            AbstractSTRtree$$1.call(this, nodeCapacity);
          }
 
-         if ( AbstractSTRtree$$1 ) STRtree.__proto__ = AbstractSTRtree$$1;
+         if ( AbstractSTRtree$$1 ) { STRtree.__proto__ = AbstractSTRtree$$1; }
          STRtree.prototype = Object.create( AbstractSTRtree$$1 && AbstractSTRtree$$1.prototype );
          STRtree.prototype.constructor = STRtree;
 
            AbstractNode$$1.call(this, level);
          }
 
-         if ( AbstractNode$$1 ) STRtreeNode.__proto__ = AbstractNode$$1;
+         if ( AbstractNode$$1 ) { STRtreeNode.__proto__ = AbstractNode$$1; }
          STRtreeNode.prototype = Object.create( AbstractNode$$1 && AbstractNode$$1.prototype );
          STRtreeNode.prototype.constructor = STRtreeNode;
          STRtreeNode.prototype.computeBounds = function computeBounds () {
            this._nOverlaps = 0;
          }
 
-         if ( SinglePassNoder$$1 ) MCIndexNoder.__proto__ = SinglePassNoder$$1;
+         if ( SinglePassNoder$$1 ) { MCIndexNoder.__proto__ = SinglePassNoder$$1; }
          MCIndexNoder.prototype = Object.create( SinglePassNoder$$1 && SinglePassNoder$$1.prototype );
          MCIndexNoder.prototype.constructor = MCIndexNoder;
 
            this._si = si;
          }
 
-         if ( MonotoneChainOverlapAction$$1 ) SegmentOverlapAction.__proto__ = MonotoneChainOverlapAction$$1;
+         if ( MonotoneChainOverlapAction$$1 ) { SegmentOverlapAction.__proto__ = MonotoneChainOverlapAction$$1; }
          SegmentOverlapAction.prototype = Object.create( MonotoneChainOverlapAction$$1 && MonotoneChainOverlapAction$$1.prototype );
          SegmentOverlapAction.prototype.constructor = SegmentOverlapAction;
          SegmentOverlapAction.prototype.overlap = function overlap () {
            this._LINKING_TO_OUTGOING = 2;
          }
 
-         if ( EdgeEndStar$$1 ) DirectedEdgeStar.__proto__ = EdgeEndStar$$1;
+         if ( EdgeEndStar$$1 ) { DirectedEdgeStar.__proto__ = EdgeEndStar$$1; }
          DirectedEdgeStar.prototype = Object.create( EdgeEndStar$$1 && EdgeEndStar$$1.prototype );
          DirectedEdgeStar.prototype.constructor = DirectedEdgeStar;
          DirectedEdgeStar.prototype.linkResultDirectedEdges = function linkResultDirectedEdges () {
            NodeFactory$$1.apply(this, arguments);
          }
 
-         if ( NodeFactory$$1 ) OverlayNodeFactory.__proto__ = NodeFactory$$1;
+         if ( NodeFactory$$1 ) { OverlayNodeFactory.__proto__ = NodeFactory$$1; }
          OverlayNodeFactory.prototype = Object.create( NodeFactory$$1 && NodeFactory$$1.prototype );
          OverlayNodeFactory.prototype.constructor = OverlayNodeFactory;
 
            }
          }
 
-         if ( GraphComponent$$1 ) Edge.__proto__ = GraphComponent$$1;
+         if ( GraphComponent$$1 ) { Edge.__proto__ = GraphComponent$$1; }
          Edge.prototype = Object.create( GraphComponent$$1 && GraphComponent$$1.prototype );
          Edge.prototype.constructor = Edge;
          Edge.prototype.getDepth = function getDepth () {
            this._hotPixelVertexIndex = hotPixelVertexIndex;
          }
 
-         if ( MonotoneChainSelectAction$$1 ) HotPixelSnapAction.__proto__ = MonotoneChainSelectAction$$1;
+         if ( MonotoneChainSelectAction$$1 ) { HotPixelSnapAction.__proto__ = MonotoneChainSelectAction$$1; }
          HotPixelSnapAction.prototype = Object.create( MonotoneChainSelectAction$$1 && MonotoneChainSelectAction$$1.prototype );
          HotPixelSnapAction.prototype.constructor = HotPixelSnapAction;
          HotPixelSnapAction.prototype.isNodeAdded = function isNodeAdded () {
            this._isSelfSnap = (isSelfSnap !== undefined) ? isSelfSnap : false;
          }
 
-         if ( GeometryTransformer$$1 ) SnapTransformer.__proto__ = GeometryTransformer$$1;
+         if ( GeometryTransformer$$1 ) { SnapTransformer.__proto__ = GeometryTransformer$$1; }
          SnapTransformer.prototype = Object.create( GeometryTransformer$$1 && GeometryTransformer$$1.prototype );
          SnapTransformer.prototype.constructor = SnapTransformer;
          SnapTransformer.prototype.snapLine = function snapLine (srcPts, snapPts) {
          if (!isSuccess) {
            try {
              result = SnapOverlayOp.overlayOp(this._geom[0], this._geom[1], opCode);
-           } catch (ex) {
-             if (ex instanceof RuntimeException) {
+           } catch (ex$1) {
+             if (ex$1 instanceof RuntimeException) {
                throw savedException
-             } else { throw ex }
+             } else { throw ex$1 }
            } finally {}
          }
          return result
            this.nOverlaps = null;
          }
 
-         if ( EdgeSetIntersector$$1 ) SimpleMCSweepLineIntersector.__proto__ = EdgeSetIntersector$$1;
+         if ( EdgeSetIntersector$$1 ) { SimpleMCSweepLineIntersector.__proto__ = EdgeSetIntersector$$1; }
          SimpleMCSweepLineIntersector.prototype = Object.create( EdgeSetIntersector$$1 && EdgeSetIntersector$$1.prototype );
          SimpleMCSweepLineIntersector.prototype.constructor = SimpleMCSweepLineIntersector;
          SimpleMCSweepLineIntersector.prototype.prepareEvents = function prepareEvents () {
            this._item = item;
          }
 
-         if ( IntervalRTreeNode$$1 ) IntervalRTreeLeafNode.__proto__ = IntervalRTreeNode$$1;
+         if ( IntervalRTreeNode$$1 ) { IntervalRTreeLeafNode.__proto__ = IntervalRTreeNode$$1; }
          IntervalRTreeLeafNode.prototype = Object.create( IntervalRTreeNode$$1 && IntervalRTreeNode$$1.prototype );
          IntervalRTreeLeafNode.prototype.constructor = IntervalRTreeLeafNode;
          IntervalRTreeLeafNode.prototype.query = function query (queryMin, queryMax, visitor) {
            this.buildExtent(this._node1, this._node2);
          }
 
-         if ( IntervalRTreeNode$$1 ) IntervalRTreeBranchNode.__proto__ = IntervalRTreeNode$$1;
+         if ( IntervalRTreeNode$$1 ) { IntervalRTreeBranchNode.__proto__ = IntervalRTreeNode$$1; }
          IntervalRTreeBranchNode.prototype = Object.create( IntervalRTreeNode$$1 && IntervalRTreeNode$$1.prototype );
          IntervalRTreeBranchNode.prototype.constructor = IntervalRTreeBranchNode;
          IntervalRTreeBranchNode.prototype.buildExtent = function buildExtent (n1, n2) {
            }
          }
 
-         if ( PlanarGraph$$1 ) GeometryGraph.__proto__ = PlanarGraph$$1;
+         if ( PlanarGraph$$1 ) { GeometryGraph.__proto__ = PlanarGraph$$1; }
          GeometryGraph.prototype = Object.create( PlanarGraph$$1 && PlanarGraph$$1.prototype );
          GeometryGraph.prototype.constructor = GeometryGraph;
          GeometryGraph.prototype.insertBoundaryPoint = function insertBoundaryPoint (argIndex, coord) {
            this._geomFact = g0.getFactory();
          }
 
-         if ( GeometryGraphOp ) OverlayOp.__proto__ = GeometryGraphOp;
+         if ( GeometryGraphOp ) { OverlayOp.__proto__ = GeometryGraphOp; }
          OverlayOp.prototype = Object.create( GeometryGraphOp && GeometryGraphOp.prototype );
          OverlayOp.prototype.constructor = OverlayOp;
          OverlayOp.prototype.insertUniqueEdge = function insertUniqueEdge (e) {
        function feature$1(geometry, properties, options) {
            // Optional Parameters
            options = options || {};
-           if (!isObject$4(options)) throw new Error('options is invalid');
+           if (!isObject$4(options)) { throw new Error('options is invalid'); }
            var bbox = options.bbox;
            var id = options.id;
 
            // Validation
-           if (geometry === undefined) throw new Error('geometry is required');
-           if (properties && properties.constructor !== Object) throw new Error('properties must be an Object');
-           if (bbox) validateBBox(bbox);
-           if (id) validateId(id);
+           if (geometry === undefined) { throw new Error('geometry is required'); }
+           if (properties && properties.constructor !== Object) { throw new Error('properties must be an Object'); }
+           if (bbox) { validateBBox(bbox); }
+           if (id) { validateId(id); }
 
            // Main
            var feat = {type: 'Feature'};
-           if (id) feat.id = id;
-           if (bbox) feat.bbox = bbox;
+           if (id) { feat.id = id; }
+           if (bbox) { feat.bbox = bbox; }
            feat.properties = properties || {};
            feat.geometry = geometry;
            return feat;
         * //=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');
+           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$1(num)) throw new Error('bbox must only contain numbers');
+               if (!isNumber$1(num)) { throw new Error('bbox must only contain numbers'); }
            });
        }
 
         * //=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');
+           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'); }
        }
 
        /**
 
                    // Handle null Geometry
                    if (geometry === null) {
-                       if (callback(null, featureIndex, featureProperties, featureBBox, featureId) === false) return false;
+                       if (callback(null, featureIndex, featureProperties, featureBBox, featureId) === false) { return false; }
                        continue;
                    }
                    switch (geometry.type) {
                    case 'Polygon':
                    case 'MultiLineString':
                    case 'MultiPolygon': {
-                       if (callback(geometry, featureIndex, featureProperties, featureBBox, featureId) === false) return false;
+                       if (callback(geometry, featureIndex, featureProperties, featureBBox, featureId) === false) { return false; }
                        break;
                    }
                    case 'GeometryCollection': {
                        for (j = 0; j < geometry.geometries.length; j++) {
-                           if (callback(geometry.geometries[j], featureIndex, featureProperties, featureBBox, featureId) === false) return false;
+                           if (callback(geometry.geometries[j], featureIndex, featureProperties, featureBBox, featureId) === false) { return false; }
                        }
                        break;
                    }
        function geomReduce(geojson, callback, initialValue) {
            var previousValue = initialValue;
            geomEach(geojson, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
-               if (featureIndex === 0 && initialValue === undefined) previousValue = currentGeometry;
-               else previousValue = callback(previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId);
+               if (featureIndex === 0 && initialValue === undefined) { previousValue = currentGeometry; }
+               else { previousValue = callback(previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId); }
            });
            return previousValue;
        }
                case 'Point':
                case 'LineString':
                case 'Polygon':
-                   if (callback(feature$1(geometry, properties, {bbox: bbox, id: id}), featureIndex, 0) === false) return false;
+                   if (callback(feature$1(geometry, properties, {bbox: bbox, id: id}), featureIndex, 0) === false) { return false; }
                    return;
                }
 
                        type: geomType,
                        coordinates: coordinate
                    };
-                   if (callback(feature$1(geom, properties), featureIndex, multiFeatureIndex) === false) return false;
+                   if (callback(feature$1(geom, properties), featureIndex, multiFeatureIndex) === false) { return false; }
                }
            });
        }
         * //={"type": "Point", "coordinates": [110, 40]}
         */
        function getGeom(geojson) {
-           if (!geojson) throw new Error('geojson is required');
-           if (geojson.geometry !== undefined) return geojson.geometry;
-           if (geojson.coordinates || geojson.geometries) return geojson;
+           if (!geojson) { throw new Error('geojson is required'); }
+           if (geojson.geometry !== undefined) { return geojson.geometry; }
+           if (geojson.coordinates || geojson.geometries) { return geojson; }
            throw new Error('geojson must be a valid Feature or Geometry Object');
        }
 
            // Issue #721 - JSTS can't handle empty polygons
            geom1 = removeEmptyPolygon(geom1);
            geom2 = removeEmptyPolygon(geom2);
-           if (!geom1) return null;
-           if (!geom2) return feature$1(geom1, properties);
+           if (!geom1) { return null; }
+           if (!geom2) { return feature$1(geom1, properties); }
 
            // JSTS difference operation
            var reader = new GeoJSONReader();
            var a = reader.read(geom1);
            var b = reader.read(geom2);
            var differenced = OverlayOp.difference(a, b);
-           if (differenced.isEmpty()) return null;
+           if (differenced.isEmpty()) { return null; }
            var writer = new GeoJSONWriter();
            var geom = writer.write(differenced);
 
        function removeEmptyPolygon(geom) {
            switch (geom.type) {
            case 'Polygon':
-               if (area(geom) > 1) return geom;
+               if (area(geom) > 1) { return geom; }
                return null;
            case 'MultiPolygon':
                var coordinates = [];
                flattenEach(geom, function (feature$$1) {
-                   if (area(feature$$1) > 1) coordinates.push(feature$$1.geometry.coordinates);
+                   if (area(feature$$1) > 1) { coordinates.push(feature$$1.geometry.coordinates); }
                });
-               if (coordinates.length) return {type: 'MultiPolygon', coordinates: coordinates};
+               if (coordinates.length) { return {type: 'MultiPolygon', coordinates: coordinates}; }
            }
        }
 
         * var addToMap = [poly1, poly2, union];
         */
        function union$1() {
+           var arguments$1 = arguments;
+
            var reader = new GeoJSONReader();
            var result = reader.read(JSON.stringify(arguments[0].geometry));
 
            for (var i = 1; i < arguments.length; i++) {
-               result = UnionOp.union(result, reader.read(JSON.stringify(arguments[i].geometry)));
+               result = UnionOp.union(result, reader.read(JSON.stringify(arguments$1[i].geometry)));
            }
 
            var writer = new GeoJSONWriter();
        // Reduce an array of locations into a single GeoJSON feature
        function _locationReducer(accumulator, location) {
          /* eslint-disable no-console, no-invalid-this */
-         let result;
+         var result;
          try {
-           let resolved = this.resolveLocation(location);
+           var resolved = this.resolveLocation(location);
            if (!resolved || !resolved.feature) {
-             console.warn(`Warning:  Couldn't resolve location "${location}"`);
+             console.warn(("Warning:  Couldn't resolve location \"" + location + "\""));
              return accumulator;
            }
            result = !accumulator ? resolved.feature : union$1(accumulator, resolved.feature);
          } catch (e) {
-           console.warn(`Warning:  Error resolving location "${location}"`);
+           console.warn(("Warning:  Error resolving location \"" + location + "\""));
            console.warn(e);
            result = accumulator;
          }
        }
 
 
-       class LocationConflation {
+       var defaultExport = function defaultExport(fc) {
+         var this$1 = this;
 
-         // constructor
-         //
-         // 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": { … }
-         //     }
-         //   ]
-         // }
-         constructor(fc) {
-           this._cache = {};
+         this._cache = {};
 
-           // process input FeatureCollection
-           if (fc && fc.type === 'FeatureCollection' && Array.isArray(fc.features)) {
-             fc.features.forEach(feature => {
-               feature.properties = feature.properties || {};
-               let props = feature.properties;
+         // 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`
-               let id = feature.id || props.id;
-               if (!id || !/^\S+\.geojson$/i.test(id)) return;
+             // get `id` from either `id` or `properties`
+             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 id exists and is lowercase
+             id = id.toLowerCase();
+             feature.id = id;
+             props.id = id;
 
-               // ensure area property exists
-               if (!props.area) {
-                 const area = geojsonArea.geometry(feature.geometry) / 1e6;  // m² to km²
-                 props.area = Number(area.toFixed(2));
-               }
-
-               this._cache[id] = feature;
-             });
-           }
+             // ensure area property exists
+             if (!props.area) {
+               var area = geojsonArea.geometry(feature.geometry) / 1e6;// m² to km²
+               props.area = Number(area.toFixed(2));
+             }
 
-           // Replace CountryCoder world geometry to have a polygon covering the world.
-           let world = _cloneDeep(feature('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²
-           this._cache.Q2 = world;
+             this$1._cache[id] = feature;
+           });
          }
 
+         // Replace CountryCoder world geometry to have a polygon covering the world.
+         var world = _cloneDeep(feature('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²
+         this._cache.Q2 = world;
+       };
 
-         // validateLocation
-         //
-         // Pass a `location` identifier
-         // Returns a result like
-         //   {
-         //     type:     'point', 'geojson', or 'countrycoder'
-         //     location:  the queried location
-         //     id:        a unique identifier
-         //   }
-         //  or `null` if the location is invalid
-         //
-         validateLocation(location) {
-           if (Array.isArray(location)) {   // a [lon,lat] coordinate pair?
-             if (location.length === 2 && Number.isFinite(location[0]) && Number.isFinite(location[1]) &&
-               location[0] >= -180 && location[0] <= 180 && location[1] >= -90 && location[1] <= 90
-             ) {
-               const id = '[' + location.toString() + ']';
-               return { type: 'point', location: location, id: id };
-             }
 
-           } else if (typeof location === 'string' && /^\S+\.geojson$/i.test(location)) {   // a .geojson filename?
-             const id = location.toLowerCase();
-             if (this._cache[id]) {
-               return { type: 'geojson', location: location, id: id };
-             }
+       // validateLocation
+       //
+       // Pass a `location` identifier
+       // Returns a result like
+       // {
+       //   type:   'point', 'geojson', or 'countrycoder'
+       //   location:the queried location
+       //   id:      a unique identifier
+       // }
+       //or `null` if the location is invalid
+       //
+       defaultExport.prototype.validateLocation = function validateLocation (location) {
+         if (Array.isArray(location)) { // a [lon,lat] coordinate pair?
+           if (location.length === 2 && Number.isFinite(location[0]) && Number.isFinite(location[1]) &&
+             location[0] >= -180 && location[0] <= 180 && location[1] >= -90 && location[1] <= 90
+           ) {
+             var id = '[' + location.toString() + ']';
+             return { type: 'point', location: location, id: id };
+           }
 
-           } else if (typeof location === 'string' || typeof location === 'number') {   // a country-coder value?
-             const feature$1 = feature(location);
-             if (feature$1) {
-               // Use wikidata QID as the identifier, since that seems to be the only
-               // property that everything in CountryCoder is guaranteed to have.
-               const id = feature$1.properties.wikidata;
-               return { type: 'countrycoder', location: location, id: id };
-             }
+         } else if (typeof location === 'string' && /^\S+\.geojson$/i.test(location)) { // a .geojson filename?
+           var id$1 = location.toLowerCase();
+           if (this._cache[id$1]) {
+             return { type: 'geojson', location: location, id: id$1 };
            }
 
-           return null;
+         } else if (typeof location === 'string' || typeof location === 'number') { // a country-coder value?
+           var feature$1 = feature(location);
+           if (feature$1) {
+             // Use wikidata QID as the identifier, since that seems to be the only
+             // property that everything in CountryCoder is guaranteed to have.
+             var id$2 = feature$1.properties.wikidata;
+             return { type: 'countrycoder', location: location, id: id$2 };
+           }
          }
 
+         return null;
+       };
 
-         // resolveLocation
-         //
-         // Pass a `location` identifier
-         // Returns a result like
-         //   {
-         //     type:      'point', 'geojson', or 'countrycoder'
-         //     location:  the queried location
-         //     id:        a unique identifier
-         //     feature:   the geojson feature
-         //   }
-         //  or `null` if the location is invalid
-         //
-         resolveLocation(location) {
-           const valid = this.validateLocation(location);
-           if (!valid) return null;
-
-           // return a result from cache if we can
-           if (this._cache[valid.id]) {
-             return Object.assign(valid, { feature: this._cache[valid.id] });
-           }
-
-           // a [lon,lat] coordinate pair?
-           if (valid.type === 'point') {
-             const RADIUS = 25000;  // meters
-             const EDGES = 10;
-             const PRECISION = 3;
-             const area = Math.PI * RADIUS * RADIUS / 1e6;     // m² to km²
-             const feature = this._cache[valid.id] = geojsonPrecision({
-               type: 'Feature',
-               id: valid.id,
-               properties: { id: valid.id, area: Number(area.toFixed(2)) },
-               geometry: circleToPolygon(location, RADIUS, EDGES)
-             }, PRECISION);
-             return Object.assign(valid, { feature: feature });
-
-           // a .geojson filename?
-           } else if (valid.type === 'geojson') ; else if (valid.type === 'countrycoder') {
-             let feature$1 = _cloneDeep(feature(valid.id));
-             let props = feature$1.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.
-             // BUT, when we try to actually work with these aggregated MultiPolygons,
-             //   Turf/JSTS gets crashy because of topography bugs.
-             // SO, we'll aggregate the features ourselves by unioning them together.
-             // This approach also has the benefit of removing all the internal boaders and
-             //   simplifying the regional polygons a lot.
-             if (Array.isArray(props.members)) {
-               let seed = feature$1.geometry ? feature$1 : null;
-               let aggregate = props.members.reduce(_locationReducer.bind(this), seed);
-               feature$1.geometry = aggregate.geometry;
-             }
-
-             // ensure area property exists
-             if (!props.area) {
-               const area = geojsonArea.geometry(feature$1.geometry) / 1e6;  // m² to km²
-               props.area = Number(area.toFixed(2));
-             }
-
-             // ensure id property exists
-             feature$1.id = valid.id;
-             props.id = valid.id;
 
-             this._cache[valid.id] = feature$1;
-             return Object.assign(valid, { feature: feature$1 });
-           }
-
-           return null;
+       // resolveLocation
+       //
+       // Pass a `location` identifier
+       // Returns a result like
+       // {
+       //   type:    'point', 'geojson', or 'countrycoder'
+       //   location:the queried location
+       //   id:      a unique identifier
+       //   feature: the geojson feature
+       // }
+       //or `null` if the location is invalid
+       //
+       defaultExport.prototype.resolveLocation = function resolveLocation (location) {
+         var valid = this.validateLocation(location);
+         if (!valid) { return null; }
+
+         // return a result from cache if we can
+         if (this._cache[valid.id]) {
+           return Object.assign(valid, { feature: this._cache[valid.id] });
+         }
+
+         // a [lon,lat] coordinate pair?
+         if (valid.type === 'point') {
+           var RADIUS = 25000;// meters
+           var EDGES = 10;
+           var PRECISION = 3;
+           var area = Math.PI * RADIUS * RADIUS / 1e6;   // m² to km²
+           var feature$1 = this._cache[valid.id] = geojsonPrecision({
+             type: 'Feature',
+             id: valid.id,
+             properties: { id: valid.id, area: Number(area.toFixed(2)) },
+             geometry: circleToPolygon(location, RADIUS, EDGES)
+           }, PRECISION);
+           return Object.assign(valid, { feature: feature$1 });
+
+         // a .geojson filename?
+         } else if (valid.type === 'geojson') ; else if (valid.type === 'countrycoder') {
+           var feature$1$1 = _cloneDeep(feature(valid.id));
+           var props = feature$1$1.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.
+           // BUT, when we try to actually work with these aggregated MultiPolygons,
+           // Turf/JSTS gets crashy because of topography bugs.
+           // SO, we'll aggregate the features ourselves by unioning them together.
+           // 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 seed = feature$1$1.geometry ? feature$1$1 : null;
+             var aggregate = props.members.reduce(_locationReducer.bind(this), seed);
+             feature$1$1.geometry = aggregate.geometry;
+           }
+
+           // ensure area property exists
+           if (!props.area) {
+             var area$1 = geojsonArea.geometry(feature$1$1.geometry) / 1e6;// m² to km²
+             props.area = Number(area$1.toFixed(2));
+           }
+
+           // ensure id property exists
+           feature$1$1.id = valid.id;
+           props.id = valid.id;
+
+           this._cache[valid.id] = feature$1$1;
+           return Object.assign(valid, { feature: feature$1$1 });
          }
 
+         return null;
+       };
 
-         // resolveLocationSet
-         //
-         // Pass a `locationSet` Object like:
-         //   `{ include: [ Array ], exclude: [ Array ] }`
-         // Returns a stable identifier string of the form:
-         //   "+[included]-[excluded]"
-         //
-         resolveLocationSet(locationSet) {
-           locationSet = locationSet || {};
-           const resolve = this.resolveLocation.bind(this);
-           let include = (locationSet.include || []).map(resolve).filter(Boolean);
-           let exclude = (locationSet.exclude || []).map(resolve).filter(Boolean);
 
-           if (!include.length) {
-             include = [resolve('Q2')];   // default to 'the world'
-           }
+       // resolveLocationSet
+       //
+       // Pass a `locationSet` Object like:
+       // `{ include: [ Array ], exclude: [ Array ] }`
+       // Returns a stable identifier string of the form:
+       // "+[included]-[excluded]"
+       //
+       defaultExport.prototype.resolveLocationSet = function resolveLocationSet (locationSet) {
+         locationSet = locationSet || {};
+         var resolve = this.resolveLocation.bind(this);
+         var include = (locationSet.include || []).map(resolve).filter(Boolean);
+         var exclude = (locationSet.exclude || []).map(resolve).filter(Boolean);
 
-           // return quickly if it's a single included location..
-           if (include.length === 1 && exclude.length === 0) {
-             return include[0].feature;
-           }
+         if (!include.length) {
+           include = [resolve('Q2')]; // default to 'the world'
+         }
 
-           // generate stable identifier
-           include.sort(sortFeatures);
-           let id = '+[' + include.map(d => d.id).join(',') + ']';
-           if (exclude.length) {
-             exclude.sort(sortFeatures);
-             id += '-[' + exclude.map(d => d.id).join(',') + ']';
-           }
+         // return quickly if it's a single included location..
+         if (include.length === 1 && exclude.length === 0) {
+           return include[0].feature;
+         }
 
-           // return cached?
-           if (this._cache[id]) {
-             return this._cache[id];
-           }
+         // generate stable identifier
+         include.sort(sortFeatures);
+         var id = '+[' + include.map(function (d) { return d.id; }).join(',') + ']';
+         if (exclude.length) {
+           exclude.sort(sortFeatures);
+           id += '-[' + exclude.map(function (d) { return d.id; }).join(',') + ']';
+         }
 
-           // calculate unions
-           let includeGeoJSON = include.map(d => d.location).reduce(_locationReducer.bind(this), null);
-           let excludeGeoJSON = exclude.map(d => d.location).reduce(_locationReducer.bind(this), null);
+         // return cached?
+         if (this._cache[id]) {
+           return this._cache[id];
+         }
 
-           // calculate difference, update area and return result
-           let resultGeoJSON = excludeGeoJSON ? difference(includeGeoJSON, excludeGeoJSON) : includeGeoJSON;
-           const area = geojsonArea.geometry(resultGeoJSON.geometry) / 1e6;  // m² to km²
-           resultGeoJSON.id = id;
-           resultGeoJSON.properties = { id: id, area: Number(area.toFixed(2)) };
+         // calculate unions
+         var includeGeoJSON = include.map(function (d) { return d.location; }).reduce(_locationReducer.bind(this), null);
+         var excludeGeoJSON = exclude.map(function (d) { return d.location; }).reduce(_locationReducer.bind(this), null);
 
-           return this._cache[id] = resultGeoJSON;
+         // calculate difference, update area and return result
+         var resultGeoJSON = excludeGeoJSON ? difference(includeGeoJSON, excludeGeoJSON) : includeGeoJSON;
+         var area = geojsonArea.geometry(resultGeoJSON.geometry) / 1e6;// m² to km²
+         resultGeoJSON.id = id;
+         resultGeoJSON.properties = { id: id, area: Number(area.toFixed(2)) };
 
+         return this._cache[id] = resultGeoJSON;
 
-           // Sorting the location lists is ok because they end up unioned together.
-           // This sorting makes it possible to generate a deterministic id.
-           function sortFeatures(a, b) {
-             const rank = { countrycoder: 1, geojson: 2, point: 3 };
-             const aRank = rank[a.type];
-             const bRank = rank[b.type];
 
-             return (aRank > bRank) ? 1
-               : (aRank < bRank) ? -1
-               : a.id.localeCompare(b.id);
-           }
+         // Sorting the location lists is ok because they end up unioned together.
+         // This sorting makes it possible to generate a deterministic id.
+         function sortFeatures(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);
          }
+       };
 
 
-         cache() {
-           return this._cache;
-         }
-       }
+       defaultExport.prototype.cache = function cache () {
+         return this._cache;
+       };
 
-       let _oci = null;
+       var _oci = null;
 
        function uiSuccess(context) {
-         const MAXEVENTS = 2;
-         const dispatch$1 = dispatch('cancel');
-         let _changeset;
-         let _location;
+         var MAXEVENTS = 2;
+         var dispatch$1 = dispatch('cancel');
+         var _changeset;
+         var _location;
          ensureOSMCommunityIndex();   // start fetching the data
 
 
          function ensureOSMCommunityIndex() {
-           const data = _mainFileFetcher;
+           var data = _mainFileFetcher;
            return Promise.all([ data.get('oci_resources'), data.get('oci_features') ])
-             .then(vals => {
-               if (_oci) return _oci;
+             .then(function (vals) {
+               if (_oci) { return _oci; }
 
-               const ociResources = vals[0].resources;
-               const loco = new LocationConflation(vals[1]);
-               let ociFeatures = {};
+               var ociResources = vals[0].resources;
+               var loco = new defaultExport(vals[1]);
+               var ociFeatures = {};
 
-               Object.values(ociResources).forEach(resource => {
-                 const feature = loco.resolveLocationSet(resource.locationSet);
-                 let ociFeature = ociFeatures[feature.id];
+               Object.values(ociResources).forEach(function (resource) {
+                 var feature = loco.resolveLocationSet(resource.locationSet);
+                 var ociFeature = ociFeatures[feature.id];
                  if (!ociFeature) {
                    ociFeature = JSON.parse(JSON.stringify(feature));  // deep clone
                    ociFeature.properties.resourceIDs = new Set();
 
          // string-to-date parsing in JavaScript is weird
          function parseEventDate(when) {
-           if (!when) return;
+           if (!when) { return; }
 
-           let raw = when.trim();
-           if (!raw) return;
+           var raw = when.trim();
+           if (!raw) { return; }
 
            if (!/Z$/.test(raw)) {   // if no trailing 'Z', add one
              raw += 'Z';            // this forces date to be parsed as a UTC date
            }
 
-           const parsed = new Date(raw);
+           var parsed = new Date(raw);
            return new Date(parsed.toUTCString().substr(0, 25));  // convert to local timezone
          }
 
 
          function success(selection) {
-           let header = selection
+           var header = selection
              .append('div')
              .attr('class', 'header fillL');
 
            header
              .append('button')
              .attr('class', 'close')
-             .on('click', () => dispatch$1.call('cancel'))
+             .on('click', function () { return dispatch$1.call('cancel'); })
              .call(svgIcon('#iD-icon-close'));
 
-           let body = selection
+           var body = selection
              .append('div')
              .attr('class', 'body save-success fillL');
 
-           let summary = body
+           var summary = body
              .append('div')
              .attr('class', 'save-summary');
 
              .append('span')
              .text(_t('success.help_link_text'));
 
-           let osm = context.connection();
-           if (!osm) return;
+           var osm = context.connection();
+           if (!osm) { return; }
 
-           let changesetURL = osm.changesetURL(_changeset.id);
+           var changesetURL = osm.changesetURL(_changeset.id);
 
-           let table = summary
+           var table = summary
              .append('table')
              .attr('class', 'summary-table');
 
-           let row = table
+           var row = table
              .append('tr')
              .attr('class', 'summary-row');
 
              .append('use')
              .attr('xlink:href', '#iD-logo-osm');
 
-           let summaryDetail = row
+           var summaryDetail = row
              .append('td')
              .attr('class', 'cell-detail summary-detail');
 
            summaryDetail
              .append('div')
              .html(_t('success.changeset_id', {
-               changeset_id: `<a href="${changesetURL}" target="_blank">${_changeset.id}</a>`
+               changeset_id: ("<a href=\"" + changesetURL + "\" target=\"_blank\">" + (_changeset.id) + "</a>")
              }));
 
 
            // Get OSM community index features intersecting the map..
            ensureOSMCommunityIndex()
-             .then(oci => {
-               let communities = [];
-               const properties = oci.query(context.map().center(), true) || [];
+             .then(function (oci) {
+               var communities = [];
+               var properties = oci.query(context.map().center(), true) || [];
 
                // Gather the communities from the result
-               properties.forEach(props => {
-                 const resourceIDs = Array.from(props.resourceIDs);
-                 resourceIDs.forEach(resourceID => {
-                   const resource = oci.resources[resourceID];
+               properties.forEach(function (props) {
+                 var resourceIDs = Array.from(props.resourceIDs);
+                 resourceIDs.forEach(function (resourceID) {
+                   var resource = oci.resources[resourceID];
                    communities.push({
                      area: props.area || Infinity,
                      order: resource.order || 0,
                });
 
                // sort communities by feature area ascending, community order descending
-               communities.sort((a, b) => a.area - b.area || b.order - a.order);
+               communities.sort(function (a, b) { return a.area - b.area || b.order - a.order; });
 
                body
-                 .call(showCommunityLinks, communities.map(c => c.resource));
+                 .call(showCommunityLinks, communities.map(function (c) { return c.resource; }));
              });
          }
 
 
          function showCommunityLinks(selection, resources) {
-           let communityLinks = selection
+           var communityLinks = selection
              .append('div')
              .attr('class', 'save-communityLinks');
 
              .append('h3')
              .text(_t('success.like_osm'));
 
-           let table = communityLinks
+           var table = communityLinks
              .append('table')
              .attr('class', 'community-table');
 
-           let row = table.selectAll('.community-row')
+           var row = table.selectAll('.community-row')
              .data(resources);
 
-           let rowEnter = row.enter()
+           var rowEnter = row.enter()
              .append('tr')
              .attr('class', 'community-row');
 
              .attr('class', 'cell-icon community-icon')
              .append('a')
              .attr('target', '_blank')
-             .attr('href', d => d.url)
+             .attr('href', function (d) { return d.url; })
              .append('svg')
              .attr('class', 'logo-small')
              .append('use')
-             .attr('xlink:href', d => `#community-${d.type}`);
+             .attr('xlink:href', function (d) { return ("#community-" + (d.type)); });
 
-           let communityDetail = rowEnter
+           var communityDetail = rowEnter
              .append('td')
              .attr('class', 'cell-detail community-detail');
 
 
 
          function showCommunityDetails(d) {
-           let selection = select(this);
-           let communityID = d.id;
-           let replacements = {
+           var selection = select(this);
+           var communityID = d.id;
+           var replacements = {
              url: linkify(d.url),
              signupUrl: linkify(d.signupUrl || d.url)
            };
              .append('a')
              .attr('target', '_blank')
              .attr('href', d.url)
-             .text(_t(`community.${d.id}.name`));
+             .text(_t(("community." + (d.id) + ".name")));
 
-           let descriptionHTML = _t(`community.${d.id}.description`, replacements);
+           var descriptionHTML = _t(("community." + (d.id) + ".description"), replacements);
 
            if (d.type === 'reddit') {   // linkify subreddits  #4997
              descriptionHTML = descriptionHTML
-               .replace(/(\/r\/\w*\/*)/i, match => linkify(d.url, match));
+               .replace(/(\/r\/\w*\/*)/i, function (match) { return linkify(d.url, match); });
            }
 
            selection
            if (d.extendedDescription || (d.languageCodes && d.languageCodes.length)) {
              selection
                .append('div')
-               .call(uiDisclosure(context, `community-more-${d.id}`, false)
+               .call(uiDisclosure(context, ("community-more-" + (d.id)), false)
                  .expanded(false)
                  .updatePreference(false)
                  .title(_t('success.more'))
                );
            }
 
-           let nextEvents = (d.events || [])
-             .map(event => {
+           var nextEvents = (d.events || [])
+             .map(function (event) {
                event.date = parseEventDate(event.when);
                return event;
              })
-             .filter(event => {      // date is valid and future (or today)
-               const t = event.date.getTime();
-               const now = (new Date()).setHours(0,0,0,0);
+             .filter(function (event) {      // date is valid and future (or today)
+               var t = event.date.getTime();
+               var now = (new Date()).setHours(0,0,0,0);
                return !isNaN(t) && t >= now;
              })
-             .sort((a, b) => {       // sort by date ascending
+             .sort(function (a, b) {       // sort by date ascending
                return a.date < b.date ? -1 : a.date > b.date ? 1 : 0;
              })
              .slice(0, MAXEVENTS);   // limit number of events shown
            if (nextEvents.length) {
              selection
                .append('div')
-               .call(uiDisclosure(context, `community-events-${d.id}`, false)
+               .call(uiDisclosure(context, ("community-events-" + (d.id)), false)
                  .expanded(false)
                  .updatePreference(false)
                  .title(_t('success.events'))
 
 
            function showMore(selection) {
-             let more = selection.selectAll('.community-more')
+             var more = selection.selectAll('.community-more')
                .data([0]);
 
-             let moreEnter = more.enter()
+             var moreEnter = more.enter()
                .append('div')
                .attr('class', 'community-more');
 
                moreEnter
                  .append('div')
                  .attr('class', 'community-extended-description')
-                 .html(_t(`community.${d.id}.extendedDescription`, replacements));
+                 .html(_t(("community." + (d.id) + ".extendedDescription"), replacements));
              }
 
              if (d.languageCodes && d.languageCodes.length) {
-               const languageList = d.languageCodes
-                 .map(code => _mainLocalizer.languageName(code))
+               var languageList = d.languageCodes
+                 .map(function (code) { return _mainLocalizer.languageName(code); })
                  .join(', ');
 
                moreEnter
 
 
            function showNextEvents(selection) {
-             let events = selection
+             var events = selection
                .append('div')
                .attr('class', 'community-events');
 
-             let item = events.selectAll('.community-event')
+             var item = events.selectAll('.community-event')
                .data(nextEvents);
 
-             let itemEnter = item.enter()
+             var itemEnter = item.enter()
                .append('div')
                .attr('class', 'community-event');
 
                .attr('class', 'community-event-name')
                .append('a')
                .attr('target', '_blank')
-               .attr('href', d => d.url)
-               .text(d => {
-                 let name = d.name;
+               .attr('href', function (d) { return d.url; })
+               .text(function (d) {
+                 var name = d.name;
                  if (d.i18n && d.id) {
-                   name = _t(`community.${communityID}.events.${d.id}.name`, { default: name });
+                   name = _t(("community." + communityID + ".events." + (d.id) + ".name"), { default: name });
                  }
                  return name;
                });
              itemEnter
                .append('div')
                .attr('class', 'community-event-when')
-               .text(d => {
-                 let options = { weekday: 'short', day: 'numeric', month: 'short', year: 'numeric' };
+               .text(function (d) {
+                 var options = { weekday: 'short', day: 'numeric', month: 'short', year: 'numeric' };
                  if (d.date.getHours() || d.date.getMinutes()) {   // include time if it has one
                    options.hour = 'numeric';
                    options.minute = 'numeric';
              itemEnter
                .append('div')
                .attr('class', 'community-event-where')
-               .text(d => {
-                 let where = d.where;
+               .text(function (d) {
+                 var where = d.where;
                  if (d.i18n && d.id) {
-                   where = _t(`community.${communityID}.events.${d.id}.where`, { default: where });
+                   where = _t(("community." + communityID + ".events." + (d.id) + ".where"), { default: where });
                  }
                  return where;
                });
              itemEnter
                .append('div')
                .attr('class', 'community-event-description')
-               .text(d => {
-                 let description = d.description;
+               .text(function (d) {
+                 var description = d.description;
                  if (d.i18n && d.id) {
-                   description = _t(`community.${communityID}.events.${d.id}.description`, { default: description });
+                   description = _t(("community." + communityID + ".events." + (d.id) + ".description"), { default: description });
                  }
                  return description;
                });
 
            function linkify(url, text) {
              text = text || url;
-             return `<a target="_blank" href="${url}">${text}</a>`;
+             return ("<a target=\"_blank\" href=\"" + url + "\">" + text + "</a>");
            }
          }
 
 
          success.changeset = function(val) {
-           if (!arguments.length) return _changeset;
+           if (!arguments.length) { return _changeset; }
            _changeset = val;
            return success;
          };
 
 
          success.location = function(val) {
-           if (!arguments.length) return _location;
+           if (!arguments.length) { return _location; }
            _location = val;
            return success;
          };
            function prepareForSuccess() {
                _success = uiSuccess(context);
                _location = null;
-               if (!services.geocoder) return;
+               if (!services.geocoder) { return; }
 
                services.geocoder.reverse(context.map().center(), function(err, result) {
-                   if (err || !result || !result.address) return;
+                   if (err || !result || !result.address) { return; }
 
                    var addr = result.address;
                    var place = (addr && (addr.town || addr.city || addr.county)) || '';
 
            modes.forEach(function(mode) {
                context.keybinding().on(mode.key, function() {
-                   if (!enabled()) return;
+                   if (!enabled()) { return; }
 
                    if (mode.id === context.mode().id) {
                        context.enter(modeBrowse(context));
                        .append('button')
                        .attr('class', function(d) { return d.id + ' add-button bar-button'; })
                        .on('click.mode-buttons', function(d) {
-                           if (!enabled()) return;
+                           if (!enabled()) { return; }
 
                            // When drawing, ignore accidental clicks on mode buttons - #4042
                            var currMode = context.mode().id;
-                           if (/^draw/.test(currMode)) return;
+                           if (/^draw/.test(currMode)) { return; }
 
                            if (d.id === currMode) {
                                context.enter(modeBrowse(context));
            }
 
            context.keybinding().on(mode.key, function() {
-               if (!enabled()) return;
+               if (!enabled()) { return; }
 
                if (mode.id === context.mode().id) {
                    context.enter(modeBrowse(context));
                        .attr('tabindex', -1)
                        .attr('class', function(d) { return d.id + ' add-button bar-button'; })
                        .on('click.notes', function(d) {
-                           if (!enabled()) return;
+                           if (!enabled()) { return; }
 
                            // When drawing, ignore accidental clicks on mode buttons - #4042
                            var currMode = context.mode().id;
-                           if (/^draw/.test(currMode)) return;
+                           if (/^draw/.test(currMode)) { return; }
 
                            if (d.id === currMode) {
                                context.enter(modeBrowse(context));
 
            function updateCount() {
                var val = history.difference().summary().length;
-               if (val === _numChanges) return;
+               if (val === _numChanges) { return; }
 
                _numChanges = val;
 
                context.keybinding()
                    .on(commands[0].cmd, function() {
                        event.preventDefault();
-                       if (editable()) commands[0].action();
+                       if (editable()) { commands[0].action(); }
                    })
                    .on(commands[1].cmd, function() {
                        event.preventDefault();
-                       if (editable()) commands[1].action();
+                       if (editable()) { commands[1].action(); }
                    });
 
 
 
                context.history()
                    .on('change.undo_redo', function(difference) {
-                       if (difference) update();
+                       if (difference) { update(); }
                    });
 
                context
                        .append('div')
                        .attr('class', function(d) {
                            var classes = 'toolbar-item ' + (d.id || d).replace('_', '-');
-                           if (d.klass) classes += ' ' + d.klass;
+                           if (d.klass) { classes += ' ' + d.klass; }
                            return classes;
                        });
 
            if (sawVersion === null && matchedVersion !== null) {
                if (corePreferences('sawVersion')) {
                    isNewUser = false;
-                   isNewVersion = corePreferences('sawVersion') !== currVersion;
+                   isNewVersion = corePreferences('sawVersion') !== currVersion && currVersion.indexOf('-') === -1;
                } else {
                    isNewUser = true;
                    isNewVersion = true;
            };
 
            pane.title = function(val) {
-               if (!arguments.length) return _title;
+               if (!arguments.length) { return _title; }
                _title = val;
                return pane;
            };
 
            pane.key = function(val) {
-               if (!arguments.length) return _key;
+               if (!arguments.length) { return _key; }
                _key = val;
                return pane;
            };
 
            pane.description = function(val) {
-               if (!arguments.length) return _description;
+               if (!arguments.length) { return _description; }
                _description = val;
                return pane;
            };
 
            pane.iconName = function(val) {
-               if (!arguments.length) return _iconName;
+               if (!arguments.length) { return _iconName; }
                _iconName = val;
                return pane;
            };
 
            pane.sections = function(val) {
-               if (!arguments.length) return _sections;
+               if (!arguments.length) { return _sections; }
                _sections = val;
                return pane;
            };
            }
 
            pane.togglePane = function() {
-               if (event) event.preventDefault();
+               if (event) { event.preventDefault(); }
                _paneTooltip.hide();
                context.ui().togglePanes(!_paneSelection.classed('shown') ? _paneSelection : undefined);
            };
                    .attr('title', _t('background.reset'))
                    .attr('class', function(d) { return 'display-option-reset display-option-reset-' + d; })
                    .on('click', function(d) {
-                       if (event.button !== 0) return;
+                       if (event.button !== 0) { return; }
                        updateValue(d, 1);
                    })
                    .call(svgIcon('#iD-icon-' + (_mainLocalizer.textDirection() === 'rtl' ? 'redo' : 'undo')));
                var textSection = modal.select('.modal-section.message-text');
 
                var instructions =
-                   `${_t('settings.custom_background.instructions.info')}\n` +
+                   (_t('settings.custom_background.instructions.info')) + "\n" +
                    '\n' +
-                   `#### ${_t('settings.custom_background.instructions.wms.tokens_label')}\n` +
-                   `* ${_t('settings.custom_background.instructions.wms.tokens.proj')}\n` +
-                   `* ${_t('settings.custom_background.instructions.wms.tokens.wkid')}\n` +
-                   `* ${_t('settings.custom_background.instructions.wms.tokens.dimensions')}\n` +
-                   `* ${_t('settings.custom_background.instructions.wms.tokens.bbox')}\n` +
+                   "#### " + (_t('settings.custom_background.instructions.wms.tokens_label')) + "\n" +
+                   "* " + (_t('settings.custom_background.instructions.wms.tokens.proj')) + "\n" +
+                   "* " + (_t('settings.custom_background.instructions.wms.tokens.wkid')) + "\n" +
+                   "* " + (_t('settings.custom_background.instructions.wms.tokens.dimensions')) + "\n" +
+                   "* " + (_t('settings.custom_background.instructions.wms.tokens.bbox')) + "\n" +
                    '\n' +
-                   `#### ${_t('settings.custom_background.instructions.tms.tokens_label')}\n` +
-                   `* ${_t('settings.custom_background.instructions.tms.tokens.xyz')}\n` +
-                   `* ${_t('settings.custom_background.instructions.tms.tokens.flipped_y')}\n` +
-                   `* ${_t('settings.custom_background.instructions.tms.tokens.switch')}\n` +
-                   `* ${_t('settings.custom_background.instructions.tms.tokens.quadtile')}\n` +
-                   `* ${_t('settings.custom_background.instructions.tms.tokens.scale_factor')}\n` +
+                   "#### " + (_t('settings.custom_background.instructions.tms.tokens_label')) + "\n" +
+                   "* " + (_t('settings.custom_background.instructions.tms.tokens.xyz')) + "\n" +
+                   "* " + (_t('settings.custom_background.instructions.tms.tokens.flipped_y')) + "\n" +
+                   "* " + (_t('settings.custom_background.instructions.tms.tokens.switch')) + "\n" +
+                   "* " + (_t('settings.custom_background.instructions.tms.tokens.quadtile')) + "\n" +
+                   "* " + (_t('settings.custom_background.instructions.tms.tokens.scale_factor')) + "\n" +
                    '\n' +
-                   `#### ${_t('settings.custom_background.instructions.example')}\n` +
-                   `\`${example}\``;
+                   "#### " + (_t('settings.custom_background.instructions.example')) + "\n" +
+                   "`" + example + "`";
 
                textSection
                    .append('div')
                var input = select(this);
                var d = input.node().value;
 
-               if (d === '') return resetOffset();
+               if (d === '') { return resetOffset(); }
 
                d = d.replace(/;/g, ',').split(',').map(function(n) {
                    // if n is NaN, it will always get mapped to false.
 
 
            function dragOffset() {
-               if (event.button !== 0) return;
+               if (event.button !== 0) { return; }
 
                var origin = [event.clientX, event.clientY];
 
                }
 
                function pointermove() {
-                   if (pointerId !== (event.pointerId || 'mouse')) return;
+                   if (pointerId !== (event.pointerId || 'mouse')) { return; }
 
                    var latest = [event.clientX, event.clientY];
                    var d = [
                }
 
                function pointerup() {
-                   if (pointerId !== (event.pointerId || 'mouse')) return;
-                   if (event.button !== 0) return;
+                   if (pointerId !== (event.pointerId || 'mouse')) { return; }
+                   if (event.button !== 0) { return; }
 
                    context.container().selectAll('.nudge-surface')
                        .remove();
                    .attr('class', function(d) { return d[0] + ' nudge'; })
                    .on('contextmenu', cancelEvent)
                    .on(_pointerPrefix + 'down', function(d) {
-                       if (event.button !== 0) return;
+                       if (event.button !== 0) { return; }
                        pointerdownNudgeButton(d[1]);
                    });
 
                    .on('contextmenu', cancelEvent)
                    .on('click', function() {
                        event.preventDefault();
-                       if (event.button !== 0) return;
+                       if (event.button !== 0) { return; }
                        resetOffset();
                    })
                    .call(svgIcon('#iD-icon-' + (_mainLocalizer.textDirection() === 'rtl' ? 'redo' : 'undo')));
 
 
                function clickWalkthrough() {
-                   if (context.inIntro()) return;
+                   if (context.inIntro()) { return; }
                    context.container().call(uiIntro(context));
                    context.ui().togglePanes();
                }
 
            var section = uiSection(id, context)
                .title(function() {
-                   if (!_issues) return '';
+                   if (!_issues) { return ''; }
                    var issueCountText = _issues.length > 1000 ? '1000+' : String(_issues.length);
                    return _t('issues.' + severity + 's.list_title', { count: issueCountText });
                })
            function setLayer(which, enabled) {
                // Don't allow layer changes while drawing - #6584
                var mode = context.mode();
-               if (mode && /^draw/.test(mode.id)) return;
+               if (mode && /^draw/.test(mode.id)) { return; }
 
                var layer = layers.layer(which);
                if (layer) {
                        })
                        .keys(function(d) {
                            var key = (d === 'wireframe' ? _t('area_fill.wireframe.key') : null);
-                           if (d === 'highlight_edits') key = _t('map_data.highlight_edits.key');
+                           if (d === 'highlight_edits') { key = _t('map_data.highlight_edits.key'); }
                            return key ? [key] : null;
                        })
                        .placement('top')
                    .append('label')
                    .each(function(d) {
                        var titleID;
-                       if (d.id === 'mapillary-signs') titleID = 'mapillary.signs.tooltip';
-                       else if (d.id === 'mapillary') titleID = 'mapillary_images.tooltip';
-                       else if (d.id === 'openstreetcam') titleID = 'openstreetcam_images.tooltip';
-                       else titleID = d.id.replace(/-/g, '_') + '.tooltip';
+                       if (d.id === 'mapillary-signs') { titleID = 'mapillary.signs.tooltip'; }
+                       else if (d.id === 'mapillary') { titleID = 'mapillary_images.tooltip'; }
+                       else if (d.id === 'openstreetcam') { titleID = 'openstreetcam_images.tooltip'; }
+                       else { titleID = d.id.replace(/-/g, '_') + '.tooltip'; }
                        select(this)
                            .call(uiTooltip()
                                .title(_t(titleID))
                    .append('span')
                    .text(function(d) {
                        var id = d.id;
-                       if (id === 'mapillary-signs') id = 'photo_overlays.traffic_signs';
+                       if (id === 'mapillary-signs') { id = 'photo_overlays.traffic_signs'; }
                        return _t(id.replace(/-/g, '_') + '.title');
                    });
 
 
        function uiSectionPrivacy(context) {
 
-           let section = uiSection('preferences-third-party', context)
+           var section = uiSection('preferences-third-party', context)
              .title(_t('preferences.privacy.title'))
              .disclosureContent(renderDisclosureContent);
 
-           let _showThirdPartyIcons = corePreferences('preferences.privacy.thirdpartyicons') || 'true';
+           var _showThirdPartyIcons = corePreferences('preferences.privacy.thirdpartyicons') || 'true';
 
            function renderDisclosureContent(selection) {
              // enter
-             let privacyOptionsListEnter = selection.selectAll('.privacy-options-list')
+             var privacyOptionsListEnter = selection.selectAll('.privacy-options-list')
                .data([0])
                .enter()
                .append('ul')
                .attr('class', 'layer-list privacy-options-list');
 
-             let thirdPartyIconsEnter = privacyOptionsListEnter
+             var thirdPartyIconsEnter = privacyOptionsListEnter
                .append('li')
                .attr('class', 'privacy-third-party-icons-item')
                .append('label')
              thirdPartyIconsEnter
                .append('input')
                .attr('type', 'checkbox')
-               .on('change', () => {
+               .on('change', function () {
                  event.preventDefault();
                  _showThirdPartyIcons = (_showThirdPartyIcons === 'true') ? 'false' : 'true';
                  corePreferences('preferences.privacy.thirdpartyicons', _showThirdPartyIcons);
 
        function uiPanePreferences(context) {
 
-         let preferencesPane = uiPane('preferences', context)
+         var preferencesPane = uiPane('preferences', context)
            .key(_t('preferences.key'))
            .title(_t('preferences.title'))
            .description(_t('preferences.description'))
                container
                    .on('click.ui', function() {
                        // we're only concerned with the primary mouse button
-                       if (event.button !== 0) return;
+                       if (event.button !== 0) { return; }
 
-                       if (!event.composedPath) return;
+                       if (!event.composedPath) { return; }
 
                        // some targets have default click events we don't want to override
                        var isOkayTarget = event.composedPath().some(function(node) {
-                           // clicking <label> affects its <input> by default
-                           return node.nodeName === 'LABEL' ||
+                           // we only care about element nodes
+                           return node.nodeType === 1 &&
+                               // clicking <input> focuses it and/or changes a value
+                               (node.nodeName === 'INPUT' ||
+                               // clicking <label> affects its <input> by default
+                               node.nodeName === 'LABEL' ||
                                // clicking <a> opens a hyperlink by default
-                               node.nodeName === 'A';
+                               node.nodeName === 'A');
                        });
-                       if (isOkayTarget) return;
+                       if (isOkayTarget) { return; }
 
                        // disable double-tap-to-zoom on touchscreens
                        event.preventDefault();
 
                        // Don't allow layer changes while drawing - #6584
                        var mode = context.mode();
-                       if (mode && /^draw/.test(mode.id)) return;
+                       if (mode && /^draw/.test(mode.id)) { return; }
 
                        var layer = context.layers().layer('osm');
                        if (layer) {
 
                function pan(d) {
                    return function() {
-                       if (event.shiftKey) return;
-                       if (context.container().select('.combobox').size()) return;
+                       if (event.shiftKey) { return; }
+                       if (context.container().select('.combobox').size()) { return; }
                        event.preventDefault();
                        context.map().pan(d, 100);
                    };
            }
 
 
-           let ui = {};
+           var ui = {};
 
-           let _loadPromise;
+           var _loadPromise;
            // renders the iD interface into the container node
-           ui.ensureLoaded = () => {
+           ui.ensureLoaded = function () {
 
-               if (_loadPromise) return _loadPromise;
+               if (_loadPromise) { return _loadPromise; }
 
                return _loadPromise = Promise.all([
                        // must have strings and presets before loading the UI
                        _mainLocalizer.ensureLoaded(),
                        _mainPresetIndex.ensureLoaded()
                    ])
-                   .then(() => {
-                       if (!context.container().empty()) render(context.container());
+                   .then(function () {
+                       if (!context.container().empty()) { render(context.container()); }
                    })
-                   .catch(err => console.error(err));  // eslint-disable-line
+                   .catch(function (err) { return console.error(err); });  // eslint-disable-line
            };
 
 
                // remove any displayed menu
                ui.closeEditMenu();
 
-               if (!operations && context.mode().operations) operations = context.mode().operations();
-               if (!operations || !operations.length) return;
+               if (!operations && context.mode().operations) { operations = context.mode().operations(); }
+               if (!operations || !operations.length) { return; }
 
                // disable menu if in wide selection, for example
-               if (!context.map().editableDataEnabled()) return;
+               if (!context.map().editableDataEnabled()) { return; }
 
                var surfaceNode = context.surface().node();
                if (surfaceNode.focus) {   // FF doesn't support it
                }
 
                operations.forEach(function(operation) {
-                   if (operation.point) operation.point(anchorPoint);
+                   if (operation.point) { operation.point(anchorPoint); }
                });
 
                _editMenu
        }
 
        function coreContext() {
-         const dispatch$1 = dispatch('enter', 'exit', 'change');
-         let context = utilRebind({}, dispatch$1, 'on');
-         let _deferred = new Set();
+         var this$1 = this;
+
+         var dispatch$1 = dispatch('enter', 'exit', 'change');
+         var context = utilRebind({}, dispatch$1, 'on');
+         var _deferred = new Set();
 
-         context.version = '2.18.0';
+         context.version = '2.18.4';
          context.privacyVersion = '20200407';
 
          // iD will alter the hash so cache the parameters intended to setup the session
          // An osmChangeset object. Not loaded until needed.
          context.changeset = null;
 
-         let _defaultChangesetComment = context.initialHashParams.comment;
-         let _defaultChangesetSource = context.initialHashParams.source;
-         let _defaultChangesetHashtags = context.initialHashParams.hashtags;
+         var _defaultChangesetComment = context.initialHashParams.comment;
+         var _defaultChangesetSource = context.initialHashParams.source;
+         var _defaultChangesetHashtags = context.initialHashParams.hashtags;
          context.defaultChangesetComment = function(val) {
-           if (!arguments.length) return _defaultChangesetComment;
+           if (!arguments.length) { return _defaultChangesetComment; }
            _defaultChangesetComment = val;
            return context;
          };
          context.defaultChangesetSource = function(val) {
-           if (!arguments.length) return _defaultChangesetSource;
+           if (!arguments.length) { return _defaultChangesetSource; }
            _defaultChangesetSource = val;
            return context;
          };
          context.defaultChangesetHashtags = function(val) {
-           if (!arguments.length) return _defaultChangesetHashtags;
+           if (!arguments.length) { return _defaultChangesetHashtags; }
            _defaultChangesetHashtags = val;
            return context;
          };
          /* (typically shown as the label for the browser window/tab) */
 
          // If true, iD will update the title based on what the user is doing
-         let _setsDocumentTitle = true;
+         var _setsDocumentTitle = true;
          context.setsDocumentTitle = function(val) {
-           if (!arguments.length) return _setsDocumentTitle;
+           if (!arguments.length) { return _setsDocumentTitle; }
            _setsDocumentTitle = val;
            return context;
          };
          // The part of the title that is always the same
-         let _documentTitleBase = document.title;
+         var _documentTitleBase = document.title;
          context.documentTitleBase = function(val) {
-           if (!arguments.length) return _documentTitleBase;
+           if (!arguments.length) { return _documentTitleBase; }
            _documentTitleBase = val;
            return context;
          };
 
 
          /* User interface and keybinding */
-         let _ui;
-         context.ui = () => _ui;
-         context.lastPointerType = () => _ui.lastPointerType();
+         var _ui;
+         context.ui = function () { return _ui; };
+         context.lastPointerType = function () { return _ui.lastPointerType(); };
 
-         let _keybinding = utilKeybinding('context');
-         context.keybinding = () => _keybinding;
+         var _keybinding = utilKeybinding('context');
+         context.keybinding = function () { return _keybinding; };
          select(document).call(_keybinding);
 
 
          /* Straight accessors. Avoid using these if you can. */
-         let _connection;
-         let _history;
-         let _validator;
-         let _uploader;
-         context.connection = () => _connection;
-         context.history = () => _history;
-         context.validator = () => _validator;
-         context.uploader = () => _uploader;
+         // Instantiate the connection here because it doesn't require passing in
+         // `context` and it's needed for pre-init calls like `preauth`
+         var _connection = services.osm;
+         var _history;
+         var _validator;
+         var _uploader;
+         context.connection = function () { return _connection; };
+         context.history = function () { return _history; };
+         context.validator = function () { return _validator; };
+         context.uploader = function () { return _uploader; };
 
          /* Connection */
-         context.preauth = (options) => {
+         context.preauth = function (options) {
            if (_connection) {
              _connection.switch(options);
            }
          };
 
          /* connection options for source switcher (optional) */
-         let _apiConnections;
+         var _apiConnections;
          context.apiConnections = function(val) {
-           if (!arguments.length) return _apiConnections;
+           if (!arguments.length) { return _apiConnections; }
            _apiConnections = val;
            return context;
          };
 
 
+         // A string or array or locale codes to prefer over the browser's settings
+         context.locale = function(locale) {
+           if (!arguments.length) { return _mainLocalizer.localeCode(); }
+           _mainLocalizer.preferredLocaleCodes(locale);
+           return context;
+         };
+
+
          function afterLoad(cid, callback) {
-           return (err, result) => {
+           return function (err, result) {
              if (err) {
                // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
                if (err.status === 400 || err.status === 401 || err.status === 403) {
          }
 
 
-         context.loadTiles = (projection, callback) => {
-           const handle = window.requestIdleCallback(() => {
+         context.loadTiles = function (projection, callback) {
+           var handle = window.requestIdleCallback(function () {
              _deferred.delete(handle);
              if (_connection && context.editableDataEnabled()) {
-               const cid = _connection.getConnectionId();
+               var cid = _connection.getConnectionId();
                _connection.loadTiles(projection, afterLoad(cid, callback));
              }
            });
            _deferred.add(handle);
          };
 
-         context.loadTileAtLoc = (loc, callback) => {
-           const handle = window.requestIdleCallback(() => {
+         context.loadTileAtLoc = function (loc, callback) {
+           var handle = window.requestIdleCallback(function () {
              _deferred.delete(handle);
              if (_connection && context.editableDataEnabled()) {
-               const cid = _connection.getConnectionId();
+               var cid = _connection.getConnectionId();
                _connection.loadTileAtLoc(loc, afterLoad(cid, callback));
              }
            });
            _deferred.add(handle);
          };
 
-         context.loadEntity = (entityID, callback) => {
+         context.loadEntity = function (entityID, callback) {
            if (_connection) {
-             const cid = _connection.getConnectionId();
+             var cid = _connection.getConnectionId();
              _connection.loadEntity(entityID, afterLoad(cid, callback));
            }
          };
 
-         context.zoomToEntity = (entityID, zoomTo) => {
+         context.zoomToEntity = function (entityID, zoomTo) {
            if (zoomTo !== false) {
-             context.loadEntity(entityID, (err, result) => {
-               if (err) return;
-               const entity = result.data.find(e => e.id === entityID);
+             context.loadEntity(entityID, function (err, result) {
+               if (err) { return; }
+               var entity = result.data.find(function (e) { return e.id === entityID; });
                if (entity) {
                  _map.zoomTo(entity);
                }
              });
            }
 
-           _map.on('drawn.zoomToEntity', () => {
-             if (!context.hasEntity(entityID)) return;
+           _map.on('drawn.zoomToEntity', function () {
+             if (!context.hasEntity(entityID)) { return; }
              _map.on('drawn.zoomToEntity', null);
              context.on('enter.zoomToEntity', null);
              context.enter(modeSelect(context, [entityID]));
            });
 
-           context.on('enter.zoomToEntity', () => {
+           context.on('enter.zoomToEntity', function () {
              if (_mode.id !== 'browse') {
                _map.on('drawn.zoomToEntity', null);
                context.on('enter.zoomToEntity', null);
            });
          };
 
-         let _minEditableZoom = 16;
+         var _minEditableZoom = 16;
          context.minEditableZoom = function(val) {
-           if (!arguments.length) return _minEditableZoom;
+           if (!arguments.length) { return _minEditableZoom; }
            _minEditableZoom = val;
            if (_connection) {
              _connection.tileZoom(val);
          };
 
          // String length limits in Unicode characters, not JavaScript UTF-16 code units
-         context.maxCharsForTagKey = () => 255;
-         context.maxCharsForTagValue = () => 255;
-         context.maxCharsForRelationRole = () => 255;
+         context.maxCharsForTagKey = function () { return 255; };
+         context.maxCharsForTagValue = function () { return 255; };
+         context.maxCharsForRelationRole = function () { return 255; };
 
          function cleanOsmString(val, maxChars) {
            // be lenient with input
            val = val.trim();
 
            // use the canonical form of the string
-           if (val.normalize) val = val.normalize('NFC');
+           if (val.normalize) { val = val.normalize('NFC'); }
 
            // trim to the number of allowed characters
            return utilUnicodeCharsTruncated(val, maxChars);
          }
-         context.cleanTagKey = (val) => cleanOsmString(val, context.maxCharsForTagKey());
-         context.cleanTagValue = (val) => cleanOsmString(val, context.maxCharsForTagValue());
-         context.cleanRelationRole = (val) => cleanOsmString(val, context.maxCharsForRelationRole());
+         context.cleanTagKey = function (val) { return cleanOsmString(val, context.maxCharsForTagKey()); };
+         context.cleanTagValue = function (val) { return cleanOsmString(val, context.maxCharsForTagValue()); };
+         context.cleanRelationRole = function (val) { return cleanOsmString(val, context.maxCharsForRelationRole()); };
 
 
          /* History */
-         let _inIntro = false;
+         var _inIntro = false;
          context.inIntro = function(val) {
-           if (!arguments.length) return _inIntro;
+           if (!arguments.length) { return _inIntro; }
            _inIntro = val;
            return context;
          };
 
          // Immediately save the user's history to localstorage, if possible
          // This is called someteimes, but also on the `window.onbeforeunload` handler
-         context.save = () => {
+         context.save = function () {
            // no history save, no message onbeforeunload
-           if (_inIntro || context.container().select('.modal').size()) return;
+           if (_inIntro || context.container().select('.modal').size()) { return; }
 
-           let canSave;
+           var canSave;
            if (_mode && _mode.id === 'save') {
              canSave = false;
 
              }
 
            } else {
-             canSave = context.selectedIDs().every(id => {
-               const entity = context.hasEntity(id);
+             canSave = context.selectedIDs().every(function (id) {
+               var entity = context.hasEntity(id);
                return entity && !entity.isDegenerate();
              });
            }
 
          function withDebouncedSave(fn) {
            return function() {
-             const result = fn.apply(_history, arguments);
+             var result = fn.apply(_history, arguments);
              context.debouncedSave();
              return result;
            };
 
 
          /* Graph */
-         context.hasEntity = (id) => _history.graph().hasEntity(id);
-         context.entity = (id) => _history.graph().entity(id);
+         context.hasEntity = function (id) { return _history.graph().hasEntity(id); };
+         context.entity = function (id) { return _history.graph().entity(id); };
 
 
          /* Modes */
-         let _mode;
-         context.mode = () => _mode;
-         context.enter = (newMode) => {
+         var _mode;
+         context.mode = function () { return _mode; };
+         context.enter = function (newMode) {
            if (_mode) {
              _mode.exit();
-             dispatch$1.call('exit', this, _mode);
+             dispatch$1.call('exit', this$1, _mode);
            }
 
            _mode = newMode;
            _mode.enter();
-           dispatch$1.call('enter', this, _mode);
+           dispatch$1.call('enter', this$1, _mode);
          };
 
-         context.selectedIDs = () => (_mode && _mode.selectedIDs && _mode.selectedIDs()) || [];
-         context.activeID = () => _mode && _mode.activeID && _mode.activeID();
+         context.selectedIDs = function () { return (_mode && _mode.selectedIDs && _mode.selectedIDs()) || []; };
+         context.activeID = function () { return _mode && _mode.activeID && _mode.activeID(); };
 
-         let _selectedNoteID;
+         var _selectedNoteID;
          context.selectedNoteID = function(noteID) {
-           if (!arguments.length) return _selectedNoteID;
+           if (!arguments.length) { return _selectedNoteID; }
            _selectedNoteID = noteID;
            return context;
          };
 
          // NOTE: Don't change the name of this until UI v3 is merged
-         let _selectedErrorID;
+         var _selectedErrorID;
          context.selectedErrorID = function(errorID) {
-           if (!arguments.length) return _selectedErrorID;
+           if (!arguments.length) { return _selectedErrorID; }
            _selectedErrorID = errorID;
            return context;
          };
 
 
          /* Behaviors */
-         context.install = (behavior) => context.surface().call(behavior);
-         context.uninstall = (behavior) => context.surface().call(behavior.off);
+         context.install = function (behavior) { return context.surface().call(behavior); };
+         context.uninstall = function (behavior) { return context.surface().call(behavior.off); };
 
 
          /* Copy/Paste */
-         let _copyGraph;
-         context.copyGraph = () => _copyGraph;
+         var _copyGraph;
+         context.copyGraph = function () { return _copyGraph; };
 
-         let _copyIDs = [];
+         var _copyIDs = [];
          context.copyIDs = function(val) {
-           if (!arguments.length) return _copyIDs;
+           if (!arguments.length) { return _copyIDs; }
            _copyIDs = val;
            _copyGraph = _history.graph();
            return context;
          };
 
-         let _copyLonLat;
+         var _copyLonLat;
          context.copyLonLat = function(val) {
-           if (!arguments.length) return _copyLonLat;
+           if (!arguments.length) { return _copyLonLat; }
            _copyLonLat = val;
            return context;
          };
 
 
          /* Background */
-         let _background;
-         context.background = () => _background;
+         var _background;
+         context.background = function () { return _background; };
 
 
          /* Features */
-         let _features;
-         context.features = () => _features;
-         context.hasHiddenConnections = (id) => {
-           const graph = _history.graph();
-           const entity = graph.entity(id);
+         var _features;
+         context.features = function () { return _features; };
+         context.hasHiddenConnections = function (id) {
+           var graph = _history.graph();
+           var entity = graph.entity(id);
            return _features.hasHiddenConnections(entity, graph);
          };
 
 
          /* Photos */
-         let _photos;
-         context.photos = () => _photos;
+         var _photos;
+         context.photos = function () { return _photos; };
 
 
          /* Map */
-         let _map;
-         context.map = () => _map;
-         context.layers = () => _map.layers();
-         context.surface = () => _map.surface;
-         context.editableDataEnabled = () => _map.editableDataEnabled();
-         context.surfaceRect = () => _map.surface.node().getBoundingClientRect();
-         context.editable = () => {
+         var _map;
+         context.map = function () { return _map; };
+         context.layers = function () { return _map.layers(); };
+         context.surface = function () { return _map.surface; };
+         context.editableDataEnabled = function () { return _map.editableDataEnabled(); };
+         context.surfaceRect = function () { return _map.surface.node().getBoundingClientRect(); };
+         context.editable = function () {
            // don't allow editing during save
-           const mode = context.mode();
-           if (!mode || mode.id === 'save') return false;
+           var mode = context.mode();
+           if (!mode || mode.id === 'save') { return false; }
            return _map.editableDataEnabled();
          };
 
 
          /* Debug */
-         let _debugFlags = {
+         var _debugFlags = {
            tile: false,        // tile boundaries
            collision: false,   // label collision bounding boxes
            imagery: false,     // imagery bounding polygons
            target: false,      // touch targets
            downloaded: false   // downloaded data from osm
          };
-         context.debugFlags = () => _debugFlags;
-         context.getDebug = (flag) => flag && _debugFlags[flag];
+         context.debugFlags = function () { return _debugFlags; };
+         context.getDebug = function (flag) { return flag && _debugFlags[flag]; };
          context.setDebug = function(flag, val) {
-           if (arguments.length === 1) val = true;
+           if (arguments.length === 1) { val = true; }
            _debugFlags[flag] = val;
            dispatch$1.call('change');
            return context;
 
 
          /* Container */
-         let _container = select(null);
+         var _container = select(null);
          context.container = function(val) {
-           if (!arguments.length) return _container;
+           if (!arguments.length) { return _container; }
            _container = val;
            _container.classed('ideditor', true);
            return context;
          };
          context.containerNode = function(val) {
-           if (!arguments.length) return context.container().node();
+           if (!arguments.length) { return context.container().node(); }
            context.container(select(val));
            return context;
          };
 
-         let _embed;
+         var _embed;
          context.embed = function(val) {
-           if (!arguments.length) return _embed;
+           if (!arguments.length) { return _embed; }
            _embed = val;
            return context;
          };
 
 
          /* Assets */
-         let _assetPath = '';
+         var _assetPath = '';
          context.assetPath = function(val) {
-           if (!arguments.length) return _assetPath;
+           if (!arguments.length) { return _assetPath; }
            _assetPath = val;
            _mainFileFetcher.assetPath(val);
            return context;
          };
 
-         let _assetMap = {};
+         var _assetMap = {};
          context.assetMap = function(val) {
-           if (!arguments.length) return _assetMap;
+           if (!arguments.length) { return _assetMap; }
            _assetMap = val;
            _mainFileFetcher.assetMap(val);
            return context;
          };
 
-         context.asset = (val) => {
-           if (/^http(s)?:\/\//i.test(val)) return val;
-           const filename = _assetPath + val;
+         context.asset = function (val) {
+           if (/^http(s)?:\/\//i.test(val)) { return val; }
+           var filename = _assetPath + val;
            return _assetMap[filename] || filename;
          };
 
-         context.imagePath = (val) => context.asset(`img/${val}`);
+         context.imagePath = function (val) { return context.asset(("img/" + val)); };
 
 
          /* reset (aka flush) */
-         context.reset = context.flush = () => {
+         context.reset = context.flush = function () {
            context.debouncedSave.cancel();
 
-           Array.from(_deferred).forEach(handle => {
+           Array.from(_deferred).forEach(function (handle) {
              window.cancelIdleCallback(handle);
              _deferred.delete(handle);
            });
 
-           Object.values(services).forEach(service => {
+           Object.values(services).forEach(function (service) {
              if (service && typeof service.reset === 'function') {
                service.reset(context);
              }
 
 
          /* Init */
-         context.init = () => {
+         context.init = function () {
 
            instantiateInternal();
 
              _photos = rendererPhotos(context);
 
              _ui = uiInit(context);
-
-             _connection = services.osm;
            }
 
            // Set up objects that might need to access properties of `context`. The order
                _mainPresetIndex.addablePresetIDs(new Set(context.initialHashParams.presets.split(',')));
              }
 
+             if (context.initialHashParams.locale) {
+               _mainLocalizer.preferredLocaleCodes(context.initialHashParams.locale);
+             }
+
              // kick off some async work
              _mainLocalizer.ensureLoaded();
              _background.ensureLoaded();
              _mainPresetIndex.ensureLoaded();
 
-             Object.values(services).forEach(service => {
+             Object.values(services).forEach(function (service) {
                if (service && typeof service.init === 'function') {
                  service.init();
                }
 
              if (services.maprules && context.initialHashParams.maprules) {
                d3_json(context.initialHashParams.maprules)
-                 .then(mapcss => {
+                 .then(function (mapcss) {
                    services.maprules.init();
-                   mapcss.forEach(mapcssSelector => services.maprules.addRule(mapcssSelector));
+                   mapcss.forEach(function (mapcssSelector) { return services.maprules.addRule(mapcssSelector); });
                  })
-                 .catch(() => { /* ignore */ });
+                 .catch(function () { /* ignore */ });
              }
 
              // if the container isn't available, e.g. when testing, don't load the UI
-             if (!context.container().empty()) _ui.ensureLoaded();
+             if (!context.container().empty()) { _ui.ensureLoaded(); }
            }
          };
 
 
        // When `debug = true`, we use `Object.freeze` on immutables in iD.
        // This is only done in testing because of the performance penalty.
-       let debug = false;
-       let d3 = {
+       var debug = false;
+       var d3 = {
          customEvent: customEvent,
          dispatch:  dispatch,
          event:  event,
        window.iD = iD;
 
 }());
-//# sourceMappingURL=iD.js.map