diff --git a/package-lock.json b/package-lock.json
index 1d16893e70a7793976267ef97c8e906dc8de1d1b..f8d9c588927356a3fc1d970f356e0f95f2e09dbb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,7 +10,8 @@
         "@turf/flip": "^6.5.0",
         "axios": "^0.21.1",
         "core-js": "^3.6.5",
-        "leaflet": "^1.7.1",
+        "leaflet": "^1.5.1",
+        "leaflet-draw": "^1.0.4",
         "register-service-worker": "^1.7.1",
         "vue": "^2.6.11",
         "vue-frag": "^1.1.5",
@@ -8289,9 +8290,14 @@
       }
     },
     "node_modules/leaflet": {
-      "version": "1.7.1",
-      "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.7.1.tgz",
-      "integrity": "sha512-/xwPEBidtg69Q3HlqPdU3DnrXQOvQU/CCHA1tcDQVzOwm91YMYaILjNp7L4Eaw5Z4sOYdbBz6koWyibppd8Zqw=="
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.5.1.tgz",
+      "integrity": "sha512-ekM9KAeG99tYisNBg0IzEywAlp0hYI5XRipsqRXyRTeuU8jcuntilpp+eFf5gaE0xubc9RuSNIVtByEKwqFV0w=="
+    },
+    "node_modules/leaflet-draw": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/leaflet-draw/-/leaflet-draw-1.0.4.tgz",
+      "integrity": "sha512-rsQ6saQO5ST5Aj6XRFylr5zvarWgzWnrg46zQ1MEOEIHsppdC/8hnN8qMoFvACsPvTioAuysya/TVtog15tyAQ=="
     },
     "node_modules/less": {
       "version": "3.13.1",
@@ -13652,6 +13658,7 @@
       "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
       "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
       "dev": true,
+      "hasInstallScript": true,
       "optional": true,
       "os": [
         "darwin"
@@ -13982,6 +13989,7 @@
       "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
       "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
       "dev": true,
+      "hasInstallScript": true,
       "optional": true,
       "os": [
         "darwin"
@@ -21836,9 +21844,14 @@
       }
     },
     "leaflet": {
-      "version": "1.7.1",
-      "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.7.1.tgz",
-      "integrity": "sha512-/xwPEBidtg69Q3HlqPdU3DnrXQOvQU/CCHA1tcDQVzOwm91YMYaILjNp7L4Eaw5Z4sOYdbBz6koWyibppd8Zqw=="
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.5.1.tgz",
+      "integrity": "sha512-ekM9KAeG99tYisNBg0IzEywAlp0hYI5XRipsqRXyRTeuU8jcuntilpp+eFf5gaE0xubc9RuSNIVtByEKwqFV0w=="
+    },
+    "leaflet-draw": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/leaflet-draw/-/leaflet-draw-1.0.4.tgz",
+      "integrity": "sha512-rsQ6saQO5ST5Aj6XRFylr5zvarWgzWnrg46zQ1MEOEIHsppdC/8hnN8qMoFvACsPvTioAuysya/TVtog15tyAQ=="
     },
     "less": {
       "version": "3.13.1",
diff --git a/package.json b/package.json
index 4e6724b546a4e12dde2e685826dafdec74c95e30..0d8a5634ff81eb3842fb4c2ce17f89b736a7a8fa 100644
--- a/package.json
+++ b/package.json
@@ -13,7 +13,8 @@
     "@turf/flip": "^6.5.0",
     "axios": "^0.21.1",
     "core-js": "^3.6.5",
-    "leaflet": "^1.7.1",
+    "leaflet": "^1.5.1",
+    "leaflet-draw": "^1.0.4",
     "register-service-worker": "^1.7.1",
     "vue": "^2.6.11",
     "vue-frag": "^1.1.5",
diff --git a/public/resources/leaflet-control-geocoder-1.13.0/Control.Geocoder.js b/public/resources/leaflet-control-geocoder-1.13.0/Control.Geocoder.js
new file mode 100644
index 0000000000000000000000000000000000000000..8d034163a7f91708a037e11e4310aa13f535f481
--- /dev/null
+++ b/public/resources/leaflet-control-geocoder-1.13.0/Control.Geocoder.js
@@ -0,0 +1,1901 @@
+/* @preserve
+ * Leaflet Control Geocoder 1.13.0
+ * https://github.com/perliedman/leaflet-control-geocoder
+ *
+ * Copyright (c) 2012 sa3m (https://github.com/sa3m)
+ * Copyright (c) 2018 Per Liedman
+ * All rights reserved.
+ */
+
+this.L = this.L || {};
+this.L.Control = this.L.Control || {};
+this.L.Control.Geocoder = (function (L) {
+  'use strict';
+
+  L = L && Object.prototype.hasOwnProperty.call(L, 'default') ? L['default'] : L;
+
+  var lastCallbackId = 0;
+
+  // Adapted from handlebars.js
+  // https://github.com/wycats/handlebars.js/
+  var badChars = /[&<>"'`]/g;
+  var possible = /[&<>"'`]/;
+  var escape = {
+    '&': '&amp;',
+    '<': '&lt;',
+    '>': '&gt;',
+    '"': '&quot;',
+    "'": '&#x27;',
+    '`': '&#x60;'
+  };
+
+  function escapeChar(chr) {
+    return escape[chr];
+  }
+
+  function htmlEscape(string) {
+    if (string == null) {
+      return '';
+    } else if (!string) {
+      return string + '';
+    }
+
+    // Force a string conversion as this will be done by the append regardless and
+    // the regex test will do this transparently behind the scenes, causing issues if
+    // an object's to string has escaped characters in it.
+    string = '' + string;
+
+    if (!possible.test(string)) {
+      return string;
+    }
+    return string.replace(badChars, escapeChar);
+  }
+
+  function jsonp(url, params, callback, context, jsonpParam) {
+    var callbackId = '_l_geocoder_' + lastCallbackId++;
+    params[jsonpParam || 'callback'] = callbackId;
+    window[callbackId] = L.Util.bind(callback, context);
+    var script = document.createElement('script');
+    script.type = 'text/javascript';
+    script.src = url + getParamString(params);
+    script.id = callbackId;
+    document.getElementsByTagName('head')[0].appendChild(script);
+  }
+
+  function getJSON(url, params, callback) {
+    var xmlHttp = new XMLHttpRequest();
+    xmlHttp.onreadystatechange = function() {
+      if (xmlHttp.readyState !== 4) {
+        return;
+      }
+      var message;
+      if (xmlHttp.status !== 200 && xmlHttp.status !== 304) {
+        message = '';
+      } else if (typeof xmlHttp.response === 'string') {
+        // IE doesn't parse JSON responses even with responseType: 'json'.
+        try {
+          message = JSON.parse(xmlHttp.response);
+        } catch (e) {
+          // Not a JSON response
+          message = xmlHttp.response;
+        }
+      } else {
+        message = xmlHttp.response;
+      }
+      callback(message);
+    };
+    xmlHttp.open('GET', url + getParamString(params), true);
+    xmlHttp.responseType = 'json';
+    xmlHttp.setRequestHeader('Accept', 'application/json');
+    xmlHttp.send(null);
+  }
+
+  function template(str, data) {
+    return str.replace(/\{ *([\w_]+) *\}/g, function(str, key) {
+      var value = data[key];
+      if (value === undefined) {
+        value = '';
+      } else if (typeof value === 'function') {
+        value = value(data);
+      }
+      return htmlEscape(value);
+    });
+  }
+
+  function getParamString(obj, existingUrl, uppercase) {
+    var params = [];
+    for (var i in obj) {
+      var key = encodeURIComponent(uppercase ? i.toUpperCase() : i);
+      var value = obj[i];
+      if (!L.Util.isArray(value)) {
+        params.push(key + '=' + encodeURIComponent(value));
+      } else {
+        for (var j = 0; j < value.length; j++) {
+          params.push(key + '=' + encodeURIComponent(value[j]));
+        }
+      }
+    }
+    return (!existingUrl || existingUrl.indexOf('?') === -1 ? '?' : '&') + params.join('&');
+  }
+
+  var ArcGis = L.Class.extend({
+    options: {
+      service_url: 'https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer'
+    },
+
+    initialize: function(accessToken, options) {
+      L.setOptions(this, options);
+      this._accessToken = accessToken;
+    },
+
+    geocode: function(query, cb, context) {
+      var params = {
+        SingleLine: query,
+        outFields: 'Addr_Type',
+        forStorage: false,
+        maxLocations: 10,
+        f: 'json'
+      };
+
+      if (this._key && this._key.length) {
+        params.token = this._key;
+      }
+
+      getJSON(
+        this.options.service_url + '/findAddressCandidates',
+        L.extend(params, this.options.geocodingQueryParams),
+        function(data) {
+          var results = [],
+            loc,
+            latLng,
+            latLngBounds;
+
+          if (data.candidates && data.candidates.length) {
+            for (var i = 0; i <= data.candidates.length - 1; i++) {
+              loc = data.candidates[i];
+              latLng = L.latLng(loc.location.y, loc.location.x);
+              latLngBounds = L.latLngBounds(
+                L.latLng(loc.extent.ymax, loc.extent.xmax),
+                L.latLng(loc.extent.ymin, loc.extent.xmin)
+              );
+              results[i] = {
+                name: loc.address,
+                bbox: latLngBounds,
+                center: latLng
+              };
+            }
+          }
+
+          cb.call(context, results);
+        }
+      );
+    },
+
+    suggest: function(query, cb, context) {
+      return this.geocode(query, cb, context);
+    },
+
+    reverse: function(location, scale, cb, context) {
+      var params = {
+        location: encodeURIComponent(location.lng) + ',' + encodeURIComponent(location.lat),
+        distance: 100,
+        f: 'json'
+      };
+
+      getJSON(this.options.service_url + '/reverseGeocode', params, function(data) {
+        var result = [],
+          loc;
+
+        if (data && !data.error) {
+          loc = L.latLng(data.location.y, data.location.x);
+          result.push({
+            name: data.address.Match_addr,
+            center: loc,
+            bounds: L.latLngBounds(loc, loc)
+          });
+        }
+
+        cb.call(context, result);
+      });
+    }
+  });
+
+  function arcgis(accessToken, options) {
+    return new ArcGis(accessToken, options);
+  }
+
+  var Bing = L.Class.extend({
+    initialize: function(key) {
+      this.key = key;
+    },
+
+    geocode: function(query, cb, context) {
+      jsonp(
+        'https://dev.virtualearth.net/REST/v1/Locations',
+        {
+          query: query,
+          key: this.key
+        },
+        function(data) {
+          var results = [];
+          if (data.resourceSets.length > 0) {
+            for (var i = data.resourceSets[0].resources.length - 1; i >= 0; i--) {
+              var resource = data.resourceSets[0].resources[i],
+                bbox = resource.bbox;
+              results[i] = {
+                name: resource.name,
+                bbox: L.latLngBounds([bbox[0], bbox[1]], [bbox[2], bbox[3]]),
+                center: L.latLng(resource.point.coordinates)
+              };
+            }
+          }
+          cb.call(context, results);
+        },
+        this,
+        'jsonp'
+      );
+    },
+
+    reverse: function(location, scale, cb, context) {
+      jsonp(
+        '//dev.virtualearth.net/REST/v1/Locations/' + location.lat + ',' + location.lng,
+        {
+          key: this.key
+        },
+        function(data) {
+          var results = [];
+          for (var i = data.resourceSets[0].resources.length - 1; i >= 0; i--) {
+            var resource = data.resourceSets[0].resources[i],
+              bbox = resource.bbox;
+            results[i] = {
+              name: resource.name,
+              bbox: L.latLngBounds([bbox[0], bbox[1]], [bbox[2], bbox[3]]),
+              center: L.latLng(resource.point.coordinates)
+            };
+          }
+          cb.call(context, results);
+        },
+        this,
+        'jsonp'
+      );
+    }
+  });
+
+  function bing(key) {
+    return new Bing(key);
+  }
+
+  var Google = L.Class.extend({
+    options: {
+      serviceUrl: 'https://maps.googleapis.com/maps/api/geocode/json',
+      geocodingQueryParams: {},
+      reverseQueryParams: {}
+    },
+
+    initialize: function(key, options) {
+      this._key = key;
+      L.setOptions(this, options);
+      // Backwards compatibility
+      this.options.serviceUrl = this.options.service_url || this.options.serviceUrl;
+    },
+
+    geocode: function(query, cb, context) {
+      var params = {
+        address: query
+      };
+
+      if (this._key && this._key.length) {
+        params.key = this._key;
+      }
+
+      params = L.Util.extend(params, this.options.geocodingQueryParams);
+
+      getJSON(this.options.serviceUrl, params, function(data) {
+        var results = [],
+          loc,
+          latLng,
+          latLngBounds;
+        if (data.results && data.results.length) {
+          for (var i = 0; i <= data.results.length - 1; i++) {
+            loc = data.results[i];
+            latLng = L.latLng(loc.geometry.location);
+            latLngBounds = L.latLngBounds(
+              L.latLng(loc.geometry.viewport.northeast),
+              L.latLng(loc.geometry.viewport.southwest)
+            );
+            results[i] = {
+              name: loc.formatted_address,
+              bbox: latLngBounds,
+              center: latLng,
+              properties: loc.address_components
+            };
+          }
+        }
+
+        cb.call(context, results);
+      });
+    },
+
+    reverse: function(location, scale, cb, context) {
+      var params = {
+        latlng: encodeURIComponent(location.lat) + ',' + encodeURIComponent(location.lng)
+      };
+      params = L.Util.extend(params, this.options.reverseQueryParams);
+      if (this._key && this._key.length) {
+        params.key = this._key;
+      }
+
+      getJSON(this.options.serviceUrl, params, function(data) {
+        var results = [],
+          loc,
+          latLng,
+          latLngBounds;
+        if (data.results && data.results.length) {
+          for (var i = 0; i <= data.results.length - 1; i++) {
+            loc = data.results[i];
+            latLng = L.latLng(loc.geometry.location);
+            latLngBounds = L.latLngBounds(
+              L.latLng(loc.geometry.viewport.northeast),
+              L.latLng(loc.geometry.viewport.southwest)
+            );
+            results[i] = {
+              name: loc.formatted_address,
+              bbox: latLngBounds,
+              center: latLng,
+              properties: loc.address_components
+            };
+          }
+        }
+
+        cb.call(context, results);
+      });
+    }
+  });
+
+  function google(key, options) {
+    return new Google(key, options);
+  }
+
+  var HERE = L.Class.extend({
+    options: {
+      geocodeUrl: 'https://geocoder.api.here.com/6.2/geocode.json',
+      reverseGeocodeUrl: 'https://reverse.geocoder.api.here.com/6.2/reversegeocode.json',
+      app_id: '<insert your app_id here>',
+      app_code: '<insert your app_code here>',
+      geocodingQueryParams: {},
+      reverseQueryParams: {},
+      reverseGeocodeProxRadius: null
+    },
+    initialize: function(options) {
+      L.setOptions(this, options);
+    },
+    geocode: function(query, cb, context) {
+      var params = {
+        searchtext: query,
+        gen: 9,
+        app_id: this.options.app_id,
+        app_code: this.options.app_code,
+        jsonattributes: 1
+      };
+      params = L.Util.extend(params, this.options.geocodingQueryParams);
+      this.getJSON(this.options.geocodeUrl, params, cb, context);
+    },
+    reverse: function(location, scale, cb, context) {
+      var _proxRadius = this.options.reverseGeocodeProxRadius
+        ? this.options.reverseGeocodeProxRadius
+        : null;
+      var proxRadius = _proxRadius ? ',' + encodeURIComponent(_proxRadius) : '';
+      var params = {
+        prox: encodeURIComponent(location.lat) + ',' + encodeURIComponent(location.lng) + proxRadius,
+        mode: 'retrieveAddresses',
+        app_id: this.options.app_id,
+        app_code: this.options.app_code,
+        gen: 9,
+        jsonattributes: 1
+      };
+      params = L.Util.extend(params, this.options.reverseQueryParams);
+      this.getJSON(this.options.reverseGeocodeUrl, params, cb, context);
+    },
+    getJSON: function(url, params, cb, context) {
+      getJSON(url, params, function(data) {
+        var results = [],
+          loc,
+          latLng,
+          latLngBounds;
+        if (data.response.view && data.response.view.length) {
+          for (var i = 0; i <= data.response.view[0].result.length - 1; i++) {
+            loc = data.response.view[0].result[i].location;
+            latLng = L.latLng(loc.displayPosition.latitude, loc.displayPosition.longitude);
+            latLngBounds = L.latLngBounds(
+              L.latLng(loc.mapView.topLeft.latitude, loc.mapView.topLeft.longitude),
+              L.latLng(loc.mapView.bottomRight.latitude, loc.mapView.bottomRight.longitude)
+            );
+            results[i] = {
+              name: loc.address.label,
+              properties: loc.address,
+              bbox: latLngBounds,
+              center: latLng
+            };
+          }
+        }
+        cb.call(context, results);
+      });
+    }
+  });
+  function here(options) {
+    return new HERE(options);
+  }
+
+  var LatLng = L.Class.extend({
+    options: {
+      // the next geocoder to use
+      next: undefined,
+      sizeInMeters: 10000
+    },
+
+    initialize: function(options) {
+      L.Util.setOptions(this, options);
+    },
+
+    geocode: function(query, cb, context) {
+      var match;
+      var center;
+      // regex from https://github.com/openstreetmap/openstreetmap-website/blob/master/app/controllers/geocoder_controller.rb
+      if ((match = query.match(/^([NS])\s*(\d{1,3}(?:\.\d*)?)\W*([EW])\s*(\d{1,3}(?:\.\d*)?)$/))) {
+        // [NSEW] decimal degrees
+        center = L.latLng(
+          (/N/i.test(match[1]) ? 1 : -1) * parseFloat(match[2]),
+          (/E/i.test(match[3]) ? 1 : -1) * parseFloat(match[4])
+        );
+      } else if (
+        (match = query.match(/^(\d{1,3}(?:\.\d*)?)\s*([NS])\W*(\d{1,3}(?:\.\d*)?)\s*([EW])$/))
+      ) {
+        // decimal degrees [NSEW]
+        center = L.latLng(
+          (/N/i.test(match[2]) ? 1 : -1) * parseFloat(match[1]),
+          (/E/i.test(match[4]) ? 1 : -1) * parseFloat(match[3])
+        );
+      } else if (
+        (match = query.match(
+          /^([NS])\s*(\d{1,3})°?\s*(\d{1,3}(?:\.\d*)?)?['′]?\W*([EW])\s*(\d{1,3})°?\s*(\d{1,3}(?:\.\d*)?)?['′]?$/
+        ))
+      ) {
+        // [NSEW] degrees, decimal minutes
+        center = L.latLng(
+          (/N/i.test(match[1]) ? 1 : -1) * (parseFloat(match[2]) + parseFloat(match[3] / 60)),
+          (/E/i.test(match[4]) ? 1 : -1) * (parseFloat(match[5]) + parseFloat(match[6] / 60))
+        );
+      } else if (
+        (match = query.match(
+          /^(\d{1,3})°?\s*(\d{1,3}(?:\.\d*)?)?['′]?\s*([NS])\W*(\d{1,3})°?\s*(\d{1,3}(?:\.\d*)?)?['′]?\s*([EW])$/
+        ))
+      ) {
+        // degrees, decimal minutes [NSEW]
+        center = L.latLng(
+          (/N/i.test(match[3]) ? 1 : -1) * (parseFloat(match[1]) + parseFloat(match[2] / 60)),
+          (/E/i.test(match[6]) ? 1 : -1) * (parseFloat(match[4]) + parseFloat(match[5] / 60))
+        );
+      } else if (
+        (match = query.match(
+          /^([NS])\s*(\d{1,3})°?\s*(\d{1,2})['′]?\s*(\d{1,3}(?:\.\d*)?)?["″]?\W*([EW])\s*(\d{1,3})°?\s*(\d{1,2})['′]?\s*(\d{1,3}(?:\.\d*)?)?["″]?$/
+        ))
+      ) {
+        // [NSEW] degrees, minutes, decimal seconds
+        center = L.latLng(
+          (/N/i.test(match[1]) ? 1 : -1) *
+            (parseFloat(match[2]) + parseFloat(match[3] / 60 + parseFloat(match[4] / 3600))),
+          (/E/i.test(match[5]) ? 1 : -1) *
+            (parseFloat(match[6]) + parseFloat(match[7] / 60) + parseFloat(match[8] / 3600))
+        );
+      } else if (
+        (match = query.match(
+          /^(\d{1,3})°?\s*(\d{1,2})['′]?\s*(\d{1,3}(?:\.\d*)?)?["″]\s*([NS])\W*(\d{1,3})°?\s*(\d{1,2})['′]?\s*(\d{1,3}(?:\.\d*)?)?["″]?\s*([EW])$/
+        ))
+      ) {
+        // degrees, minutes, decimal seconds [NSEW]
+        center = L.latLng(
+          (/N/i.test(match[4]) ? 1 : -1) *
+            (parseFloat(match[1]) + parseFloat(match[2] / 60 + parseFloat(match[3] / 3600))),
+          (/E/i.test(match[8]) ? 1 : -1) *
+            (parseFloat(match[5]) + parseFloat(match[6] / 60) + parseFloat(match[7] / 3600))
+        );
+      } else if (
+        (match = query.match(/^\s*([+-]?\d+(?:\.\d*)?)\s*[\s,]\s*([+-]?\d+(?:\.\d*)?)\s*$/))
+      ) {
+        center = L.latLng(parseFloat(match[1]), parseFloat(match[2]));
+      }
+      if (center) {
+        var results = [
+          {
+            name: query,
+            center: center,
+            bbox: center.toBounds(this.options.sizeInMeters)
+          }
+        ];
+        cb.call(context, results);
+      } else if (this.options.next) {
+        this.options.next.geocode(query, cb, context);
+      }
+    }
+  });
+
+  function latLng(options) {
+    return new LatLng(options);
+  }
+
+  var Mapbox = L.Class.extend({
+    options: {
+      serviceUrl: 'https://api.mapbox.com/geocoding/v5/mapbox.places/',
+      geocodingQueryParams: {},
+      reverseQueryParams: {}
+    },
+
+    initialize: function(accessToken, options) {
+      L.setOptions(this, options);
+      this.options.geocodingQueryParams.access_token = accessToken;
+      this.options.reverseQueryParams.access_token = accessToken;
+    },
+
+    geocode: function(query, cb, context) {
+      var params = this.options.geocodingQueryParams;
+      if (
+        params.proximity !== undefined &&
+        params.proximity.lat !== undefined &&
+        params.proximity.lng !== undefined
+      ) {
+        params.proximity = params.proximity.lng + ',' + params.proximity.lat;
+      }
+      getJSON(this.options.serviceUrl + encodeURIComponent(query) + '.json', params, function(data) {
+        var results = [],
+          loc,
+          latLng,
+          latLngBounds;
+        if (data.features && data.features.length) {
+          for (var i = 0; i <= data.features.length - 1; i++) {
+            loc = data.features[i];
+            latLng = L.latLng(loc.center.reverse());
+            if (loc.bbox) {
+              latLngBounds = L.latLngBounds(
+                L.latLng(loc.bbox.slice(0, 2).reverse()),
+                L.latLng(loc.bbox.slice(2, 4).reverse())
+              );
+            } else {
+              latLngBounds = L.latLngBounds(latLng, latLng);
+            }
+
+            var properties = {
+              text: loc.text,
+              address: loc.address
+            };
+
+            for (var j = 0; j < (loc.context || []).length; j++) {
+              var id = loc.context[j].id.split('.')[0];
+              properties[id] = loc.context[j].text;
+
+              // Get country code when available
+              if (loc.context[j].short_code) {
+                properties['countryShortCode'] = loc.context[j].short_code;
+              }
+            }
+
+            results[i] = {
+              name: loc.place_name,
+              bbox: latLngBounds,
+              center: latLng,
+              properties: properties
+            };
+          }
+        }
+
+        cb.call(context, results);
+      });
+    },
+
+    suggest: function(query, cb, context) {
+      return this.geocode(query, cb, context);
+    },
+
+    reverse: function(location, scale, cb, context) {
+      getJSON(
+        this.options.serviceUrl +
+          encodeURIComponent(location.lng) +
+          ',' +
+          encodeURIComponent(location.lat) +
+          '.json',
+        this.options.reverseQueryParams,
+        function(data) {
+          var results = [],
+            loc,
+            latLng,
+            latLngBounds;
+          if (data.features && data.features.length) {
+            for (var i = 0; i <= data.features.length - 1; i++) {
+              loc = data.features[i];
+              latLng = L.latLng(loc.center.reverse());
+              if (loc.bbox) {
+                latLngBounds = L.latLngBounds(
+                  L.latLng(loc.bbox.slice(0, 2).reverse()),
+                  L.latLng(loc.bbox.slice(2, 4).reverse())
+                );
+              } else {
+                latLngBounds = L.latLngBounds(latLng, latLng);
+              }
+              results[i] = {
+                name: loc.place_name,
+                bbox: latLngBounds,
+                center: latLng
+              };
+            }
+          }
+
+          cb.call(context, results);
+        }
+      );
+    }
+  });
+
+  function mapbox(accessToken, options) {
+    return new Mapbox(accessToken, options);
+  }
+
+  var MapQuest = L.Class.extend({
+    options: {
+      serviceUrl: 'https://www.mapquestapi.com/geocoding/v1'
+    },
+
+    initialize: function(key, options) {
+      // MapQuest seems to provide URI encoded API keys,
+      // so to avoid encoding them twice, we decode them here
+      this._key = decodeURIComponent(key);
+
+      L.Util.setOptions(this, options);
+    },
+
+    _formatName: function() {
+      var r = [],
+        i;
+      for (i = 0; i < arguments.length; i++) {
+        if (arguments[i]) {
+          r.push(arguments[i]);
+        }
+      }
+
+      return r.join(', ');
+    },
+
+    geocode: function(query, cb, context) {
+      getJSON(
+        this.options.serviceUrl + '/address',
+        {
+          key: this._key,
+          location: query,
+          limit: 5,
+          outFormat: 'json'
+        },
+        L.bind(function(data) {
+          var results = [],
+            loc,
+            latLng;
+          if (data.results && data.results[0].locations) {
+            for (var i = data.results[0].locations.length - 1; i >= 0; i--) {
+              loc = data.results[0].locations[i];
+              latLng = L.latLng(loc.latLng);
+              results[i] = {
+                name: this._formatName(loc.street, loc.adminArea4, loc.adminArea3, loc.adminArea1),
+                bbox: L.latLngBounds(latLng, latLng),
+                center: latLng
+              };
+            }
+          }
+
+          cb.call(context, results);
+        }, this)
+      );
+    },
+
+    reverse: function(location, scale, cb, context) {
+      getJSON(
+        this.options.serviceUrl + '/reverse',
+        {
+          key: this._key,
+          location: location.lat + ',' + location.lng,
+          outputFormat: 'json'
+        },
+        L.bind(function(data) {
+          var results = [],
+            loc,
+            latLng;
+          if (data.results && data.results[0].locations) {
+            for (var i = data.results[0].locations.length - 1; i >= 0; i--) {
+              loc = data.results[0].locations[i];
+              latLng = L.latLng(loc.latLng);
+              results[i] = {
+                name: this._formatName(loc.street, loc.adminArea4, loc.adminArea3, loc.adminArea1),
+                bbox: L.latLngBounds(latLng, latLng),
+                center: latLng
+              };
+            }
+          }
+
+          cb.call(context, results);
+        }, this)
+      );
+    }
+  });
+
+  function mapQuest(key, options) {
+    return new MapQuest(key, options);
+  }
+
+  var Neutrino = L.Class.extend({
+    options: {
+      userId: '<insert your userId here>',
+      apiKey: '<insert your apiKey here>',
+      serviceUrl: 'https://neutrinoapi.com/'
+    },
+
+    initialize: function(options) {
+      L.Util.setOptions(this, options);
+    },
+
+    // https://www.neutrinoapi.com/api/geocode-address/
+    geocode: function(query, cb, context) {
+      getJSON(
+        this.options.serviceUrl + 'geocode-address',
+        {
+          apiKey: this.options.apiKey,
+          userId: this.options.userId,
+          //get three words and make a dot based string
+          address: query.split(/\s+/).join('.')
+        },
+        function(data) {
+          var results = [],
+            latLng,
+            latLngBounds;
+          if (data.locations) {
+            data.geometry = data.locations[0];
+            latLng = L.latLng(data.geometry['latitude'], data.geometry['longitude']);
+            latLngBounds = L.latLngBounds(latLng, latLng);
+            results[0] = {
+              name: data.geometry.address,
+              bbox: latLngBounds,
+              center: latLng
+            };
+          }
+
+          cb.call(context, results);
+        }
+      );
+    },
+
+    suggest: function(query, cb, context) {
+      return this.geocode(query, cb, context);
+    },
+
+    // https://www.neutrinoapi.com/api/geocode-reverse/
+    reverse: function(location, scale, cb, context) {
+      getJSON(
+        this.options.serviceUrl + 'geocode-reverse',
+        {
+          apiKey: this.options.apiKey,
+          userId: this.options.userId,
+          latitude: location.lat,
+          longitude: location.lng
+        },
+        function(data) {
+          var results = [],
+            latLng,
+            latLngBounds;
+          if (data.status.status == 200 && data.found) {
+            latLng = L.latLng(location.lat, location.lng);
+            latLngBounds = L.latLngBounds(latLng, latLng);
+            results[0] = {
+              name: data.address,
+              bbox: latLngBounds,
+              center: latLng
+            };
+          }
+          cb.call(context, results);
+        }
+      );
+    }
+  });
+
+  function neutrino(accessToken) {
+    return new Neutrino(accessToken);
+  }
+
+  var Nominatim = L.Class.extend({
+    options: {
+      serviceUrl: 'https://nominatim.openstreetmap.org/',
+      geocodingQueryParams: {},
+      reverseQueryParams: {},
+      htmlTemplate: function(r) {
+        var a = r.address,
+          className,
+          parts = [];
+        if (a.road || a.building) {
+          parts.push('{building} {road} {house_number}');
+        }
+
+        if (a.city || a.town || a.village || a.hamlet) {
+          className = parts.length > 0 ? 'leaflet-control-geocoder-address-detail' : '';
+          parts.push(
+            '<span class="' + className + '">{postcode} {city} {town} {village} {hamlet}</span>'
+          );
+        }
+
+        if (a.state || a.country) {
+          className = parts.length > 0 ? 'leaflet-control-geocoder-address-context' : '';
+          parts.push('<span class="' + className + '">{state} {country}</span>');
+        }
+
+        return template(parts.join('<br/>'), a);
+      }
+    },
+
+    initialize: function(options) {
+      L.Util.setOptions(this, options);
+    },
+
+    geocode: function(query, cb, context) {
+      getJSON(
+        this.options.serviceUrl + 'search',
+        L.extend(
+          {
+            q: query,
+            limit: 5,
+            format: 'json',
+            addressdetails: 1
+          },
+          this.options.geocodingQueryParams
+        ),
+        L.bind(function(data) {
+          var results = [];
+          for (var i = data.length - 1; i >= 0; i--) {
+            var bbox = data[i].boundingbox;
+            for (var j = 0; j < 4; j++) bbox[j] = parseFloat(bbox[j]);
+            results[i] = {
+              icon: data[i].icon,
+              name: data[i].display_name,
+              html: this.options.htmlTemplate ? this.options.htmlTemplate(data[i]) : undefined,
+              bbox: L.latLngBounds([bbox[0], bbox[2]], [bbox[1], bbox[3]]),
+              center: L.latLng(data[i].lat, data[i].lon),
+              properties: data[i]
+            };
+          }
+          cb.call(context, results);
+        }, this)
+      );
+    },
+
+    suggest: function (query, cb, context) {
+      return this.geocode(query, cb, context);
+  },
+
+    reverse: function(location, scale, cb, context) {
+      getJSON(
+        this.options.serviceUrl + 'reverse',
+        L.extend(
+          {
+            lat: location.lat,
+            lon: location.lng,
+            zoom: Math.round(Math.log(scale / 256) / Math.log(2)),
+            addressdetails: 1,
+            format: 'json'
+          },
+          this.options.reverseQueryParams
+        ),
+        L.bind(function(data) {
+          var result = [],
+            loc;
+
+          if (data && data.lat && data.lon) {
+            loc = L.latLng(data.lat, data.lon);
+            result.push({
+              name: data.display_name,
+              html: this.options.htmlTemplate ? this.options.htmlTemplate(data) : undefined,
+              center: loc,
+              bounds: L.latLngBounds(loc, loc),
+              properties: data
+            });
+          }
+
+          cb.call(context, result);
+        }, this)
+      );
+    }
+  });
+
+  function nominatim(options) {
+    return new Nominatim(options);
+  }
+
+  var OpenLocationCode = L.Class.extend({
+    options: {
+      OpenLocationCode: undefined,
+      codeLength: undefined
+    },
+
+    initialize: function(options) {
+      L.setOptions(this, options);
+    },
+
+    geocode: function(query, cb, context) {
+      try {
+        var decoded = this.options.OpenLocationCode.decode(query);
+        var result = {
+          name: query,
+          center: L.latLng(decoded.latitudeCenter, decoded.longitudeCenter),
+          bbox: L.latLngBounds(
+            L.latLng(decoded.latitudeLo, decoded.longitudeLo),
+            L.latLng(decoded.latitudeHi, decoded.longitudeHi)
+          )
+        };
+        cb.call(context, [result]);
+      } catch (e) {
+        console.warn(e); // eslint-disable-line no-console
+        cb.call(context, []);
+      }
+    },
+    reverse: function(location, scale, cb, context) {
+      try {
+        var code = this.options.OpenLocationCode.encode(
+          location.lat,
+          location.lng,
+          this.options.codeLength
+        );
+        var result = {
+          name: code,
+          center: L.latLng(location.lat, location.lng),
+          bbox: L.latLngBounds(
+            L.latLng(location.lat, location.lng),
+            L.latLng(location.lat, location.lng)
+          )
+        };
+        cb.call(context, [result]);
+      } catch (e) {
+        console.warn(e); // eslint-disable-line no-console
+        cb.call(context, []);
+      }
+    }
+  });
+
+  function openLocationCode(options) {
+    return new OpenLocationCode(options);
+  }
+
+  var OpenCage = L.Class.extend({
+    options: {
+      serviceUrl: 'https://api.opencagedata.com/geocode/v1/json',
+      geocodingQueryParams: {},
+      reverseQueryParams: {}
+    },
+
+    initialize: function(apiKey, options) {
+      L.setOptions(this, options);
+      this._accessToken = apiKey;
+    },
+
+    geocode: function(query, cb, context) {
+      var params = {
+        key: this._accessToken,
+        q: query
+      };
+      params = L.extend(params, this.options.geocodingQueryParams);
+      getJSON(this.options.serviceUrl, params, function(data) {
+        var results = [],
+          latLng,
+          latLngBounds,
+          loc;
+        if (data.results && data.results.length) {
+          for (var i = 0; i < data.results.length; i++) {
+            loc = data.results[i];
+            latLng = L.latLng(loc.geometry);
+            if (loc.annotations && loc.annotations.bounds) {
+              latLngBounds = L.latLngBounds(
+                L.latLng(loc.annotations.bounds.northeast),
+                L.latLng(loc.annotations.bounds.southwest)
+              );
+            } else {
+              latLngBounds = L.latLngBounds(latLng, latLng);
+            }
+            results.push({
+              name: loc.formatted,
+              bbox: latLngBounds,
+              center: latLng
+            });
+          }
+        }
+        cb.call(context, results);
+      });
+    },
+
+    suggest: function(query, cb, context) {
+      return this.geocode(query, cb, context);
+    },
+
+    reverse: function(location, scale, cb, context) {
+      var params = {
+        key: this._accessToken,
+        q: [location.lat, location.lng].join(',')
+      };
+      params = L.extend(params, this.options.reverseQueryParams);
+      getJSON(this.options.serviceUrl, params, function(data) {
+        var results = [],
+          latLng,
+          latLngBounds,
+          loc;
+        if (data.results && data.results.length) {
+          for (var i = 0; i < data.results.length; i++) {
+            loc = data.results[i];
+            latLng = L.latLng(loc.geometry);
+            if (loc.annotations && loc.annotations.bounds) {
+              latLngBounds = L.latLngBounds(
+                L.latLng(loc.annotations.bounds.northeast),
+                L.latLng(loc.annotations.bounds.southwest)
+              );
+            } else {
+              latLngBounds = L.latLngBounds(latLng, latLng);
+            }
+            results.push({
+              name: loc.formatted,
+              bbox: latLngBounds,
+              center: latLng
+            });
+          }
+        }
+        cb.call(context, results);
+      });
+    }
+  });
+
+  function opencage(apiKey, options) {
+    return new OpenCage(apiKey, options);
+  }
+
+  var Pelias = L.Class.extend({
+    options: {
+      serviceUrl: 'https://api.geocode.earth/v1',
+      geocodingQueryParams: {},
+      reverseQueryParams: {}
+    },
+
+    initialize: function(apiKey, options) {
+      L.Util.setOptions(this, options);
+      this._apiKey = apiKey;
+      this._lastSuggest = 0;
+    },
+
+    geocode: function(query, cb, context) {
+      var _this = this;
+      getJSON(
+        this.options.serviceUrl + '/search',
+        L.extend(
+          {
+            api_key: this._apiKey,
+            text: query
+          },
+          this.options.geocodingQueryParams
+        ),
+        function(data) {
+          cb.call(context, _this._parseResults(data, 'bbox'));
+        }
+      );
+    },
+
+    suggest: function(query, cb, context) {
+      var _this = this;
+      getJSON(
+        this.options.serviceUrl + '/autocomplete',
+        L.extend(
+          {
+            api_key: this._apiKey,
+            text: query
+          },
+          this.options.geocodingQueryParams
+        ),
+        L.bind(function(data) {
+          if (data.geocoding.timestamp > this._lastSuggest) {
+            this._lastSuggest = data.geocoding.timestamp;
+            cb.call(context, _this._parseResults(data, 'bbox'));
+          }
+        }, this)
+      );
+    },
+
+    reverse: function(location, scale, cb, context) {
+      var _this = this;
+      getJSON(
+        this.options.serviceUrl + '/reverse',
+        L.extend(
+          {
+            api_key: this._apiKey,
+            'point.lat': location.lat,
+            'point.lon': location.lng
+          },
+          this.options.reverseQueryParams
+        ),
+        function(data) {
+          cb.call(context, _this._parseResults(data, 'bounds'));
+        }
+      );
+    },
+
+    _parseResults: function(data, bboxname) {
+      var results = [];
+      L.geoJson(data, {
+        pointToLayer: function(feature, latlng) {
+          return L.circleMarker(latlng);
+        },
+        onEachFeature: function(feature, layer) {
+          var result = {},
+            bbox,
+            center;
+
+          if (layer.getBounds) {
+            bbox = layer.getBounds();
+            center = bbox.getCenter();
+          } else if (layer.feature.bbox) {
+            center = layer.getLatLng();
+            bbox = L.latLngBounds(
+              L.GeoJSON.coordsToLatLng(layer.feature.bbox.slice(0, 2)),
+              L.GeoJSON.coordsToLatLng(layer.feature.bbox.slice(2, 4))
+            );
+          } else {
+            center = layer.getLatLng();
+            bbox = L.latLngBounds(center, center);
+          }
+
+          result.name = layer.feature.properties.label;
+          result.center = center;
+          result[bboxname] = bbox;
+          result.properties = layer.feature.properties;
+          results.push(result);
+        }
+      });
+      return results;
+    }
+  });
+
+  function pelias(apiKey, options) {
+    return new Pelias(apiKey, options);
+  }
+  var GeocodeEarth = Pelias;
+  var geocodeEarth = pelias;
+
+  var Mapzen = Pelias; // r.i.p.
+  var mapzen = pelias;
+
+  var Openrouteservice = Mapzen.extend({
+    options: {
+      serviceUrl: 'https://api.openrouteservice.org/geocode'
+    }
+  });
+  function openrouteservice(apiKey, options) {
+    return new Openrouteservice(apiKey, options);
+  }
+
+  var Photon = L.Class.extend({
+    options: {
+      serviceUrl: 'https://photon.komoot.de/api/',
+      reverseUrl: 'https://photon.komoot.de/reverse/',
+      nameProperties: ['name', 'street', 'suburb', 'hamlet', 'town', 'city', 'state', 'country']
+    },
+
+    initialize: function(options) {
+      L.setOptions(this, options);
+    },
+
+    geocode: function(query, cb, context) {
+      var params = L.extend(
+        {
+          q: query
+        },
+        this.options.geocodingQueryParams
+      );
+
+      getJSON(
+        this.options.serviceUrl,
+        params,
+        L.bind(function(data) {
+          cb.call(context, this._decodeFeatures(data));
+        }, this)
+      );
+    },
+
+    suggest: function(query, cb, context) {
+      return this.geocode(query, cb, context);
+    },
+
+    reverse: function(latLng, scale, cb, context) {
+      var params = L.extend(
+        {
+          lat: latLng.lat,
+          lon: latLng.lng
+        },
+        this.options.reverseQueryParams
+      );
+
+      getJSON(
+        this.options.reverseUrl,
+        params,
+        L.bind(function(data) {
+          cb.call(context, this._decodeFeatures(data));
+        }, this)
+      );
+    },
+
+    _decodeFeatures: function(data) {
+      var results = [],
+        i,
+        f,
+        c,
+        latLng,
+        extent,
+        bbox;
+
+      if (data && data.features) {
+        for (i = 0; i < data.features.length; i++) {
+          f = data.features[i];
+          c = f.geometry.coordinates;
+          latLng = L.latLng(c[1], c[0]);
+          extent = f.properties.extent;
+
+          if (extent) {
+            bbox = L.latLngBounds([extent[1], extent[0]], [extent[3], extent[2]]);
+          } else {
+            bbox = L.latLngBounds(latLng, latLng);
+          }
+
+          results.push({
+            name: this._decodeFeatureName(f),
+            html: this.options.htmlTemplate ? this.options.htmlTemplate(f) : undefined,
+            center: latLng,
+            bbox: bbox,
+            properties: f.properties
+          });
+        }
+      }
+
+      return results;
+    },
+
+    _decodeFeatureName: function(f) {
+      return (this.options.nameProperties || [])
+        .map(function(p) {
+          return f.properties[p];
+        })
+        .filter(function(v) {
+          return !!v;
+        })
+        .join(', ');
+    }
+  });
+
+  function photon(options) {
+    return new Photon(options);
+  }
+
+  const TYPE_LABEL = {
+      housenumber: 'Numéro',
+      street: 'Rue',
+      locality: 'Lieux-dit',
+      municipality: 'Commune',
+  };
+
+  var AddOk = L.Class.extend({
+      options: {
+          serviceUrl: 'https://api-adresse.data.gouv.fr',
+          limit: 5,
+          htmlTemplate: function (r) {
+              var parts = [];
+
+  			/* some available classes:
+  				leaflet-control-geocoder-address-detail
+  				leaflet-control-geocoder-address-context
+  			*/
+              parts.push('<span class="leaflet-control-geocoder-address-item"> {label} </span>({type})<span>' + '</span>');
+              parts.push('<span class="' + (parts.length > 0 ? 'leaflet-control-geocoder-address-detail' : '') +
+                  '">{context}</span>');
+
+              return template(parts.join('<br/>'), r);
+          }
+
+      },
+
+      initialize: function (options) {
+          L.setOptions(this, options);
+      },
+
+      geocode: function (query, cb, context) {
+
+          var params = L.extend({
+              q: query,
+              limit: this.options.limit
+          }, this.options.geocodingQueryParams);
+          var that = this;
+
+          getJSON(this.options.serviceUrl + '/search/', params, function (data) {
+              var results = [],
+                  i,
+                  f,
+                  c,
+                  latLng,
+                  extent,
+                  bbox;
+              if (data && data.features) {
+                  for (i = 0; i < data.features.length; i++) {
+                      f = data.features[i];
+                      c = f.geometry.coordinates;
+                      latLng = L.latLng(c[1], c[0]);
+                      extent = f.properties.extent;
+
+                      if (extent) {
+                          bbox = L.latLngBounds([extent[1], extent[0]], [extent[3], extent[2]]);
+                      } else {
+                          bbox = L.latLngBounds(latLng, latLng);
+                      }
+                      
+                      // Translate the type in french
+                      if (f.properties.type) {
+                          f.properties.type = TYPE_LABEL[f.properties.type];
+                      }
+                      
+                      results.push({
+                          name: f.properties.name,
+                          center: latLng,
+                          bbox: bbox,
+                          html: that.options.htmlTemplate ?
+                              that.options.htmlTemplate(f.properties)
+                              : undefined
+                      });
+                  }
+              }
+
+              cb.call(context, results);
+          });
+      },
+
+      suggest: function (query, cb, context) {
+          return this.geocode(query, cb, context);
+      },
+
+      reverse: function (location, scale, cb, context) {
+          var params = L.extend({
+              lat: location.lat,
+              lon: location.lng
+          }, this.options.reverseQueryParams);
+          var that = this;
+          getJSON(this.options.serviceUrl + '/reverse/', params, function (data) {
+              var results = [],
+                  i,
+                  f,
+                  c,
+                  latLng,
+                  extent,
+                  bbox;
+              if (data && data.features) {
+                  for (i = 0; i < data.features.length; i++) {
+                      f = data.features[i];
+                      c = f.geometry.coordinates;
+                      latLng = L.latLng(c[1], c[0]);
+                      extent = f.properties.extent;
+
+                      if (extent) {
+                          bbox = L.latLngBounds([extent[1], extent[0]], [extent[3], extent[2]]);
+                      } else {
+                          bbox = L.latLngBounds(latLng, latLng);
+                      }
+
+                      results.push({
+                          name: f.properties.name,
+                          center: latLng,
+                          bbox: bbox,
+                          html: that.options.htmlTemplate ?
+                              that.options.htmlTemplate(f.properties)
+                              : undefined
+                      });
+                  }
+              }
+
+              cb.call(context, results);
+          });
+      }
+  });
+
+
+  function addok(key) {
+      return new AddOk(key);
+  }
+
+  var What3Words = L.Class.extend({
+    options: {
+      serviceUrl: 'https://api.what3words.com/v2/'
+    },
+
+    initialize: function(accessToken) {
+      this._accessToken = accessToken;
+    },
+
+    geocode: function(query, cb, context) {
+      //get three words and make a dot based string
+      getJSON(
+        this.options.serviceUrl + 'forward',
+        {
+          key: this._accessToken,
+          addr: query.split(/\s+/).join('.')
+        },
+        function(data) {
+          var results = [],
+            latLng,
+            latLngBounds;
+          if (data.geometry) {
+            latLng = L.latLng(data.geometry['lat'], data.geometry['lng']);
+            latLngBounds = L.latLngBounds(latLng, latLng);
+            results[0] = {
+              name: data.words,
+              bbox: latLngBounds,
+              center: latLng
+            };
+          }
+
+          cb.call(context, results);
+        }
+      );
+    },
+
+    suggest: function(query, cb, context) {
+      return this.geocode(query, cb, context);
+    },
+
+    reverse: function(location, scale, cb, context) {
+      getJSON(
+        this.options.serviceUrl + 'reverse',
+        {
+          key: this._accessToken,
+          coords: [location.lat, location.lng].join(',')
+        },
+        function(data) {
+          var results = [],
+            latLng,
+            latLngBounds;
+          if (data.status.status == 200) {
+            latLng = L.latLng(data.geometry['lat'], data.geometry['lng']);
+            latLngBounds = L.latLngBounds(latLng, latLng);
+            results[0] = {
+              name: data.words,
+              bbox: latLngBounds,
+              center: latLng
+            };
+          }
+          cb.call(context, results);
+        }
+      );
+    }
+  });
+
+  function what3words(accessToken) {
+    return new What3Words(accessToken);
+  }
+
+  var geocoders = /*#__PURE__*/Object.freeze({
+    __proto__: null,
+    ArcGis: ArcGis,
+    arcgis: arcgis,
+    Bing: Bing,
+    bing: bing,
+    Google: Google,
+    google: google,
+    HERE: HERE,
+    here: here,
+    LatLng: LatLng,
+    latLng: latLng,
+    Mapbox: Mapbox,
+    mapbox: mapbox,
+    MapQuest: MapQuest,
+    mapQuest: mapQuest,
+    Neutrino: Neutrino,
+    neutrino: neutrino,
+    Nominatim: Nominatim,
+    nominatim: nominatim,
+    OpenLocationCode: OpenLocationCode,
+    openLocationCode: openLocationCode,
+    OpenCage: OpenCage,
+    opencage: opencage,
+    Pelias: Pelias,
+    pelias: pelias,
+    GeocodeEarth: GeocodeEarth,
+    geocodeEarth: geocodeEarth,
+    Mapzen: Mapzen,
+    mapzen: mapzen,
+    Openrouteservice: Openrouteservice,
+    openrouteservice: openrouteservice,
+    Photon: Photon,
+    photon: photon,
+    AddOk: AddOk,
+    addok: addok,
+    What3Words: What3Words,
+    what3words: what3words
+  });
+
+  var Geocoder = L.Control.extend({
+    options: {
+      showUniqueResult: true,
+      showResultIcons: false,
+      collapsed: true,
+      expand: 'touch', // options: touch, click, anythingelse
+      position: 'topright',
+      placeholder: 'Search...',
+      errorMessage: 'Nothing found.',
+      iconLabel: 'Initiate a new search',
+      queryMinLength: 1,
+      suggestMinLength: 3,
+      suggestTimeout: 250,
+      defaultMarkGeocode: true
+    },
+
+    includes: L.Evented.prototype || L.Mixin.Events,
+
+    initialize: function(options) {
+      L.Util.setOptions(this, options);
+      if (!this.options.geocoder) {
+        this.options.geocoder = new Nominatim();
+      }
+
+      this._requestCount = 0;
+    },
+
+    addThrobberClass: function() {
+      L.DomUtil.addClass(this._container, 'leaflet-control-geocoder-throbber');
+    },
+
+    removeThrobberClass: function() {
+      L.DomUtil.removeClass(this._container, 'leaflet-control-geocoder-throbber');
+    },
+
+    onAdd: function(map) {
+      var className = 'leaflet-control-geocoder',
+        container = L.DomUtil.create('div', className + ' leaflet-bar'),
+        icon = L.DomUtil.create('button', className + '-icon', container),
+        form = (this._form = L.DomUtil.create('div', className + '-form', container)),
+        input;
+
+      this._map = map;
+      this._container = container;
+
+      icon.innerHTML = '&nbsp;';
+      icon.type = 'button';
+      icon.setAttribute('aria-label', this.options.iconLabel);
+
+      input = this._input = L.DomUtil.create('input', '', form);
+      input.type = 'text';
+      input.value = this.options.query || '';
+      input.placeholder = this.options.placeholder;
+      L.DomEvent.disableClickPropagation(input);
+
+      this._errorElement = L.DomUtil.create('div', className + '-form-no-error', container);
+      this._errorElement.innerHTML = this.options.errorMessage;
+
+      this._alts = L.DomUtil.create(
+        'ul',
+        className + '-alternatives leaflet-control-geocoder-alternatives-minimized',
+        container
+      );
+      L.DomEvent.disableClickPropagation(this._alts);
+
+      L.DomEvent.addListener(input, 'keydown', this._keydown, this);
+      if (this.options.geocoder.suggest) {
+        L.DomEvent.addListener(input, 'input', this._change, this);
+      }
+      L.DomEvent.addListener(
+        input,
+        'blur',
+        function() {
+          if (this.options.collapsed && !this._preventBlurCollapse) {
+            this._collapse();
+          }
+          this._preventBlurCollapse = false;
+        },
+        this
+      );
+
+      if (this.options.collapsed) {
+        if (this.options.expand === 'click') {
+          L.DomEvent.addListener(
+            container,
+            'click',
+            function(e) {
+              if (e.button === 0 && e.detail !== 2) {
+                this._toggle();
+              }
+            },
+            this
+          );
+        } else if (this.options.expand === 'touch') {
+          L.DomEvent.addListener(
+            container,
+            L.Browser.touch ? 'touchstart mousedown' : 'mousedown',
+            function(e) {
+              this._toggle();
+              e.preventDefault(); // mobile: clicking focuses the icon, so UI expands and immediately collapses
+              e.stopPropagation();
+            },
+            this
+          );
+        } else {
+          L.DomEvent.addListener(container, 'mouseover', this._expand, this);
+          L.DomEvent.addListener(container, 'mouseout', this._collapse, this);
+          this._map.on('movestart', this._collapse, this);
+        }
+      } else {
+        this._expand();
+        if (L.Browser.touch) {
+          L.DomEvent.addListener(
+            container,
+            'touchstart',
+            function() {
+              this._geocode();
+            },
+            this
+          );
+        } else {
+          L.DomEvent.addListener(
+            container,
+            'click',
+            function() {
+              this._geocode();
+            },
+            this
+          );
+        }
+      }
+
+      if (this.options.defaultMarkGeocode) {
+        this.on('markgeocode', this.markGeocode, this);
+      }
+
+      this.on('startgeocode', this.addThrobberClass, this);
+      this.on('finishgeocode', this.removeThrobberClass, this);
+      this.on('startsuggest', this.addThrobberClass, this);
+      this.on('finishsuggest', this.removeThrobberClass, this);
+
+      L.DomEvent.disableClickPropagation(container);
+
+      return container;
+    },
+
+    setQuery: function(string) {
+      this._input.value = string;
+      return this;
+    },
+
+    _geocodeResult: function(results, suggest) {
+      if (!suggest && this.options.showUniqueResult && results.length === 1) {
+        this._geocodeResultSelected(results[0]);
+      } else if (results.length > 0) {
+        this._alts.innerHTML = '';
+        this._results = results;
+        L.DomUtil.removeClass(this._alts, 'leaflet-control-geocoder-alternatives-minimized');
+        L.DomUtil.addClass(this._container, 'leaflet-control-geocoder-options-open');
+        for (var i = 0; i < results.length; i++) {
+          this._alts.appendChild(this._createAlt(results[i], i));
+        }
+      } else {
+        L.DomUtil.addClass(this._container, 'leaflet-control-geocoder-options-error');
+        L.DomUtil.addClass(this._errorElement, 'leaflet-control-geocoder-error');
+      }
+    },
+
+    markGeocode: function(result) {
+      result = result.geocode || result;
+
+      this._map.fitBounds(result.bbox);
+
+      if (this._geocodeMarker) {
+        this._map.removeLayer(this._geocodeMarker);
+      }
+
+      this._geocodeMarker = new L.Marker(result.center)
+        .bindPopup(result.html || result.name)
+        .addTo(this._map)
+        .openPopup();
+
+      return this;
+    },
+
+    _geocode: function(suggest) {
+      var value = this._input.value;
+      if (!suggest && value.length < this.options.queryMinLength) {
+        return;
+      }
+
+      var requestCount = ++this._requestCount,
+        mode = suggest ? 'suggest' : 'geocode',
+        eventData = { input: value };
+
+      this._lastGeocode = value;
+      if (!suggest) {
+        this._clearResults();
+      }
+
+      this.fire('start' + mode, eventData);
+      this.options.geocoder[mode](
+        value,
+        function(results) {
+          if (requestCount === this._requestCount) {
+            eventData.results = results;
+            this.fire('finish' + mode, eventData);
+            this._geocodeResult(results, suggest);
+          }
+        },
+        this
+      );
+    },
+
+    _geocodeResultSelected: function(result) {
+      this.fire('markgeocode', { geocode: result });
+    },
+
+    _toggle: function() {
+      if (L.DomUtil.hasClass(this._container, 'leaflet-control-geocoder-expanded')) {
+        this._collapse();
+      } else {
+        this._expand();
+      }
+    },
+
+    _expand: function() {
+      L.DomUtil.addClass(this._container, 'leaflet-control-geocoder-expanded');
+      this._input.select();
+      this.fire('expand');
+    },
+
+    _collapse: function() {
+      L.DomUtil.removeClass(this._container, 'leaflet-control-geocoder-expanded');
+      L.DomUtil.addClass(this._alts, 'leaflet-control-geocoder-alternatives-minimized');
+      L.DomUtil.removeClass(this._errorElement, 'leaflet-control-geocoder-error');
+      L.DomUtil.removeClass(this._container, 'leaflet-control-geocoder-options-open');
+      L.DomUtil.removeClass(this._container, 'leaflet-control-geocoder-options-error');
+      this._input.blur(); // mobile: keyboard shouldn't stay expanded
+      this.fire('collapse');
+    },
+
+    _clearResults: function() {
+      L.DomUtil.addClass(this._alts, 'leaflet-control-geocoder-alternatives-minimized');
+      this._selection = null;
+      L.DomUtil.removeClass(this._errorElement, 'leaflet-control-geocoder-error');
+      L.DomUtil.removeClass(this._container, 'leaflet-control-geocoder-options-open');
+      L.DomUtil.removeClass(this._container, 'leaflet-control-geocoder-options-error');
+    },
+
+    _createAlt: function(result, index) {
+      var li = L.DomUtil.create('li', ''),
+        a = L.DomUtil.create('a', '', li),
+        icon = this.options.showResultIcons && result.icon ? L.DomUtil.create('img', '', a) : null,
+        text = result.html ? undefined : document.createTextNode(result.name),
+        mouseDownHandler = function mouseDownHandler(e) {
+          // In some browsers, a click will fire on the map if the control is
+          // collapsed directly after mousedown. To work around this, we
+          // wait until the click is completed, and _then_ collapse the
+          // control. Messy, but this is the workaround I could come up with
+          // for #142.
+          this._preventBlurCollapse = true;
+          L.DomEvent.stop(e);
+          this._geocodeResultSelected(result);
+          L.DomEvent.on(
+            li,
+            'click touchend',
+            function() {
+              if (this.options.collapsed) {
+                this._collapse();
+              } else {
+                this._clearResults();
+              }
+            },
+            this
+          );
+        };
+
+      if (icon) {
+        icon.src = result.icon;
+      }
+
+      li.setAttribute('data-result-index', index);
+
+      if (result.html) {
+        a.innerHTML = a.innerHTML + result.html;
+      } else {
+        a.appendChild(text);
+      }
+
+      // Use mousedown and not click, since click will fire _after_ blur,
+      // causing the control to have collapsed and removed the items
+      // before the click can fire.
+      L.DomEvent.addListener(li, 'mousedown touchstart', mouseDownHandler, this);
+
+      return li;
+    },
+
+    _keydown: function(e) {
+      var _this = this,
+        select = function select(dir) {
+          if (_this._selection) {
+            L.DomUtil.removeClass(_this._selection, 'leaflet-control-geocoder-selected');
+            _this._selection = _this._selection[dir > 0 ? 'nextSibling' : 'previousSibling'];
+          }
+          if (!_this._selection) {
+            _this._selection = _this._alts[dir > 0 ? 'firstChild' : 'lastChild'];
+          }
+
+          if (_this._selection) {
+            L.DomUtil.addClass(_this._selection, 'leaflet-control-geocoder-selected');
+          }
+        };
+
+      switch (e.keyCode) {
+        // Escape
+        case 27:
+          if (this.options.collapsed) {
+            this._collapse();
+          } else {
+            this._clearResults();
+          }
+          break;
+        // Up
+        case 38:
+          select(-1);
+          break;
+        // Up
+        case 40:
+          select(1);
+          break;
+        // Enter
+        case 13:
+          if (this._selection) {
+            var index = parseInt(this._selection.getAttribute('data-result-index'), 10);
+            this._geocodeResultSelected(this._results[index]);
+            this._clearResults();
+          } else {
+            this._geocode();
+          }
+          break;
+        default:
+          return;
+      }
+
+      L.DomEvent.preventDefault(e);
+    },
+    _change: function() {
+      var v = this._input.value;
+      if (v !== this._lastGeocode) {
+        clearTimeout(this._suggestTimeout);
+        if (v.length >= this.options.suggestMinLength) {
+          this._suggestTimeout = setTimeout(
+            L.bind(function() {
+              this._geocode(true);
+            }, this),
+            this.options.suggestTimeout
+          );
+        } else {
+          this._clearResults();
+        }
+      }
+    }
+  });
+
+  function geocoder(options) {
+    return new Geocoder(options);
+  }
+
+  L.Util.extend(Geocoder, geocoders);
+
+  L.Util.extend(L.Control, {
+    Geocoder: Geocoder,
+    geocoder: geocoder
+  });
+
+  return Geocoder;
+
+}(L));
+//# sourceMappingURL=Control.Geocoder.js.map
diff --git a/public/resources/leaflet-control-geocoder-1.13.0/Control.Geocoder.js.map b/public/resources/leaflet-control-geocoder-1.13.0/Control.Geocoder.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..3effabd8f45e9b41c32d93241960bb39ea0150ac
--- /dev/null
+++ b/public/resources/leaflet-control-geocoder-1.13.0/Control.Geocoder.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"Control.Geocoder.js","sources":["../src/util.js","../src/geocoders/arcgis.js","../src/geocoders/bing.js","../src/geocoders/google.js","../src/geocoders/here.js","../src/geocoders/latlng.js","../src/geocoders/mapbox.js","../src/geocoders/mapquest.js","../src/geocoders/neutrino.js","../src/geocoders/nominatim.js","../src/geocoders/open-location-code.js","../src/geocoders/opencage.js","../src/geocoders/pelias.js","../src/geocoders/photon.js","../src/geocoders/addok.js","../src/geocoders/what3words.js","../src/control.js","../src/index.js"],"sourcesContent":["import L from 'leaflet';\nvar lastCallbackId = 0;\n\n// Adapted from handlebars.js\n// https://github.com/wycats/handlebars.js/\nvar badChars = /[&<>\"'`]/g;\nvar possible = /[&<>\"'`]/;\nvar escape = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#x27;',\n  '`': '&#x60;'\n};\n\nfunction escapeChar(chr) {\n  return escape[chr];\n}\n\nexport function htmlEscape(string) {\n  if (string == null) {\n    return '';\n  } else if (!string) {\n    return string + '';\n  }\n\n  // Force a string conversion as this will be done by the append regardless and\n  // the regex test will do this transparently behind the scenes, causing issues if\n  // an object's to string has escaped characters in it.\n  string = '' + string;\n\n  if (!possible.test(string)) {\n    return string;\n  }\n  return string.replace(badChars, escapeChar);\n}\n\nexport function jsonp(url, params, callback, context, jsonpParam) {\n  var callbackId = '_l_geocoder_' + lastCallbackId++;\n  params[jsonpParam || 'callback'] = callbackId;\n  window[callbackId] = L.Util.bind(callback, context);\n  var script = document.createElement('script');\n  script.type = 'text/javascript';\n  script.src = url + getParamString(params);\n  script.id = callbackId;\n  document.getElementsByTagName('head')[0].appendChild(script);\n}\n\nexport function getJSON(url, params, callback) {\n  var xmlHttp = new XMLHttpRequest();\n  xmlHttp.onreadystatechange = function() {\n    if (xmlHttp.readyState !== 4) {\n      return;\n    }\n    var message;\n    if (xmlHttp.status !== 200 && xmlHttp.status !== 304) {\n      message = '';\n    } else if (typeof xmlHttp.response === 'string') {\n      // IE doesn't parse JSON responses even with responseType: 'json'.\n      try {\n        message = JSON.parse(xmlHttp.response);\n      } catch (e) {\n        // Not a JSON response\n        message = xmlHttp.response;\n      }\n    } else {\n      message = xmlHttp.response;\n    }\n    callback(message);\n  };\n  xmlHttp.open('GET', url + getParamString(params), true);\n  xmlHttp.responseType = 'json';\n  xmlHttp.setRequestHeader('Accept', 'application/json');\n  xmlHttp.send(null);\n}\n\nexport function template(str, data) {\n  return str.replace(/\\{ *([\\w_]+) *\\}/g, function(str, key) {\n    var value = data[key];\n    if (value === undefined) {\n      value = '';\n    } else if (typeof value === 'function') {\n      value = value(data);\n    }\n    return htmlEscape(value);\n  });\n}\n\nexport function getParamString(obj, existingUrl, uppercase) {\n  var params = [];\n  for (var i in obj) {\n    var key = encodeURIComponent(uppercase ? i.toUpperCase() : i);\n    var value = obj[i];\n    if (!L.Util.isArray(value)) {\n      params.push(key + '=' + encodeURIComponent(value));\n    } else {\n      for (var j = 0; j < value.length; j++) {\n        params.push(key + '=' + encodeURIComponent(value[j]));\n      }\n    }\n  }\n  return (!existingUrl || existingUrl.indexOf('?') === -1 ? '?' : '&') + params.join('&');\n}\n","import L from 'leaflet';\nimport { getJSON } from '../util';\n\nexport var ArcGis = L.Class.extend({\n  options: {\n    service_url: 'https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer'\n  },\n\n  initialize: function(accessToken, options) {\n    L.setOptions(this, options);\n    this._accessToken = accessToken;\n  },\n\n  geocode: function(query, cb, context) {\n    var params = {\n      SingleLine: query,\n      outFields: 'Addr_Type',\n      forStorage: false,\n      maxLocations: 10,\n      f: 'json'\n    };\n\n    if (this._key && this._key.length) {\n      params.token = this._key;\n    }\n\n    getJSON(\n      this.options.service_url + '/findAddressCandidates',\n      L.extend(params, this.options.geocodingQueryParams),\n      function(data) {\n        var results = [],\n          loc,\n          latLng,\n          latLngBounds;\n\n        if (data.candidates && data.candidates.length) {\n          for (var i = 0; i <= data.candidates.length - 1; i++) {\n            loc = data.candidates[i];\n            latLng = L.latLng(loc.location.y, loc.location.x);\n            latLngBounds = L.latLngBounds(\n              L.latLng(loc.extent.ymax, loc.extent.xmax),\n              L.latLng(loc.extent.ymin, loc.extent.xmin)\n            );\n            results[i] = {\n              name: loc.address,\n              bbox: latLngBounds,\n              center: latLng\n            };\n          }\n        }\n\n        cb.call(context, results);\n      }\n    );\n  },\n\n  suggest: function(query, cb, context) {\n    return this.geocode(query, cb, context);\n  },\n\n  reverse: function(location, scale, cb, context) {\n    var params = {\n      location: encodeURIComponent(location.lng) + ',' + encodeURIComponent(location.lat),\n      distance: 100,\n      f: 'json'\n    };\n\n    getJSON(this.options.service_url + '/reverseGeocode', params, function(data) {\n      var result = [],\n        loc;\n\n      if (data && !data.error) {\n        loc = L.latLng(data.location.y, data.location.x);\n        result.push({\n          name: data.address.Match_addr,\n          center: loc,\n          bounds: L.latLngBounds(loc, loc)\n        });\n      }\n\n      cb.call(context, result);\n    });\n  }\n});\n\nexport function arcgis(accessToken, options) {\n  return new ArcGis(accessToken, options);\n}\n","import L from 'leaflet';\nimport { jsonp } from '../util';\n\nexport var Bing = L.Class.extend({\n  initialize: function(key) {\n    this.key = key;\n  },\n\n  geocode: function(query, cb, context) {\n    jsonp(\n      'https://dev.virtualearth.net/REST/v1/Locations',\n      {\n        query: query,\n        key: this.key\n      },\n      function(data) {\n        var results = [];\n        if (data.resourceSets.length > 0) {\n          for (var i = data.resourceSets[0].resources.length - 1; i >= 0; i--) {\n            var resource = data.resourceSets[0].resources[i],\n              bbox = resource.bbox;\n            results[i] = {\n              name: resource.name,\n              bbox: L.latLngBounds([bbox[0], bbox[1]], [bbox[2], bbox[3]]),\n              center: L.latLng(resource.point.coordinates)\n            };\n          }\n        }\n        cb.call(context, results);\n      },\n      this,\n      'jsonp'\n    );\n  },\n\n  reverse: function(location, scale, cb, context) {\n    jsonp(\n      '//dev.virtualearth.net/REST/v1/Locations/' + location.lat + ',' + location.lng,\n      {\n        key: this.key\n      },\n      function(data) {\n        var results = [];\n        for (var i = data.resourceSets[0].resources.length - 1; i >= 0; i--) {\n          var resource = data.resourceSets[0].resources[i],\n            bbox = resource.bbox;\n          results[i] = {\n            name: resource.name,\n            bbox: L.latLngBounds([bbox[0], bbox[1]], [bbox[2], bbox[3]]),\n            center: L.latLng(resource.point.coordinates)\n          };\n        }\n        cb.call(context, results);\n      },\n      this,\n      'jsonp'\n    );\n  }\n});\n\nexport function bing(key) {\n  return new Bing(key);\n}\n","import L from 'leaflet';\nimport { getJSON } from '../util';\n\nexport var Google = L.Class.extend({\n  options: {\n    serviceUrl: 'https://maps.googleapis.com/maps/api/geocode/json',\n    geocodingQueryParams: {},\n    reverseQueryParams: {}\n  },\n\n  initialize: function(key, options) {\n    this._key = key;\n    L.setOptions(this, options);\n    // Backwards compatibility\n    this.options.serviceUrl = this.options.service_url || this.options.serviceUrl;\n  },\n\n  geocode: function(query, cb, context) {\n    var params = {\n      address: query\n    };\n\n    if (this._key && this._key.length) {\n      params.key = this._key;\n    }\n\n    params = L.Util.extend(params, this.options.geocodingQueryParams);\n\n    getJSON(this.options.serviceUrl, params, function(data) {\n      var results = [],\n        loc,\n        latLng,\n        latLngBounds;\n      if (data.results && data.results.length) {\n        for (var i = 0; i <= data.results.length - 1; i++) {\n          loc = data.results[i];\n          latLng = L.latLng(loc.geometry.location);\n          latLngBounds = L.latLngBounds(\n            L.latLng(loc.geometry.viewport.northeast),\n            L.latLng(loc.geometry.viewport.southwest)\n          );\n          results[i] = {\n            name: loc.formatted_address,\n            bbox: latLngBounds,\n            center: latLng,\n            properties: loc.address_components\n          };\n        }\n      }\n\n      cb.call(context, results);\n    });\n  },\n\n  reverse: function(location, scale, cb, context) {\n    var params = {\n      latlng: encodeURIComponent(location.lat) + ',' + encodeURIComponent(location.lng)\n    };\n    params = L.Util.extend(params, this.options.reverseQueryParams);\n    if (this._key && this._key.length) {\n      params.key = this._key;\n    }\n\n    getJSON(this.options.serviceUrl, params, function(data) {\n      var results = [],\n        loc,\n        latLng,\n        latLngBounds;\n      if (data.results && data.results.length) {\n        for (var i = 0; i <= data.results.length - 1; i++) {\n          loc = data.results[i];\n          latLng = L.latLng(loc.geometry.location);\n          latLngBounds = L.latLngBounds(\n            L.latLng(loc.geometry.viewport.northeast),\n            L.latLng(loc.geometry.viewport.southwest)\n          );\n          results[i] = {\n            name: loc.formatted_address,\n            bbox: latLngBounds,\n            center: latLng,\n            properties: loc.address_components\n          };\n        }\n      }\n\n      cb.call(context, results);\n    });\n  }\n});\n\nexport function google(key, options) {\n  return new Google(key, options);\n}\n","import L from 'leaflet';\nimport { getJSON } from '../util';\nexport var HERE = L.Class.extend({\n  options: {\n    geocodeUrl: 'https://geocoder.api.here.com/6.2/geocode.json',\n    reverseGeocodeUrl: 'https://reverse.geocoder.api.here.com/6.2/reversegeocode.json',\n    app_id: '<insert your app_id here>',\n    app_code: '<insert your app_code here>',\n    geocodingQueryParams: {},\n    reverseQueryParams: {},\n    reverseGeocodeProxRadius: null\n  },\n  initialize: function(options) {\n    L.setOptions(this, options);\n  },\n  geocode: function(query, cb, context) {\n    var params = {\n      searchtext: query,\n      gen: 9,\n      app_id: this.options.app_id,\n      app_code: this.options.app_code,\n      jsonattributes: 1\n    };\n    params = L.Util.extend(params, this.options.geocodingQueryParams);\n    this.getJSON(this.options.geocodeUrl, params, cb, context);\n  },\n  reverse: function(location, scale, cb, context) {\n    var _proxRadius = this.options.reverseGeocodeProxRadius\n      ? this.options.reverseGeocodeProxRadius\n      : null;\n    var proxRadius = _proxRadius ? ',' + encodeURIComponent(_proxRadius) : '';\n    var params = {\n      prox: encodeURIComponent(location.lat) + ',' + encodeURIComponent(location.lng) + proxRadius,\n      mode: 'retrieveAddresses',\n      app_id: this.options.app_id,\n      app_code: this.options.app_code,\n      gen: 9,\n      jsonattributes: 1\n    };\n    params = L.Util.extend(params, this.options.reverseQueryParams);\n    this.getJSON(this.options.reverseGeocodeUrl, params, cb, context);\n  },\n  getJSON: function(url, params, cb, context) {\n    getJSON(url, params, function(data) {\n      var results = [],\n        loc,\n        latLng,\n        latLngBounds;\n      if (data.response.view && data.response.view.length) {\n        for (var i = 0; i <= data.response.view[0].result.length - 1; i++) {\n          loc = data.response.view[0].result[i].location;\n          latLng = L.latLng(loc.displayPosition.latitude, loc.displayPosition.longitude);\n          latLngBounds = L.latLngBounds(\n            L.latLng(loc.mapView.topLeft.latitude, loc.mapView.topLeft.longitude),\n            L.latLng(loc.mapView.bottomRight.latitude, loc.mapView.bottomRight.longitude)\n          );\n          results[i] = {\n            name: loc.address.label,\n            properties: loc.address,\n            bbox: latLngBounds,\n            center: latLng\n          };\n        }\n      }\n      cb.call(context, results);\n    });\n  }\n});\nexport function here(options) {\n  return new HERE(options);\n}\n","import L from 'leaflet';\n\nexport var LatLng = L.Class.extend({\n  options: {\n    // the next geocoder to use\n    next: undefined,\n    sizeInMeters: 10000\n  },\n\n  initialize: function(options) {\n    L.Util.setOptions(this, options);\n  },\n\n  geocode: function(query, cb, context) {\n    var match;\n    var center;\n    // regex from https://github.com/openstreetmap/openstreetmap-website/blob/master/app/controllers/geocoder_controller.rb\n    if ((match = query.match(/^([NS])\\s*(\\d{1,3}(?:\\.\\d*)?)\\W*([EW])\\s*(\\d{1,3}(?:\\.\\d*)?)$/))) {\n      // [NSEW] decimal degrees\n      center = L.latLng(\n        (/N/i.test(match[1]) ? 1 : -1) * parseFloat(match[2]),\n        (/E/i.test(match[3]) ? 1 : -1) * parseFloat(match[4])\n      );\n    } else if (\n      (match = query.match(/^(\\d{1,3}(?:\\.\\d*)?)\\s*([NS])\\W*(\\d{1,3}(?:\\.\\d*)?)\\s*([EW])$/))\n    ) {\n      // decimal degrees [NSEW]\n      center = L.latLng(\n        (/N/i.test(match[2]) ? 1 : -1) * parseFloat(match[1]),\n        (/E/i.test(match[4]) ? 1 : -1) * parseFloat(match[3])\n      );\n    } else if (\n      (match = query.match(\n        /^([NS])\\s*(\\d{1,3})°?\\s*(\\d{1,3}(?:\\.\\d*)?)?['′]?\\W*([EW])\\s*(\\d{1,3})°?\\s*(\\d{1,3}(?:\\.\\d*)?)?['′]?$/\n      ))\n    ) {\n      // [NSEW] degrees, decimal minutes\n      center = L.latLng(\n        (/N/i.test(match[1]) ? 1 : -1) * (parseFloat(match[2]) + parseFloat(match[3] / 60)),\n        (/E/i.test(match[4]) ? 1 : -1) * (parseFloat(match[5]) + parseFloat(match[6] / 60))\n      );\n    } else if (\n      (match = query.match(\n        /^(\\d{1,3})°?\\s*(\\d{1,3}(?:\\.\\d*)?)?['′]?\\s*([NS])\\W*(\\d{1,3})°?\\s*(\\d{1,3}(?:\\.\\d*)?)?['′]?\\s*([EW])$/\n      ))\n    ) {\n      // degrees, decimal minutes [NSEW]\n      center = L.latLng(\n        (/N/i.test(match[3]) ? 1 : -1) * (parseFloat(match[1]) + parseFloat(match[2] / 60)),\n        (/E/i.test(match[6]) ? 1 : -1) * (parseFloat(match[4]) + parseFloat(match[5] / 60))\n      );\n    } else if (\n      (match = query.match(\n        /^([NS])\\s*(\\d{1,3})°?\\s*(\\d{1,2})['′]?\\s*(\\d{1,3}(?:\\.\\d*)?)?[\"″]?\\W*([EW])\\s*(\\d{1,3})°?\\s*(\\d{1,2})['′]?\\s*(\\d{1,3}(?:\\.\\d*)?)?[\"″]?$/\n      ))\n    ) {\n      // [NSEW] degrees, minutes, decimal seconds\n      center = L.latLng(\n        (/N/i.test(match[1]) ? 1 : -1) *\n          (parseFloat(match[2]) + parseFloat(match[3] / 60 + parseFloat(match[4] / 3600))),\n        (/E/i.test(match[5]) ? 1 : -1) *\n          (parseFloat(match[6]) + parseFloat(match[7] / 60) + parseFloat(match[8] / 3600))\n      );\n    } else if (\n      (match = query.match(\n        /^(\\d{1,3})°?\\s*(\\d{1,2})['′]?\\s*(\\d{1,3}(?:\\.\\d*)?)?[\"″]\\s*([NS])\\W*(\\d{1,3})°?\\s*(\\d{1,2})['′]?\\s*(\\d{1,3}(?:\\.\\d*)?)?[\"″]?\\s*([EW])$/\n      ))\n    ) {\n      // degrees, minutes, decimal seconds [NSEW]\n      center = L.latLng(\n        (/N/i.test(match[4]) ? 1 : -1) *\n          (parseFloat(match[1]) + parseFloat(match[2] / 60 + parseFloat(match[3] / 3600))),\n        (/E/i.test(match[8]) ? 1 : -1) *\n          (parseFloat(match[5]) + parseFloat(match[6] / 60) + parseFloat(match[7] / 3600))\n      );\n    } else if (\n      (match = query.match(/^\\s*([+-]?\\d+(?:\\.\\d*)?)\\s*[\\s,]\\s*([+-]?\\d+(?:\\.\\d*)?)\\s*$/))\n    ) {\n      center = L.latLng(parseFloat(match[1]), parseFloat(match[2]));\n    }\n    if (center) {\n      var results = [\n        {\n          name: query,\n          center: center,\n          bbox: center.toBounds(this.options.sizeInMeters)\n        }\n      ];\n      cb.call(context, results);\n    } else if (this.options.next) {\n      this.options.next.geocode(query, cb, context);\n    }\n  }\n});\n\nexport function latLng(options) {\n  return new LatLng(options);\n}\n","import L from 'leaflet';\nimport { getJSON } from '../util';\n\nexport var Mapbox = L.Class.extend({\n  options: {\n    serviceUrl: 'https://api.mapbox.com/geocoding/v5/mapbox.places/',\n    geocodingQueryParams: {},\n    reverseQueryParams: {}\n  },\n\n  initialize: function(accessToken, options) {\n    L.setOptions(this, options);\n    this.options.geocodingQueryParams.access_token = accessToken;\n    this.options.reverseQueryParams.access_token = accessToken;\n  },\n\n  geocode: function(query, cb, context) {\n    var params = this.options.geocodingQueryParams;\n    if (\n      params.proximity !== undefined &&\n      params.proximity.lat !== undefined &&\n      params.proximity.lng !== undefined\n    ) {\n      params.proximity = params.proximity.lng + ',' + params.proximity.lat;\n    }\n    getJSON(this.options.serviceUrl + encodeURIComponent(query) + '.json', params, function(data) {\n      var results = [],\n        loc,\n        latLng,\n        latLngBounds;\n      if (data.features && data.features.length) {\n        for (var i = 0; i <= data.features.length - 1; i++) {\n          loc = data.features[i];\n          latLng = L.latLng(loc.center.reverse());\n          if (loc.bbox) {\n            latLngBounds = L.latLngBounds(\n              L.latLng(loc.bbox.slice(0, 2).reverse()),\n              L.latLng(loc.bbox.slice(2, 4).reverse())\n            );\n          } else {\n            latLngBounds = L.latLngBounds(latLng, latLng);\n          }\n\n          var properties = {\n            text: loc.text,\n            address: loc.address\n          };\n\n          for (var j = 0; j < (loc.context || []).length; j++) {\n            var id = loc.context[j].id.split('.')[0];\n            properties[id] = loc.context[j].text;\n\n            // Get country code when available\n            if (loc.context[j].short_code) {\n              properties['countryShortCode'] = loc.context[j].short_code;\n            }\n          }\n\n          results[i] = {\n            name: loc.place_name,\n            bbox: latLngBounds,\n            center: latLng,\n            properties: properties\n          };\n        }\n      }\n\n      cb.call(context, results);\n    });\n  },\n\n  suggest: function(query, cb, context) {\n    return this.geocode(query, cb, context);\n  },\n\n  reverse: function(location, scale, cb, context) {\n    getJSON(\n      this.options.serviceUrl +\n        encodeURIComponent(location.lng) +\n        ',' +\n        encodeURIComponent(location.lat) +\n        '.json',\n      this.options.reverseQueryParams,\n      function(data) {\n        var results = [],\n          loc,\n          latLng,\n          latLngBounds;\n        if (data.features && data.features.length) {\n          for (var i = 0; i <= data.features.length - 1; i++) {\n            loc = data.features[i];\n            latLng = L.latLng(loc.center.reverse());\n            if (loc.bbox) {\n              latLngBounds = L.latLngBounds(\n                L.latLng(loc.bbox.slice(0, 2).reverse()),\n                L.latLng(loc.bbox.slice(2, 4).reverse())\n              );\n            } else {\n              latLngBounds = L.latLngBounds(latLng, latLng);\n            }\n            results[i] = {\n              name: loc.place_name,\n              bbox: latLngBounds,\n              center: latLng\n            };\n          }\n        }\n\n        cb.call(context, results);\n      }\n    );\n  }\n});\n\nexport function mapbox(accessToken, options) {\n  return new Mapbox(accessToken, options);\n}\n","import L from 'leaflet';\nimport { getJSON } from '../util';\n\nexport var MapQuest = L.Class.extend({\n  options: {\n    serviceUrl: 'https://www.mapquestapi.com/geocoding/v1'\n  },\n\n  initialize: function(key, options) {\n    // MapQuest seems to provide URI encoded API keys,\n    // so to avoid encoding them twice, we decode them here\n    this._key = decodeURIComponent(key);\n\n    L.Util.setOptions(this, options);\n  },\n\n  _formatName: function() {\n    var r = [],\n      i;\n    for (i = 0; i < arguments.length; i++) {\n      if (arguments[i]) {\n        r.push(arguments[i]);\n      }\n    }\n\n    return r.join(', ');\n  },\n\n  geocode: function(query, cb, context) {\n    getJSON(\n      this.options.serviceUrl + '/address',\n      {\n        key: this._key,\n        location: query,\n        limit: 5,\n        outFormat: 'json'\n      },\n      L.bind(function(data) {\n        var results = [],\n          loc,\n          latLng;\n        if (data.results && data.results[0].locations) {\n          for (var i = data.results[0].locations.length - 1; i >= 0; i--) {\n            loc = data.results[0].locations[i];\n            latLng = L.latLng(loc.latLng);\n            results[i] = {\n              name: this._formatName(loc.street, loc.adminArea4, loc.adminArea3, loc.adminArea1),\n              bbox: L.latLngBounds(latLng, latLng),\n              center: latLng\n            };\n          }\n        }\n\n        cb.call(context, results);\n      }, this)\n    );\n  },\n\n  reverse: function(location, scale, cb, context) {\n    getJSON(\n      this.options.serviceUrl + '/reverse',\n      {\n        key: this._key,\n        location: location.lat + ',' + location.lng,\n        outputFormat: 'json'\n      },\n      L.bind(function(data) {\n        var results = [],\n          loc,\n          latLng;\n        if (data.results && data.results[0].locations) {\n          for (var i = data.results[0].locations.length - 1; i >= 0; i--) {\n            loc = data.results[0].locations[i];\n            latLng = L.latLng(loc.latLng);\n            results[i] = {\n              name: this._formatName(loc.street, loc.adminArea4, loc.adminArea3, loc.adminArea1),\n              bbox: L.latLngBounds(latLng, latLng),\n              center: latLng\n            };\n          }\n        }\n\n        cb.call(context, results);\n      }, this)\n    );\n  }\n});\n\nexport function mapQuest(key, options) {\n  return new MapQuest(key, options);\n}\n","import L from 'leaflet';\nimport { getJSON } from '../util';\n\nexport var Neutrino = L.Class.extend({\n  options: {\n    userId: '<insert your userId here>',\n    apiKey: '<insert your apiKey here>',\n    serviceUrl: 'https://neutrinoapi.com/'\n  },\n\n  initialize: function(options) {\n    L.Util.setOptions(this, options);\n  },\n\n  // https://www.neutrinoapi.com/api/geocode-address/\n  geocode: function(query, cb, context) {\n    getJSON(\n      this.options.serviceUrl + 'geocode-address',\n      {\n        apiKey: this.options.apiKey,\n        userId: this.options.userId,\n        //get three words and make a dot based string\n        address: query.split(/\\s+/).join('.')\n      },\n      function(data) {\n        var results = [],\n          latLng,\n          latLngBounds;\n        if (data.locations) {\n          data.geometry = data.locations[0];\n          latLng = L.latLng(data.geometry['latitude'], data.geometry['longitude']);\n          latLngBounds = L.latLngBounds(latLng, latLng);\n          results[0] = {\n            name: data.geometry.address,\n            bbox: latLngBounds,\n            center: latLng\n          };\n        }\n\n        cb.call(context, results);\n      }\n    );\n  },\n\n  suggest: function(query, cb, context) {\n    return this.geocode(query, cb, context);\n  },\n\n  // https://www.neutrinoapi.com/api/geocode-reverse/\n  reverse: function(location, scale, cb, context) {\n    getJSON(\n      this.options.serviceUrl + 'geocode-reverse',\n      {\n        apiKey: this.options.apiKey,\n        userId: this.options.userId,\n        latitude: location.lat,\n        longitude: location.lng\n      },\n      function(data) {\n        var results = [],\n          latLng,\n          latLngBounds;\n        if (data.status.status == 200 && data.found) {\n          latLng = L.latLng(location.lat, location.lng);\n          latLngBounds = L.latLngBounds(latLng, latLng);\n          results[0] = {\n            name: data.address,\n            bbox: latLngBounds,\n            center: latLng\n          };\n        }\n        cb.call(context, results);\n      }\n    );\n  }\n});\n\nexport function neutrino(accessToken) {\n  return new Neutrino(accessToken);\n}\n","import L from 'leaflet';\nimport { template, getJSON } from '../util';\n\nexport var Nominatim = L.Class.extend({\n  options: {\n    serviceUrl: 'https://nominatim.openstreetmap.org/',\n    geocodingQueryParams: {},\n    reverseQueryParams: {},\n    htmlTemplate: function(r) {\n      var a = r.address,\n        className,\n        parts = [];\n      if (a.road || a.building) {\n        parts.push('{building} {road} {house_number}');\n      }\n\n      if (a.city || a.town || a.village || a.hamlet) {\n        className = parts.length > 0 ? 'leaflet-control-geocoder-address-detail' : '';\n        parts.push(\n          '<span class=\"' + className + '\">{postcode} {city} {town} {village} {hamlet}</span>'\n        );\n      }\n\n      if (a.state || a.country) {\n        className = parts.length > 0 ? 'leaflet-control-geocoder-address-context' : '';\n        parts.push('<span class=\"' + className + '\">{state} {country}</span>');\n      }\n\n      return template(parts.join('<br/>'), a, true);\n    }\n  },\n\n  initialize: function(options) {\n    L.Util.setOptions(this, options);\n  },\n\n  geocode: function(query, cb, context) {\n    getJSON(\n      this.options.serviceUrl + 'search',\n      L.extend(\n        {\n          q: query,\n          limit: 5,\n          format: 'json',\n          addressdetails: 1\n        },\n        this.options.geocodingQueryParams\n      ),\n      L.bind(function(data) {\n        var results = [];\n        for (var i = data.length - 1; i >= 0; i--) {\n          var bbox = data[i].boundingbox;\n          for (var j = 0; j < 4; j++) bbox[j] = parseFloat(bbox[j]);\n          results[i] = {\n            icon: data[i].icon,\n            name: data[i].display_name,\n            html: this.options.htmlTemplate ? this.options.htmlTemplate(data[i]) : undefined,\n            bbox: L.latLngBounds([bbox[0], bbox[2]], [bbox[1], bbox[3]]),\n            center: L.latLng(data[i].lat, data[i].lon),\n            properties: data[i]\n          };\n        }\n        cb.call(context, results);\n      }, this)\n    );\n  },\n\n  suggest: function (query, cb, context) {\n    return this.geocode(query, cb, context);\n},\n\n  reverse: function(location, scale, cb, context) {\n    getJSON(\n      this.options.serviceUrl + 'reverse',\n      L.extend(\n        {\n          lat: location.lat,\n          lon: location.lng,\n          zoom: Math.round(Math.log(scale / 256) / Math.log(2)),\n          addressdetails: 1,\n          format: 'json'\n        },\n        this.options.reverseQueryParams\n      ),\n      L.bind(function(data) {\n        var result = [],\n          loc;\n\n        if (data && data.lat && data.lon) {\n          loc = L.latLng(data.lat, data.lon);\n          result.push({\n            name: data.display_name,\n            html: this.options.htmlTemplate ? this.options.htmlTemplate(data) : undefined,\n            center: loc,\n            bounds: L.latLngBounds(loc, loc),\n            properties: data\n          });\n        }\n\n        cb.call(context, result);\n      }, this)\n    );\n  }\n});\n\nexport function nominatim(options) {\n  return new Nominatim(options);\n}\n","import L from 'leaflet';\n\nexport var OpenLocationCode = L.Class.extend({\n  options: {\n    OpenLocationCode: undefined,\n    codeLength: undefined\n  },\n\n  initialize: function(options) {\n    L.setOptions(this, options);\n  },\n\n  geocode: function(query, cb, context) {\n    try {\n      var decoded = this.options.OpenLocationCode.decode(query);\n      var result = {\n        name: query,\n        center: L.latLng(decoded.latitudeCenter, decoded.longitudeCenter),\n        bbox: L.latLngBounds(\n          L.latLng(decoded.latitudeLo, decoded.longitudeLo),\n          L.latLng(decoded.latitudeHi, decoded.longitudeHi)\n        )\n      };\n      cb.call(context, [result]);\n    } catch (e) {\n      console.warn(e); // eslint-disable-line no-console\n      cb.call(context, []);\n    }\n  },\n  reverse: function(location, scale, cb, context) {\n    try {\n      var code = this.options.OpenLocationCode.encode(\n        location.lat,\n        location.lng,\n        this.options.codeLength\n      );\n      var result = {\n        name: code,\n        center: L.latLng(location.lat, location.lng),\n        bbox: L.latLngBounds(\n          L.latLng(location.lat, location.lng),\n          L.latLng(location.lat, location.lng)\n        )\n      };\n      cb.call(context, [result]);\n    } catch (e) {\n      console.warn(e); // eslint-disable-line no-console\n      cb.call(context, []);\n    }\n  }\n});\n\nexport function openLocationCode(options) {\n  return new OpenLocationCode(options);\n}\n","import L from 'leaflet';\nimport { getJSON } from '../util';\n\nexport var OpenCage = L.Class.extend({\n  options: {\n    serviceUrl: 'https://api.opencagedata.com/geocode/v1/json',\n    geocodingQueryParams: {},\n    reverseQueryParams: {}\n  },\n\n  initialize: function(apiKey, options) {\n    L.setOptions(this, options);\n    this._accessToken = apiKey;\n  },\n\n  geocode: function(query, cb, context) {\n    var params = {\n      key: this._accessToken,\n      q: query\n    };\n    params = L.extend(params, this.options.geocodingQueryParams);\n    getJSON(this.options.serviceUrl, params, function(data) {\n      var results = [],\n        latLng,\n        latLngBounds,\n        loc;\n      if (data.results && data.results.length) {\n        for (var i = 0; i < data.results.length; i++) {\n          loc = data.results[i];\n          latLng = L.latLng(loc.geometry);\n          if (loc.annotations && loc.annotations.bounds) {\n            latLngBounds = L.latLngBounds(\n              L.latLng(loc.annotations.bounds.northeast),\n              L.latLng(loc.annotations.bounds.southwest)\n            );\n          } else {\n            latLngBounds = L.latLngBounds(latLng, latLng);\n          }\n          results.push({\n            name: loc.formatted,\n            bbox: latLngBounds,\n            center: latLng\n          });\n        }\n      }\n      cb.call(context, results);\n    });\n  },\n\n  suggest: function(query, cb, context) {\n    return this.geocode(query, cb, context);\n  },\n\n  reverse: function(location, scale, cb, context) {\n    var params = {\n      key: this._accessToken,\n      q: [location.lat, location.lng].join(',')\n    };\n    params = L.extend(params, this.options.reverseQueryParams);\n    getJSON(this.options.serviceUrl, params, function(data) {\n      var results = [],\n        latLng,\n        latLngBounds,\n        loc;\n      if (data.results && data.results.length) {\n        for (var i = 0; i < data.results.length; i++) {\n          loc = data.results[i];\n          latLng = L.latLng(loc.geometry);\n          if (loc.annotations && loc.annotations.bounds) {\n            latLngBounds = L.latLngBounds(\n              L.latLng(loc.annotations.bounds.northeast),\n              L.latLng(loc.annotations.bounds.southwest)\n            );\n          } else {\n            latLngBounds = L.latLngBounds(latLng, latLng);\n          }\n          results.push({\n            name: loc.formatted,\n            bbox: latLngBounds,\n            center: latLng\n          });\n        }\n      }\n      cb.call(context, results);\n    });\n  }\n});\n\nexport function opencage(apiKey, options) {\n  return new OpenCage(apiKey, options);\n}\n","import L from 'leaflet';\nimport { getJSON } from '../util';\n\nexport var Pelias = L.Class.extend({\n  options: {\n    serviceUrl: 'https://api.geocode.earth/v1',\n    geocodingQueryParams: {},\n    reverseQueryParams: {}\n  },\n\n  initialize: function(apiKey, options) {\n    L.Util.setOptions(this, options);\n    this._apiKey = apiKey;\n    this._lastSuggest = 0;\n  },\n\n  geocode: function(query, cb, context) {\n    var _this = this;\n    getJSON(\n      this.options.serviceUrl + '/search',\n      L.extend(\n        {\n          api_key: this._apiKey,\n          text: query\n        },\n        this.options.geocodingQueryParams\n      ),\n      function(data) {\n        cb.call(context, _this._parseResults(data, 'bbox'));\n      }\n    );\n  },\n\n  suggest: function(query, cb, context) {\n    var _this = this;\n    getJSON(\n      this.options.serviceUrl + '/autocomplete',\n      L.extend(\n        {\n          api_key: this._apiKey,\n          text: query\n        },\n        this.options.geocodingQueryParams\n      ),\n      L.bind(function(data) {\n        if (data.geocoding.timestamp > this._lastSuggest) {\n          this._lastSuggest = data.geocoding.timestamp;\n          cb.call(context, _this._parseResults(data, 'bbox'));\n        }\n      }, this)\n    );\n  },\n\n  reverse: function(location, scale, cb, context) {\n    var _this = this;\n    getJSON(\n      this.options.serviceUrl + '/reverse',\n      L.extend(\n        {\n          api_key: this._apiKey,\n          'point.lat': location.lat,\n          'point.lon': location.lng\n        },\n        this.options.reverseQueryParams\n      ),\n      function(data) {\n        cb.call(context, _this._parseResults(data, 'bounds'));\n      }\n    );\n  },\n\n  _parseResults: function(data, bboxname) {\n    var results = [];\n    L.geoJson(data, {\n      pointToLayer: function(feature, latlng) {\n        return L.circleMarker(latlng);\n      },\n      onEachFeature: function(feature, layer) {\n        var result = {},\n          bbox,\n          center;\n\n        if (layer.getBounds) {\n          bbox = layer.getBounds();\n          center = bbox.getCenter();\n        } else if (layer.feature.bbox) {\n          center = layer.getLatLng();\n          bbox = L.latLngBounds(\n            L.GeoJSON.coordsToLatLng(layer.feature.bbox.slice(0, 2)),\n            L.GeoJSON.coordsToLatLng(layer.feature.bbox.slice(2, 4))\n          );\n        } else {\n          center = layer.getLatLng();\n          bbox = L.latLngBounds(center, center);\n        }\n\n        result.name = layer.feature.properties.label;\n        result.center = center;\n        result[bboxname] = bbox;\n        result.properties = layer.feature.properties;\n        results.push(result);\n      }\n    });\n    return results;\n  }\n});\n\nexport function pelias(apiKey, options) {\n  return new Pelias(apiKey, options);\n}\nexport var GeocodeEarth = Pelias;\nexport var geocodeEarth = pelias;\n\nexport var Mapzen = Pelias; // r.i.p.\nexport var mapzen = pelias;\n\nexport var Openrouteservice = Mapzen.extend({\n  options: {\n    serviceUrl: 'https://api.openrouteservice.org/geocode'\n  }\n});\nexport function openrouteservice(apiKey, options) {\n  return new Openrouteservice(apiKey, options);\n}\n","import L from 'leaflet';\nimport { getJSON } from '../util';\n\nexport var Photon = L.Class.extend({\n  options: {\n    serviceUrl: 'https://photon.komoot.de/api/',\n    reverseUrl: 'https://photon.komoot.de/reverse/',\n    nameProperties: ['name', 'street', 'suburb', 'hamlet', 'town', 'city', 'state', 'country']\n  },\n\n  initialize: function(options) {\n    L.setOptions(this, options);\n  },\n\n  geocode: function(query, cb, context) {\n    var params = L.extend(\n      {\n        q: query\n      },\n      this.options.geocodingQueryParams\n    );\n\n    getJSON(\n      this.options.serviceUrl,\n      params,\n      L.bind(function(data) {\n        cb.call(context, this._decodeFeatures(data));\n      }, this)\n    );\n  },\n\n  suggest: function(query, cb, context) {\n    return this.geocode(query, cb, context);\n  },\n\n  reverse: function(latLng, scale, cb, context) {\n    var params = L.extend(\n      {\n        lat: latLng.lat,\n        lon: latLng.lng\n      },\n      this.options.reverseQueryParams\n    );\n\n    getJSON(\n      this.options.reverseUrl,\n      params,\n      L.bind(function(data) {\n        cb.call(context, this._decodeFeatures(data));\n      }, this)\n    );\n  },\n\n  _decodeFeatures: function(data) {\n    var results = [],\n      i,\n      f,\n      c,\n      latLng,\n      extent,\n      bbox;\n\n    if (data && data.features) {\n      for (i = 0; i < data.features.length; i++) {\n        f = data.features[i];\n        c = f.geometry.coordinates;\n        latLng = L.latLng(c[1], c[0]);\n        extent = f.properties.extent;\n\n        if (extent) {\n          bbox = L.latLngBounds([extent[1], extent[0]], [extent[3], extent[2]]);\n        } else {\n          bbox = L.latLngBounds(latLng, latLng);\n        }\n\n        results.push({\n          name: this._decodeFeatureName(f),\n          html: this.options.htmlTemplate ? this.options.htmlTemplate(f) : undefined,\n          center: latLng,\n          bbox: bbox,\n          properties: f.properties\n        });\n      }\n    }\n\n    return results;\n  },\n\n  _decodeFeatureName: function(f) {\n    return (this.options.nameProperties || [])\n      .map(function(p) {\n        return f.properties[p];\n      })\n      .filter(function(v) {\n        return !!v;\n      })\n      .join(', ');\n  }\n});\n\nexport function photon(options) {\n  return new Photon(options);\n}\n","'use strict';\n\nimport { getJSON, template } from '../util';\nimport L from 'leaflet';\n\nconst TYPE_LABEL = {\n    housenumber: 'Numéro',\n    street: 'Rue',\n    locality: 'Lieux-dit',\n    municipality: 'Commune',\n};\n\nexport var AddOk = L.Class.extend({\n    options: {\n        serviceUrl: 'https://api-adresse.data.gouv.fr',\n        limit: 5,\n        htmlTemplate: function (r) {\n            var parts = [];\n\n\t\t\t/* some available classes:\n\t\t\t\tleaflet-control-geocoder-address-detail\n\t\t\t\tleaflet-control-geocoder-address-context\n\t\t\t*/\n            parts.push('<span class=\"leaflet-control-geocoder-address-item\"> {label} </span>({type})<span>' + '</span>');\n            parts.push('<span class=\"' + (parts.length > 0 ? 'leaflet-control-geocoder-address-detail' : '') +\n                '\">{context}</span>');\n\n            return template(parts.join('<br/>'), r, true);\n        }\n\n    },\n\n    initialize: function (options) {\n        L.setOptions(this, options);\n    },\n\n    geocode: function (query, cb, context) {\n\n        var params = L.extend({\n            q: query,\n            limit: this.options.limit\n        }, this.options.geocodingQueryParams);\n        var that = this;\n\n        getJSON(this.options.serviceUrl + '/search/', params, function (data) {\n            var results = [],\n                i,\n                f,\n                c,\n                latLng,\n                extent,\n                bbox;\n            if (data && data.features) {\n                for (i = 0; i < data.features.length; i++) {\n                    f = data.features[i];\n                    c = f.geometry.coordinates;\n                    latLng = L.latLng(c[1], c[0]);\n                    extent = f.properties.extent;\n\n                    if (extent) {\n                        bbox = L.latLngBounds([extent[1], extent[0]], [extent[3], extent[2]]);\n                    } else {\n                        bbox = L.latLngBounds(latLng, latLng);\n                    }\n                    \n                    // Translate the type in french\n                    if (f.properties.type) {\n                        f.properties.type = TYPE_LABEL[f.properties.type];\n                    }\n                    \n                    results.push({\n                        name: f.properties.name,\n                        center: latLng,\n                        bbox: bbox,\n                        html: that.options.htmlTemplate ?\n                            that.options.htmlTemplate(f.properties)\n                            : undefined\n                    });\n                }\n            }\n\n            cb.call(context, results);\n        });\n    },\n\n    suggest: function (query, cb, context) {\n        return this.geocode(query, cb, context);\n    },\n\n    reverse: function (location, scale, cb, context) {\n        var params = L.extend({\n            lat: location.lat,\n            lon: location.lng\n        }, this.options.reverseQueryParams);\n        var that = this;\n        getJSON(this.options.serviceUrl + '/reverse/', params, function (data) {\n            var results = [],\n                i,\n                f,\n                c,\n                latLng,\n                extent,\n                bbox;\n            if (data && data.features) {\n                for (i = 0; i < data.features.length; i++) {\n                    f = data.features[i];\n                    c = f.geometry.coordinates;\n                    latLng = L.latLng(c[1], c[0]);\n                    extent = f.properties.extent;\n\n                    if (extent) {\n                        bbox = L.latLngBounds([extent[1], extent[0]], [extent[3], extent[2]]);\n                    } else {\n                        bbox = L.latLngBounds(latLng, latLng);\n                    }\n\n                    results.push({\n                        name: f.properties.name,\n                        center: latLng,\n                        bbox: bbox,\n                        html: that.options.htmlTemplate ?\n                            that.options.htmlTemplate(f.properties)\n                            : undefined\n                    });\n                }\n            }\n\n            cb.call(context, results);\n        });\n    }\n});\n\n\nexport function addok(key) {\n    return new AddOk(key);\n}","import L from 'leaflet';\nimport { getJSON } from '../util';\n\nexport var What3Words = L.Class.extend({\n  options: {\n    serviceUrl: 'https://api.what3words.com/v2/'\n  },\n\n  initialize: function(accessToken) {\n    this._accessToken = accessToken;\n  },\n\n  geocode: function(query, cb, context) {\n    //get three words and make a dot based string\n    getJSON(\n      this.options.serviceUrl + 'forward',\n      {\n        key: this._accessToken,\n        addr: query.split(/\\s+/).join('.')\n      },\n      function(data) {\n        var results = [],\n          latLng,\n          latLngBounds;\n        if (data.geometry) {\n          latLng = L.latLng(data.geometry['lat'], data.geometry['lng']);\n          latLngBounds = L.latLngBounds(latLng, latLng);\n          results[0] = {\n            name: data.words,\n            bbox: latLngBounds,\n            center: latLng\n          };\n        }\n\n        cb.call(context, results);\n      }\n    );\n  },\n\n  suggest: function(query, cb, context) {\n    return this.geocode(query, cb, context);\n  },\n\n  reverse: function(location, scale, cb, context) {\n    getJSON(\n      this.options.serviceUrl + 'reverse',\n      {\n        key: this._accessToken,\n        coords: [location.lat, location.lng].join(',')\n      },\n      function(data) {\n        var results = [],\n          latLng,\n          latLngBounds;\n        if (data.status.status == 200) {\n          latLng = L.latLng(data.geometry['lat'], data.geometry['lng']);\n          latLngBounds = L.latLngBounds(latLng, latLng);\n          results[0] = {\n            name: data.words,\n            bbox: latLngBounds,\n            center: latLng\n          };\n        }\n        cb.call(context, results);\n      }\n    );\n  }\n});\n\nexport function what3words(accessToken) {\n  return new What3Words(accessToken);\n}\n","import L from 'leaflet';\nimport { Nominatim } from './geocoders/index';\n\nexport var Geocoder = L.Control.extend({\n  options: {\n    showUniqueResult: true,\n    showResultIcons: false,\n    collapsed: true,\n    expand: 'touch', // options: touch, click, anythingelse\n    position: 'topright',\n    placeholder: 'Search...',\n    errorMessage: 'Nothing found.',\n    iconLabel: 'Initiate a new search',\n    queryMinLength: 1,\n    suggestMinLength: 3,\n    suggestTimeout: 250,\n    defaultMarkGeocode: true\n  },\n\n  includes: L.Evented.prototype || L.Mixin.Events,\n\n  initialize: function(options) {\n    L.Util.setOptions(this, options);\n    if (!this.options.geocoder) {\n      this.options.geocoder = new Nominatim();\n    }\n\n    this._requestCount = 0;\n  },\n\n  addThrobberClass: function() {\n    L.DomUtil.addClass(this._container, 'leaflet-control-geocoder-throbber');\n  },\n\n  removeThrobberClass: function() {\n    L.DomUtil.removeClass(this._container, 'leaflet-control-geocoder-throbber');\n  },\n\n  onAdd: function(map) {\n    var className = 'leaflet-control-geocoder',\n      container = L.DomUtil.create('div', className + ' leaflet-bar'),\n      icon = L.DomUtil.create('button', className + '-icon', container),\n      form = (this._form = L.DomUtil.create('div', className + '-form', container)),\n      input;\n\n    this._map = map;\n    this._container = container;\n\n    icon.innerHTML = '&nbsp;';\n    icon.type = 'button';\n    icon.setAttribute('aria-label', this.options.iconLabel);\n\n    input = this._input = L.DomUtil.create('input', '', form);\n    input.type = 'text';\n    input.value = this.options.query || '';\n    input.placeholder = this.options.placeholder;\n    L.DomEvent.disableClickPropagation(input);\n\n    this._errorElement = L.DomUtil.create('div', className + '-form-no-error', container);\n    this._errorElement.innerHTML = this.options.errorMessage;\n\n    this._alts = L.DomUtil.create(\n      'ul',\n      className + '-alternatives leaflet-control-geocoder-alternatives-minimized',\n      container\n    );\n    L.DomEvent.disableClickPropagation(this._alts);\n\n    L.DomEvent.addListener(input, 'keydown', this._keydown, this);\n    if (this.options.geocoder.suggest) {\n      L.DomEvent.addListener(input, 'input', this._change, this);\n    }\n    L.DomEvent.addListener(\n      input,\n      'blur',\n      function() {\n        if (this.options.collapsed && !this._preventBlurCollapse) {\n          this._collapse();\n        }\n        this._preventBlurCollapse = false;\n      },\n      this\n    );\n\n    if (this.options.collapsed) {\n      if (this.options.expand === 'click') {\n        L.DomEvent.addListener(\n          container,\n          'click',\n          function(e) {\n            if (e.button === 0 && e.detail !== 2) {\n              this._toggle();\n            }\n          },\n          this\n        );\n      } else if (this.options.expand === 'touch') {\n        L.DomEvent.addListener(\n          container,\n          L.Browser.touch ? 'touchstart mousedown' : 'mousedown',\n          function(e) {\n            this._toggle();\n            e.preventDefault(); // mobile: clicking focuses the icon, so UI expands and immediately collapses\n            e.stopPropagation();\n          },\n          this\n        );\n      } else {\n        L.DomEvent.addListener(container, 'mouseover', this._expand, this);\n        L.DomEvent.addListener(container, 'mouseout', this._collapse, this);\n        this._map.on('movestart', this._collapse, this);\n      }\n    } else {\n      this._expand();\n      if (L.Browser.touch) {\n        L.DomEvent.addListener(\n          container,\n          'touchstart',\n          function() {\n            this._geocode();\n          },\n          this\n        );\n      } else {\n        L.DomEvent.addListener(\n          container,\n          'click',\n          function() {\n            this._geocode();\n          },\n          this\n        );\n      }\n    }\n\n    if (this.options.defaultMarkGeocode) {\n      this.on('markgeocode', this.markGeocode, this);\n    }\n\n    this.on('startgeocode', this.addThrobberClass, this);\n    this.on('finishgeocode', this.removeThrobberClass, this);\n    this.on('startsuggest', this.addThrobberClass, this);\n    this.on('finishsuggest', this.removeThrobberClass, this);\n\n    L.DomEvent.disableClickPropagation(container);\n\n    return container;\n  },\n\n  setQuery: function(string) {\n    this._input.value = string;\n    return this;\n  },\n\n  _geocodeResult: function(results, suggest) {\n    if (!suggest && this.options.showUniqueResult && results.length === 1) {\n      this._geocodeResultSelected(results[0]);\n    } else if (results.length > 0) {\n      this._alts.innerHTML = '';\n      this._results = results;\n      L.DomUtil.removeClass(this._alts, 'leaflet-control-geocoder-alternatives-minimized');\n      L.DomUtil.addClass(this._container, 'leaflet-control-geocoder-options-open');\n      for (var i = 0; i < results.length; i++) {\n        this._alts.appendChild(this._createAlt(results[i], i));\n      }\n    } else {\n      L.DomUtil.addClass(this._container, 'leaflet-control-geocoder-options-error');\n      L.DomUtil.addClass(this._errorElement, 'leaflet-control-geocoder-error');\n    }\n  },\n\n  markGeocode: function(result) {\n    result = result.geocode || result;\n\n    this._map.fitBounds(result.bbox);\n\n    if (this._geocodeMarker) {\n      this._map.removeLayer(this._geocodeMarker);\n    }\n\n    this._geocodeMarker = new L.Marker(result.center)\n      .bindPopup(result.html || result.name)\n      .addTo(this._map)\n      .openPopup();\n\n    return this;\n  },\n\n  _geocode: function(suggest) {\n    var value = this._input.value;\n    if (!suggest && value.length < this.options.queryMinLength) {\n      return;\n    }\n\n    var requestCount = ++this._requestCount,\n      mode = suggest ? 'suggest' : 'geocode',\n      eventData = { input: value };\n\n    this._lastGeocode = value;\n    if (!suggest) {\n      this._clearResults();\n    }\n\n    this.fire('start' + mode, eventData);\n    this.options.geocoder[mode](\n      value,\n      function(results) {\n        if (requestCount === this._requestCount) {\n          eventData.results = results;\n          this.fire('finish' + mode, eventData);\n          this._geocodeResult(results, suggest);\n        }\n      },\n      this\n    );\n  },\n\n  _geocodeResultSelected: function(result) {\n    this.fire('markgeocode', { geocode: result });\n  },\n\n  _toggle: function() {\n    if (L.DomUtil.hasClass(this._container, 'leaflet-control-geocoder-expanded')) {\n      this._collapse();\n    } else {\n      this._expand();\n    }\n  },\n\n  _expand: function() {\n    L.DomUtil.addClass(this._container, 'leaflet-control-geocoder-expanded');\n    this._input.select();\n    this.fire('expand');\n  },\n\n  _collapse: function() {\n    L.DomUtil.removeClass(this._container, 'leaflet-control-geocoder-expanded');\n    L.DomUtil.addClass(this._alts, 'leaflet-control-geocoder-alternatives-minimized');\n    L.DomUtil.removeClass(this._errorElement, 'leaflet-control-geocoder-error');\n    L.DomUtil.removeClass(this._container, 'leaflet-control-geocoder-options-open');\n    L.DomUtil.removeClass(this._container, 'leaflet-control-geocoder-options-error');\n    this._input.blur(); // mobile: keyboard shouldn't stay expanded\n    this.fire('collapse');\n  },\n\n  _clearResults: function() {\n    L.DomUtil.addClass(this._alts, 'leaflet-control-geocoder-alternatives-minimized');\n    this._selection = null;\n    L.DomUtil.removeClass(this._errorElement, 'leaflet-control-geocoder-error');\n    L.DomUtil.removeClass(this._container, 'leaflet-control-geocoder-options-open');\n    L.DomUtil.removeClass(this._container, 'leaflet-control-geocoder-options-error');\n  },\n\n  _createAlt: function(result, index) {\n    var li = L.DomUtil.create('li', ''),\n      a = L.DomUtil.create('a', '', li),\n      icon = this.options.showResultIcons && result.icon ? L.DomUtil.create('img', '', a) : null,\n      text = result.html ? undefined : document.createTextNode(result.name),\n      mouseDownHandler = function mouseDownHandler(e) {\n        // In some browsers, a click will fire on the map if the control is\n        // collapsed directly after mousedown. To work around this, we\n        // wait until the click is completed, and _then_ collapse the\n        // control. Messy, but this is the workaround I could come up with\n        // for #142.\n        this._preventBlurCollapse = true;\n        L.DomEvent.stop(e);\n        this._geocodeResultSelected(result);\n        L.DomEvent.on(\n          li,\n          'click touchend',\n          function() {\n            if (this.options.collapsed) {\n              this._collapse();\n            } else {\n              this._clearResults();\n            }\n          },\n          this\n        );\n      };\n\n    if (icon) {\n      icon.src = result.icon;\n    }\n\n    li.setAttribute('data-result-index', index);\n\n    if (result.html) {\n      a.innerHTML = a.innerHTML + result.html;\n    } else {\n      a.appendChild(text);\n    }\n\n    // Use mousedown and not click, since click will fire _after_ blur,\n    // causing the control to have collapsed and removed the items\n    // before the click can fire.\n    L.DomEvent.addListener(li, 'mousedown touchstart', mouseDownHandler, this);\n\n    return li;\n  },\n\n  _keydown: function(e) {\n    var _this = this,\n      select = function select(dir) {\n        if (_this._selection) {\n          L.DomUtil.removeClass(_this._selection, 'leaflet-control-geocoder-selected');\n          _this._selection = _this._selection[dir > 0 ? 'nextSibling' : 'previousSibling'];\n        }\n        if (!_this._selection) {\n          _this._selection = _this._alts[dir > 0 ? 'firstChild' : 'lastChild'];\n        }\n\n        if (_this._selection) {\n          L.DomUtil.addClass(_this._selection, 'leaflet-control-geocoder-selected');\n        }\n      };\n\n    switch (e.keyCode) {\n      // Escape\n      case 27:\n        if (this.options.collapsed) {\n          this._collapse();\n        } else {\n          this._clearResults();\n        }\n        break;\n      // Up\n      case 38:\n        select(-1);\n        break;\n      // Up\n      case 40:\n        select(1);\n        break;\n      // Enter\n      case 13:\n        if (this._selection) {\n          var index = parseInt(this._selection.getAttribute('data-result-index'), 10);\n          this._geocodeResultSelected(this._results[index]);\n          this._clearResults();\n        } else {\n          this._geocode();\n        }\n        break;\n      default:\n        return;\n    }\n\n    L.DomEvent.preventDefault(e);\n  },\n  _change: function() {\n    var v = this._input.value;\n    if (v !== this._lastGeocode) {\n      clearTimeout(this._suggestTimeout);\n      if (v.length >= this.options.suggestMinLength) {\n        this._suggestTimeout = setTimeout(\n          L.bind(function() {\n            this._geocode(true);\n          }, this),\n          this.options.suggestTimeout\n        );\n      } else {\n        this._clearResults();\n      }\n    }\n  }\n});\n\nexport function geocoder(options) {\n  return new Geocoder(options);\n}\n","import L from 'leaflet';\nimport { Geocoder, geocoder } from './control';\nimport * as geocoders from './geocoders/index';\n\nL.Util.extend(Geocoder, geocoders);\nexport default Geocoder;\n\nL.Util.extend(L.Control, {\n  Geocoder: Geocoder,\n  geocoder: geocoder\n});\n"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/src/App.vue b/src/App.vue
index f80f55700e6c24641ff5b177a192f4b0c859ccf4..c007b625140b63bc75f03e15ebc4f55a6cf2f408 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -133,6 +133,7 @@
 </template>
 
 <script>
+import { configuration } from "@/assets/config/config.js";
 import frag from "vue-frag";
 import { mapState } from "vuex";
 import { mapGetters } from "vuex";
@@ -154,8 +155,8 @@ export default {
   computed: {
     ...mapState(["projects", "user", "SSO_SETTED", "USER_LEVEL_PROJECTS"]),
     ...mapGetters(["project"]),
-    LOGO_PATH: () => require(process.env.VUE_APP_LOGO_PATH),
-    APPLICATION_NAME: () => process.env.VUE_APP_APPLICATION_NAME,
+    LOGO_PATH: () => require(configuration.VUE_APP_LOGO_PATH),
+    APPLICATION_NAME: () => configuration.VUE_APP_APPLICATION_NAME,
     PACKAGE_VERSION: () => process.env.PACKAGE_VERSION || "0",
     userFullname: function () {
       if (this.user.first_name || this.user.last_name)
diff --git a/src/assets/config/config.js b/src/assets/config/config.js
new file mode 100644
index 0000000000000000000000000000000000000000..9bf834592fb48d5ef5c16b0ca7ee24cfa695112e
--- /dev/null
+++ b/src/assets/config/config.js
@@ -0,0 +1,33 @@
+var configuration = {
+    BASE_URL:"/",
+    DOMAIN:"http://localhost:8010/",
+    NODE_ENV:"development",
+    VUE_APP_LOCALE:"fr-FR",
+    VUE_APP_APPLICATION_NAME:"GéoContrib",
+    VUE_APP_APPLICATION_ABSTRACT:"Application de saisie d'informations géographiques contributive",
+    VUE_APP_LOGO_PATH:"@/assets/img/logo-neogeo-circle.png",
+    VUE_APP_DJANGO_BASE:"http://localhost:8010/",
+    VUE_APP_DJANGO_API_BASE:"http://localhost:8010/api/",
+    DEFAULT_BASE_MAP:{
+        'SERVICE': 'https://{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png',
+        'OPTIONS': {
+            'attribution': '&copy; contributeurs d\'<a href="https://osm.org/copyright">OpenStreetMap</a>',
+            'maxZoom': 20
+        }
+    },
+    DEFAULT_MAP_VIEW : {
+        'center': [47.0, 1.0],
+        'zoom': 4
+    },
+    GEOCODER_PROVIDERS : {
+        'ADDOK': 'addok',
+        'NOMINATIM': 'nominatim',
+        'PHOTON': 'photon'
+    },
+    SELECTED_GEOCODER : {
+        'PROVIDER': 'addok'
+    }
+    
+};
+
+export { configuration }
\ No newline at end of file
diff --git a/src/assets/resources/leaflet-control-geocoder-1.13.0/Control.Geocoder.css b/src/assets/resources/leaflet-control-geocoder-1.13.0/Control.Geocoder.css
new file mode 100644
index 0000000000000000000000000000000000000000..89909916fe5b075ff4527afa1a18f023705ca58f
--- /dev/null
+++ b/src/assets/resources/leaflet-control-geocoder-1.13.0/Control.Geocoder.css
@@ -0,0 +1,155 @@
+/* required styles */
+/* For input, we add the strong #map selector to avoid conflicts with semantic-ui */
+
+#map .leaflet-control-geocoder {
+  border-radius: 4px;
+  background: white;
+  min-width: 26px;
+  min-height: 26px;
+}
+
+.leaflet-touch .leaflet-control-geocoder {
+  min-width: 30px;
+  min-height: 30px;
+}
+
+.leaflet-control-geocoder a,
+.leaflet-control-geocoder .leaflet-control-geocoder-icon {
+  border-bottom: none;
+  display: inline-block;
+}
+
+.leaflet-control-geocoder .leaflet-control-geocoder-alternatives a {
+  width: inherit;
+  height: inherit;
+  line-height: inherit;
+}
+
+.leaflet-control-geocoder a:hover,
+.leaflet-control-geocoder .leaflet-control-geocoder-icon:hover {
+  border-bottom: none;
+  display: inline-block;
+}
+
+.leaflet-control-geocoder-form {
+  display: none;
+  vertical-align: middle;
+}
+.leaflet-control-geocoder-expanded .leaflet-control-geocoder-form {
+  display: inline-block;
+}
+#map .leaflet-control-geocoder-form input {
+  font-size: 120%;
+  border: 0;
+  background-color: transparent;
+  width: 246px;
+}
+
+.leaflet-control-geocoder-icon {
+  border-radius: 4px;
+  width: 26px;
+  height: 26px;
+  border: none;
+  background-color: white;
+  background-image: url(./images/geocoder.svg);
+  background-repeat: no-repeat;
+  background-position: center;
+  cursor: pointer;
+}
+
+.leaflet-touch .leaflet-control-geocoder-icon {
+  width: 30px;
+  height: 30px;
+}
+
+.leaflet-control-geocoder-throbber .leaflet-control-geocoder-icon {
+  background-image: url(./images/throbber.gif);
+}
+
+.leaflet-control-geocoder-form-no-error {
+  display: none;
+}
+
+#map .leaflet-control-geocoder-form input:focus {
+  outline: none;
+}
+
+.leaflet-control-geocoder-form button {
+  display: none;
+}
+.leaflet-control-geocoder-error {
+  margin-top: 8px;
+  margin-left: 8px;
+  display: block;
+  color: #444;
+}
+.leaflet-control-geocoder-alternatives {
+  display: block;
+  width: 272px;
+  list-style: none;
+  padding: 0;
+  margin: 0;
+}
+
+.leaflet-control-geocoder-alternatives-minimized {
+  display: none;
+  height: 0;
+}
+.leaflet-control-geocoder-alternatives li {
+  white-space: nowrap;
+  display: block;
+  overflow: hidden;
+  padding: 5px 8px;
+  text-overflow: ellipsis;
+  border-bottom: 1px solid #ccc;
+  cursor: pointer;
+}
+
+.leaflet-control-geocoder-alternatives li a,
+.leaflet-control-geocoder-alternatives li a:hover {
+  width: inherit;
+  height: inherit;
+  line-height: inherit;
+  background: inherit;
+  border-radius: inherit;
+  text-align: left;
+}
+
+.leaflet-control-geocoder-alternatives li:last-child {
+  border-bottom: none;
+}
+.leaflet-control-geocoder-alternatives li:hover,
+.leaflet-control-geocoder-selected {
+  background-color: #f5f5f5;
+}
+
+
+/* Custom style */
+.leaflet-control-geocoder-icon {
+  border-radius: 4px;
+  width: 35px;
+  height: 35px;
+}
+
+#map .leaflet-control-geocoder-form input {
+  height: 35px;
+}
+
+.leaflet-control-geocoder-alternatives li:first-of-type {
+  border-top: 1px solid #ccc;
+}
+
+.leaflet-control-geocoder-address-item {
+	font-weight: 600;
+}
+
+.leaflet-control-geocoder-address-detail {
+	font-size: 12px;
+	font-weight: normal;
+}
+
+.leaflet-control-geocoder-address-context {
+	color: #666;
+	font-size: 12px;
+	font-weight: lighter;
+}
diff --git a/src/assets/resources/leaflet-control-geocoder-1.13.0/images/geocoder.svg b/src/assets/resources/leaflet-control-geocoder-1.13.0/images/geocoder.svg
new file mode 100644
index 0000000000000000000000000000000000000000..9a7746502e20c1a0c289592ee33400e1ce08db1a
--- /dev/null
+++ b/src/assets/resources/leaflet-control-geocoder-1.13.0/images/geocoder.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"></circle><line x1="21" y1="21" x2="16.65" y2="16.65"></line></svg>
\ No newline at end of file
diff --git a/src/assets/resources/leaflet-control-geocoder-1.13.0/images/throbber.gif b/src/assets/resources/leaflet-control-geocoder-1.13.0/images/throbber.gif
new file mode 100644
index 0000000000000000000000000000000000000000..c0c52a06c09d98bb75d1c3f9945f3101ab094f98
Binary files /dev/null and b/src/assets/resources/leaflet-control-geocoder-1.13.0/images/throbber.gif differ
diff --git a/src/main.js b/src/main.js
index 0a98314409ddff6a46a7d4477fe3aed478a39be3..20e16a3a2321d9036c8e88fa4172e62f45837e76 100644
--- a/src/main.js
+++ b/src/main.js
@@ -5,7 +5,9 @@ import App from './App.vue'
 import './registerServiceWorker'
 import router from './router'
 import store from './store'
-
+import 'leaflet/dist/leaflet.css';
+import 'leaflet-draw/dist/leaflet.draw.css';
+import '@/assets/resources/leaflet-control-geocoder-1.13.0/Control.Geocoder.css';
 Vue.config.productionTip = false
 
 axios.all([store.dispatch("USER_INFO"),
diff --git a/src/store/index.js b/src/store/index.js
index a75f0cab6cabdfd6aa3dc1beb628c6a93c8569f4..3275ce429c6b80a22793eddc7b24a8b913d12775 100644
--- a/src/store/index.js
+++ b/src/store/index.js
@@ -7,6 +7,7 @@ import router from '../router'
 import feature_type from "./modules/feature_type"
 import feature from "./modules/feature"
 import map from "./modules/map"
+import { configuration } from "@/assets/config/config.js";
 
 Vue.use(Vuex);
 
@@ -22,7 +23,7 @@ function updateAxiosHeader() {
 // ! À vérifier s'il y a un changement de token pendant l'éxécution de l'appli
 updateAxiosHeader();
 
-const DJANGO_API_BASE = process.env.VUE_APP_DJANGO_API_BASE;
+const DJANGO_API_BASE = configuration.VUE_APP_DJANGO_API_BASE;
 
 export default new Vuex.Store({
   modules: {
@@ -202,7 +203,7 @@ export default new Vuex.Store({
 
     GET_PROJECT_LAST_MESSAGES({ commit }, project_slug) {
       axios
-        .get(`${DJANGO_API_BASE}projects/${project_slug}/comments`)
+        .get(`${DJANGO_API_BASE}projects/${project_slug}/comments/`)
         .then((response) => {
           if (response && response.status === 200) {
             commit("SET_PROJECT_COMMENTS", response.data.last_comments)
diff --git a/src/store/modules/feature.js b/src/store/modules/feature.js
index d118c1e9c9b75d4b3a9d6da24a83adc5fd6d533f..02a1021921757ac2f51d6fe45f79e42db1284aa1 100644
--- a/src/store/modules/feature.js
+++ b/src/store/modules/feature.js
@@ -1,5 +1,7 @@
 const axios = require("axios");
-const DJANGO_API_BASE = process.env.VUE_APP_DJANGO_API_BASE;
+import { configuration } from "@/assets/config/config.js";
+
+const DJANGO_API_BASE = configuration.VUE_APP_DJANGO_API_BASE;
 
 const feature = {
   namespaced: true,
diff --git a/src/store/modules/feature_type.js b/src/store/modules/feature_type.js
index 7d2f2a675ebe020e1e78d7f8f6eaab3e322b6ca1..2143a9a9fc9a98cf050f4c8a34d15828121ef29e 100644
--- a/src/store/modules/feature_type.js
+++ b/src/store/modules/feature_type.js
@@ -1,6 +1,7 @@
 import axios from "axios"
+import { configuration } from "@/assets/config/config.js";
 
-const DJANGO_API_BASE = process.env.VUE_APP_DJANGO_API_BASE;
+const DJANGO_API_BASE = configuration.VUE_APP_DJANGO_API_BASE;
 
 
 const feature_type = {
@@ -131,7 +132,7 @@ const feature_type = {
         formData.append("json_file", state.fileToImport);
         formData.append("feature_type_slug", feature_type_slug);
         let url =
-          process.env.VUE_APP_DJANGO_API_BASE +
+        configuration.VUE_APP_DJANGO_API_BASE +
           'import-tasks/'
         return axios
           .post(url, formData, {
@@ -153,7 +154,7 @@ const feature_type = {
 
     GET_IMPORTS({ commit }, feature_type) {
       let url =
-        process.env.VUE_APP_DJANGO_API_BASE +
+      configuration.VUE_APP_DJANGO_API_BASE +
         "import-tasks?feature_type_slug=" +
         feature_type;
       axios
diff --git a/src/store/modules/map.js b/src/store/modules/map.js
index 233a161449d4e773d6d49c9f4678723738b74332..043bf48136ad202dcfa5f4cf5af6d961c9f2028d 100644
--- a/src/store/modules/map.js
+++ b/src/store/modules/map.js
@@ -95,7 +95,7 @@ const map = {
         });
     },
 
-    INITIATE_MAP({ state, rootGetters, dispatch }) {
+    INITIATE_MAP({ state, rootGetters }) {
       const project = rootGetters.project
       let mapDefaultViewCenter = [46, 2]; // defaultMapView.center;
       let mapDefaultViewZoom = 5; // defaultMapView.zoom;
@@ -133,8 +133,6 @@ const map = {
       }
       mapUtil.addLayers(layersToLoad, state.serviceMap, state.optionsMap);
 
-      // Add the features
-      dispatch("ADD_FEATURES");
 
       // Remove multiple interactions with the map
       //mapUtil.getMap().dragging.disable();
@@ -143,17 +141,6 @@ const map = {
 
     },
 
-    ADD_FEATURES({ rootState }, features) {
-      const featuresToAdd = features || rootState.feature.features
-      const featureGroup = mapUtil.addFeatures(featuresToAdd.map(el => {
-        const geometry = el.geom; // * map features as geoJSON format
-        const properties = { ...el }
-        return { geometry, properties }
-      }));
-      if (featureGroup && featureGroup.getLayers().length > 0) {
-        mapUtil.getMap().fitBounds(featureGroup.getBounds());
-      }
-    },
 
     SAVE_BASEMAPS({ state, dispatch }) {
       console.log("SAVE_BASEMAPS", state.basemaps);
diff --git a/src/views/Index.vue b/src/views/Index.vue
index 1a11c5df76f3a8d843726b3a3a2e87428d63e4ec..7facb78fee854fbe6b406abc15a0c318c6292ea6 100644
--- a/src/views/Index.vue
+++ b/src/views/Index.vue
@@ -103,15 +103,16 @@
 
 <script>
 import { mapState } from "vuex";
+import { configuration } from "@/assets/config/config.js";
 
 export default {
   name: "Index",
   computed: {
     ...mapState(["projects", "user", "USER_LEVEL_PROJECTS"]),
-    LOGO_PATH: () => require(process.env.VUE_APP_LOGO_PATH),
-    APPLICATION_NAME: () => process.env.VUE_APP_APPLICATION_NAME,
-    APPLICATION_ABSTRACT: () => process.env.VUE_APP_APPLICATION_ABSTRACT,
-    DJANGO_BASE_URL: () => process.env.VUE_APP_DJANGO_BASE,
+    LOGO_PATH: () => require(configuration.VUE_APP_LOGO_PATH),
+    APPLICATION_NAME: () => configuration.VUE_APP_APPLICATION_NAME,
+    APPLICATION_ABSTRACT: () => configuration.VUE_APP_APPLICATION_ABSTRACT,
+    DJANGO_BASE_URL: () => configuration.VUE_APP_DJANGO_BASE,
   },
 
   methods: {
diff --git a/src/views/feature/Feature_edit.vue b/src/views/feature/Feature_edit.vue
index 12bca585bef5bc6d90f5b408a075a7ce08731328..a5e83c0d8bace9331205517b5c15e1387604537a 100644
--- a/src/views/feature/Feature_edit.vue
+++ b/src/views/feature/Feature_edit.vue
@@ -270,6 +270,11 @@ import FeatureAttachmentForm from "@/components/feature/FeatureAttachmentForm";
 import FeatureLinkedForm from "@/components/feature/FeatureLinkedForm";
 import Dropdown from "@/components/Dropdown.vue";
 import SidebarLayers from "@/components/map-layers/SidebarLayers";
+import { configuration } from "@/assets/config/config.js";
+import L from "leaflet";
+import "leaflet-draw";
+import { mapUtil } from "@/assets/js/map-util.js";
+const axios = require("axios");
 
 export default {
   name: "Feature_edit",
@@ -403,6 +408,206 @@ export default {
         this.form.title.errors = "Veuillez compléter ce champ.";
       }
     },
+
+    initMap(){
+      var geomLeaflet = {
+        'point': 'circlemarker',
+        'linestring': 'polyline',
+        'polygon': 'polygon'
+      }
+      var geomType = "{{ feature_type.geom_type }}"
+      var drawConfig = {
+        polygon: false,
+        marker: false,
+        polyline: false,
+        rectangle: false,
+        circle: false,
+        circlemarker: false,
+      }
+      drawConfig[geomLeaflet[geomType]] = true
+
+      L.drawLocal = {
+        draw: {
+          toolbar: {
+            actions: {
+              title: 'Annuler le dessin',
+              text: 'Annuler'
+            },
+            finish: {
+              title: 'Terminer le dessin',
+              text: 'Terminer'
+            },
+            undo: {
+              title: 'Supprimer le dernier point dessiné',
+              text: 'Supprimer le dernier point'
+            },
+            buttons: {
+              polyline: 'Dessiner une polyligne',
+              polygon: 'Dessiner un polygone',
+              rectangle: 'Dessiner un rectangle',
+              circle: 'Dessiner un cercle',
+              marker: 'Dessiner une balise',
+              circlemarker: 'Dessiner un point'
+            }
+          },
+          handlers: {
+            circle: {
+              tooltip: {
+                start: 'Cliquer et glisser pour dessiner le cercle.'
+              },
+              radius: 'Rayon'
+            },
+            circlemarker: {
+              tooltip: {
+                start: 'Cliquer sur la carte pour placer le point.'
+              }
+            },
+            marker: {
+              tooltip: {
+                start: 'Cliquer sur la carte pour placer la balise.'
+              }
+            },
+            polygon: {
+              tooltip: {
+                start: 'Cliquer pour commencer à dessiner.',
+                cont: 'Cliquer pour continuer à dessiner.',
+                end: 'Cliquer sur le premier point pour terminer le dessin.'
+              }
+            },
+            polyline: {
+              error: '<strong>Error:</strong> shape edges cannot cross!',
+              tooltip: {
+                start: 'Cliquer pour commencer à dessiner.',
+                cont: 'Cliquer pour continuer à dessiner.',
+                end: 'Cliquer sur le dernier point pour terminer le dessin.'
+              }
+            },
+            rectangle: {
+              tooltip: {
+                start: 'Cliquer et glisser pour dessiner le rectangle.'
+              }
+            },
+            simpleshape: {
+              tooltip: {
+                end: 'Relâcher la souris pour terminer de dessiner.'
+              }
+            }
+          }
+        },
+        edit: {
+          toolbar: {
+            actions: {
+              save: {
+                title: 'Sauver les modifications',
+                text: 'Sauver'
+              },
+              cancel: {
+                title: 'Annuler la modification, annule toutes les modifications',
+                text: 'Annuler'
+              },
+              clearAll: {
+                title: 'Effacer l\'objet',
+                text: 'Effacer'
+              }
+            },
+            buttons: {
+              edit: 'Modifier l\'objet',
+              editDisabled: 'Aucun objet à modifier',
+              remove: 'Supprimer l\'objet',
+              removeDisabled: 'Aucun objet à supprimer'
+            }
+          },
+          handlers: {
+            edit: {
+              tooltip: {
+                text: 'Faites glisser les marqueurs ou les balises pour modifier l\'élément.',
+                subtext: 'Cliquez sur Annuler pour annuler les modifications..'
+              }
+            },
+            remove: {
+              tooltip: {
+                text: 'Cliquez sur un élément pour le supprimer.'
+              }
+            }
+          }
+        }
+      };
+
+
+      var drawnItems = new L.FeatureGroup();
+      console.log(drawnItems);
+      console.log(configuration);
+      var mapDefaultViewCenter = configuration.DEFAULT_MAP_VIEW.center;
+      var mapDefaultViewZoom = configuration.DEFAULT_MAP_VIEW.zoom;
+
+      // Create the map, then init the layers and features
+      this.map = mapUtil.createMap({
+          mapDefaultViewCenter,
+          mapDefaultViewZoom
+        });
+
+      // mapUtil.addLayers(layers, serviceMap, optionsMap);
+      const currentFeatureId="12";
+      const url=configuration.BASE_URL+"/test_data/features.json";
+      axios.get(url)
+        .then((response) => {
+          const features = response.data.features;
+          if (features) {
+            const allFeaturesExceptCurrent = features.filter(feat => feat.id !== currentFeatureId);
+            mapUtil.addFeatures(allFeaturesExceptCurrent);
+          }
+        })
+        .catch((error) => {
+          throw error;
+        });
+      
+      let self=this;
+    // ------   Listen Sidebar events ---------- //
+    // Listen custom events triggered by the sidebar-layers
+    document.addEventListener('add-layers', (event) => {
+      mapUtil.removeLayers(self.map);
+      // Reverse is done because the first layer in order has to be added in the map in last.
+      // Slice is done because reverse() changes the original array, so we make a copy first
+      mapUtil.addLayers(event.detail.slice().reverse(), configuration.DEFAULT_BASE_MAP.SERVICE, configuration.DEFAULT_BASE_MAP.OPTIONS);
+    });
+
+    document.addEventListener('update-opacity', (event) => {
+      mapUtil.updateOpacity(event.detail.layerId, event.detail.opacity);
+    });
+
+    document.addEventListener('change-layers-order', (event) => {
+      // Reverse is done because the first layer in order has to be added in the map in last.
+      // Slice is done because reverse() changes the original array, so we make a copy first
+      mapUtil.updateOrder(event.detail.layers.slice().reverse());
+    });
+
+    // --------- End sidebar events ----------
+    // Check if at least one basemap exist. If not, use the default application
+      const basemaps = undefined;//JSON.parse(document.getElementById('basemaps').textContent);
+      if (!basemaps || basemaps && basemaps.length === 0) {
+        mapUtil.addLayers(null, configuration.DEFAULT_BASE_MAP.SERVICE, configuration.DEFAULT_BASE_MAP.OPTIONS);
+      }
+  this.map.addLayer(drawnItems);
+
+  var drawControlFull = new L.Control.Draw({
+    position: 'topright',
+    edit: {
+      featureGroup: drawnItems
+    },
+    draw: drawConfig,
+  })
+
+  /*var drawControlEditOnly = new L.Control.Draw({
+    position: 'topright',
+    edit: {
+      featureGroup: drawnItems
+    },
+    draw: false
+  })*/
+  this.map.addControl(drawControlFull);
+
+
+    }
   },
   created() {
     if (!this.project) {
@@ -419,7 +624,8 @@ export default {
         if (el && this.form[el]) this.form[el].value = this.feature[el];
       }
     }
-    this.$store.dispatch("map/INITIATE_MAP");
+    this.initMap();
+   
   },
 };
 
diff --git a/src/views/feature/Feature_list.vue b/src/views/feature/Feature_list.vue
index c6c6658ea51ba4761c4d2eda7b1f866711dcc2a0..4d6b172f4e1ce4f7bab6d80ec9ce302e00ab0430 100644
--- a/src/views/feature/Feature_list.vue
+++ b/src/views/feature/Feature_list.vue
@@ -1,5 +1,6 @@
 <template>
   <div class="fourteen wide column">
+    <script type="application/javascript" src="./resources/leaflet-control-geocoder-1.13.0/Control.Geocoder.js"></script>
     <div class="feature-list-container ui grid">
       <div class="four wide column">
         <h1>Signalements</h1>
@@ -110,9 +111,9 @@
         </div>
       </div>
       <!-- map params, updated on map move // todo : brancher sur la carte probablement -->
-      <!--  <input type="hidden" name="zoom" :value="request.GET.zoom || ''" />
-      <input type="hidden" name="lat" :value="request.GET.lat || ''" />
-      <input type="hidden" name="lng" :value="request.GET.lng || ''" /> -->
+        <input type="hidden" name="zoom" v-model="zoom" />
+      <input type="hidden" name="lat" v-model="lat" />
+      <input type="hidden" name="lng" v-model="lng" /> 
     </form>
 
     <div v-show="showMap" class="ui tab active map-container" data-tab="map">
@@ -250,8 +251,13 @@
 
 <script>
 import { mapGetters, mapState } from "vuex";
+import { configuration } from "@/assets/config/config.js";
+import L from "leaflet";
+import { mapUtil } from "@/assets/js/map-util.js";
 import SidebarLayers from "@/components/map-layers/SidebarLayers";
 import Dropdown from "@/components/Dropdown.vue";
+const axios = require("axios");
+
 
 export default {
   name: "Feature_list",
@@ -298,6 +304,10 @@ export default {
         start: 0,
         end: 14,
       },
+      map:null,
+      zoom:null,
+      lat:null,
+      lng:null,
       showMap: true,
       showAddSignal: false,
     };
@@ -347,6 +357,28 @@ export default {
         this.pagination.end = this.pagination.end - 15;
       }
     },
+    addGeocoders(){
+      let geocoder;
+
+      // Get the settings.py variable SELECTED_GEOCODER_PROVIDER. This way avoids XCC attacks
+      const geocoderLabel = configuration.SELECTED_GEOCODER.PROVIDER;
+      if (geocoderLabel) {
+        const LIMIT_RESULTS = 5;
+        if (geocoderLabel === configuration.GEOCODER_PROVIDERS.ADDOK) {
+          geocoder = L.Control.Geocoder.addok({limit: LIMIT_RESULTS});
+        } else if (geocoderLabel === configuration.GEOCODER_PROVIDERS.PHOTON) {
+          geocoder = L.Control.Geocoder.photon();
+        } else if (geocoderLabel === configuration.GEOCODER_PROVIDERS.NOMINATIM) {
+          geocoder = L.Control.Geocoder.nominatim();
+        }
+
+        L.Control.geocoder({
+          placeholder: 'Chercher une adresse...',
+          geocoder: geocoder,
+        }).addTo(this.map);
+      }
+
+  },
   },
 
   created() {
@@ -356,7 +388,89 @@ export default {
     }
   },
   mounted() {
-    this.$store.dispatch("map/INITIATE_MAP");
+    //this.$store.dispatch("map/INITIATE_MAP");
+    this.zoom = this.$route.query.zoom||'';
+    this.lat = this.$route.query.lat||'';
+    this.lng = this.$route.query.lng||'';
+    var mapDefaultViewCenter = configuration.DEFAULT_MAP_VIEW.center;
+    var mapDefaultViewZoom = configuration.DEFAULT_MAP_VIEW.zoom;
+
+    this.map=mapUtil.createMap({
+      zoom:this.zoom,
+      lat:this.lat,
+      lng:this.lng,
+      mapDefaultViewCenter,
+      mapDefaultViewZoom,
+    });
+    let self=this;
+    // ------   Listen Sidebar events ---------- //
+    // Listen custom events triggered by the sidebar-layers
+    document.addEventListener('add-layers', (event) => {
+      mapUtil.removeLayers(self.map);
+      // Reverse is done because the first layer in order has to be added in the map in last.
+      // Slice is done because reverse() changes the original array, so we make a copy first
+      mapUtil.addLayers(event.detail.slice().reverse(), configuration.DEFAULT_BASE_MAP.SERVICE, configuration.DEFAULT_BASE_MAP.OPTIONS);
+    });
+
+    document.addEventListener('update-opacity', (event) => {
+      mapUtil.updateOpacity(event.detail.layerId, event.detail.opacity);
+    });
+
+    document.addEventListener('change-layers-order', (event) => {
+      // Reverse is done because the first layer in order has to be added in the map in last.
+      // Slice is done because reverse() changes the original array, so we make a copy first
+      mapUtil.updateOrder(event.detail.layers.slice().reverse());
+    });
+
+    // --------- End sidebar events ----------
+
+      const url=`${configuration.VUE_APP_DJANGO_API_BASE}projects/${this.$route.params.slug}/feature/?output=geojson`;
+      //const url=configuration.BASE_URL+"/test_data/features.json";?output=geojson
+      axios.get(url)
+        .then((response) => {
+          const features = response.data.features;
+
+          const urlParams = new URLSearchParams(window.location.search);
+          const featureType = urlParams.get('feature_type');
+          const featureStatus = urlParams.get('status');
+          const featureTitle = urlParams.get('title');
+          const featureGroup = mapUtil.addFeatures(features, {featureType, featureStatus, featureTitle});
+          // Fit the map to bound only if no initial zoom and center are defined
+          if ((this.lat === "" || this.lng === "" || this.zoom === "") && features.length > 0) {
+            mapUtil.getMap().fitBounds(featureGroup.getBounds())
+          }
+
+
+        })
+        .catch((error) => {
+          throw error;
+        });
+
+
+      
+      // Update zoom and center on each move
+      mapUtil.addMapEventListener("moveend", () => {
+        self.zoom=mapUtil.getMap().getZoom();
+        self.lat=mapUtil.getMap().getCenter().lat;
+        self.lng=mapUtil.getMap().getCenter().lng;
+        //$formFilters.find("input[name=zoom]").val(mapUtil.getMap().getZoom())
+        //$formFilters.find("input[name=lat]").val(mapUtil.getMap().getCenter().lat)
+        //$formFilters.find("input[name=lng]").val(mapUtil.getMap().getCenter().lng)
+      });
+
+      // Check if at least one basemap exist. If not, use the default application
+      const basemaps = undefined;//JSON.parse(document.getElementById('basemaps').textContent);
+      if (!basemaps || basemaps && basemaps.length === 0) {
+        mapUtil.addLayers(null, configuration.DEFAULT_BASE_MAP.SERVICE, configuration.DEFAULT_BASE_MAP.OPTIONS);
+      }
+      setTimeout(function () { 
+        console.log(this);
+        this.addGeocoders();
+      }.bind(this), 1000)
+
+
+
+
     this.form.type.choices = [
       //* convert Set to an Array with spread "..."
       ...new Set(this.features.map((el) => el.feature_type.title)), //* use Set to eliminate duplicate values
@@ -371,6 +485,7 @@ export default {
 #map {
   width: 100%;
   min-height: 300px;
+  height: calc( 100vh - 300px );
   border: 1px solid grey;
   /* To not hide the filters */
   z-index: 1;
diff --git a/src/views/project/Project_detail.vue b/src/views/project/Project_detail.vue
index a9cf2e3223a429ca0af2a48e5dff34243c7e8dc9..2701216bf3df884bff82965835a40af7954f3717 100644
--- a/src/views/project/Project_detail.vue
+++ b/src/views/project/Project_detail.vue
@@ -450,7 +450,10 @@
 
 <script>
 import frag from "vue-frag";
+import { mapUtil } from "@/assets/js/map-util.js";
 import { mapGetters, mapState } from "vuex";
+import { configuration } from "@/assets/config/config.js";
+const axios = require("axios");
 
 export default {
   name: "Project_details",
@@ -491,14 +494,14 @@ export default {
   computed: {
     ...mapGetters(["project"]),
     ...mapState("feature_type", ["feature_types"]),
+    ...mapState("feature", ["features"]),
     ...mapState(["last_comments", "user"]),
-    DJANGO_BASE_URL: () =>  process.env.VUE_APP_DJANGO_BASE,
+    DJANGO_BASE_URL: () =>  configuration.VUE_APP_DJANGO_BASE,
     last_features: function () {
       // * limit to last five element of array (looks sorted chronologically, but not sure...)
       return this.$store.state.feature.features.slice(-5);
     },
   },
-
   methods: {
     refreshId() {
       return "?ver="+ Math.random()
@@ -544,7 +547,20 @@ export default {
   mounted() {
     if (this.project) {
       this.$store.dispatch("map/INITIATE_MAP");
+      const url=`${configuration.VUE_APP_DJANGO_API_BASE}projects/${this.$route.params.slug}/feature/?output=geojson`;
+      axios.get(url)
+        .then((response) => {
+          const features = response.data.features;
+          const featureGroup = mapUtil.addFeatures(features);
+          if (featureGroup && featureGroup.getLayers().length > 0) {
+            mapUtil.getMap().fitBounds(featureGroup.getBounds());
+          }
+        })
+        .catch((error) => {
+          throw error;
+        });
     }
+
     if (this.message) {
       this.tempMessage = this.message;
       document
diff --git a/src/views/project/Project_edit.vue b/src/views/project/Project_edit.vue
index 1733399c648cd8a597be408fc2df038b26949ace..3e27b6cc7c4cfb24dab04f20fd415058ea28265c 100644
--- a/src/views/project/Project_edit.vue
+++ b/src/views/project/Project_edit.vue
@@ -158,6 +158,7 @@
 <script>
 const axios = require("axios");
 import Dropdown from "@/components/Dropdown.vue";
+import { configuration } from "@/assets/config/config.js";
 import { mapGetters } from "vuex";
 
 export default {
@@ -206,7 +207,7 @@ export default {
 
   computed: {
     ...mapGetters(["project"]),
-    DJANGO_BASE_URL: () => process.env.VUE_APP_DJANGO_BASE,
+    DJANGO_BASE_URL: () => configuration.VUE_APP_DJANGO_BASE,
   },
 
   methods: {
@@ -262,7 +263,7 @@ export default {
         let formData = new FormData();
         formData.append("file", this.fileToImport);
         const url =
-          process.env.VUE_APP_DJANGO_API_BASE +
+          configuration.VUE_APP_DJANGO_API_BASE +
           "projects/" +
           projectSlug +
           "/thumbnail/";
@@ -286,7 +287,7 @@ export default {
 
     async postForm() {
       // todo: check form
-      //let url = `${process.env.VUE_APP_DJANGO_API_BASE}projects/`;
+      //let url = `${configuration.VUE_APP_DJANGO_API_BASE}projects/`;
       const projectData = {
         title: this.form.title,
         description: this.form.description,
@@ -300,7 +301,7 @@ export default {
 
       if (this.action === "create" || this.action === "duplicate") {
         await axios
-          .post(`${process.env.VUE_APP_DJANGO_API_BASE}projects/`, projectData)
+          .post(`${configuration.VUE_APP_DJANGO_API_BASE}projects/`, projectData)
           .then((response) => {
             if (response && response.status === 201 && response.data) {
               //* send thumbnail after feature_type was created
@@ -316,7 +317,7 @@ export default {
       } else if (this.action === "edit") {
         await axios
           .put(
-            `${process.env.VUE_APP_DJANGO_API_BASE}projects/${this.project.slug}/`,
+            `${configuration.VUE_APP_DJANGO_API_BASE}projects/${this.project.slug}/`,
             projectData
           )
           .then((response) => {
@@ -343,7 +344,7 @@ export default {
       }
       this.form = this.project;
       /* this.form.thumbnail = //* add api base to display image src
-        process.env.VUE_APP_DJANGO_BASE + this.form.thumbnail; */
+        configuration.VUE_APP_DJANGO_BASE + this.form.thumbnail; */
       //* transform string values to objects for dropdowns display (could be in a computed)
       this.form.access_level_pub_feature = {
         name: this.project.access_level_pub_feature,
diff --git a/src/views/project/Project_members.vue b/src/views/project/Project_members.vue
index aec7aed4463d409c8b97e04783dae9325ae42130..ac8838ebd482afd843e4d12f48db890497c5a426 100644
--- a/src/views/project/Project_members.vue
+++ b/src/views/project/Project_members.vue
@@ -58,6 +58,7 @@ import axios from "axios";
 import frag from "vue-frag";
 import { mapGetters } from "vuex";
 import Dropdown from "@/components/Dropdown.vue";
+import { configuration } from "@/assets/config/config.js";
 
 export default {
   name: "Project_members",
@@ -92,7 +93,7 @@ export default {
       // };
       // console.log("validateMembers", data);
       /* axios
-        .post(`${DJANGO_API_BASE}projects/${payload.slug}/utilisateurs/`, payload.data)
+        .post(`${DJANGO_API_BASE}projet/${payload.slug}/utilisateurs/`, payload.data)
         .then((response) => {
           const user = response.data.user;
         })
@@ -103,7 +104,7 @@ export default {
     async fetchMembers() {
       return axios
         .get(
-          `${process.env.VUE_APP_DJANGO_API_BASE}projects/${this.$route.params.slug}/utilisateurs`
+          `${configuration.VUE_APP_DJANGO_API_BASE}projects/${this.$route.params.slug}/utilisateurs`
         )
         .then((response) => response.data.members)
         .catch((error) => {
diff --git a/src/views/registration/Login.vue b/src/views/registration/Login.vue
index 00729ac875271332e85e014818d8cce9eacf44a8..1096a2de85e341d573bdc5f46f41e0973c4e1d38 100644
--- a/src/views/registration/Login.vue
+++ b/src/views/registration/Login.vue
@@ -61,6 +61,8 @@
 </template>
 
 <script>
+import { configuration } from "@/assets/config/config.js";
+
 export default {
   name: "Login",
   data() {
@@ -74,9 +76,9 @@ export default {
     };
   },
   computed: {
-    LOGO_PATH: () => process.env.VUE_APP_LOGO_PATH,
-    APPLICATION_NAME: () => process.env.VUE_APP_APPLICATION_NAME,
-    APPLICATION_ABSTRACT: () => process.env.VUE_APP_APPLICATION_ABSTRACT,
+    LOGO_PATH: () => configuration.VUE_APP_LOGO_PATH,
+    APPLICATION_NAME: () => configuration.VUE_APP_APPLICATION_NAME,
+    APPLICATION_ABSTRACT: () => configuration.VUE_APP_APPLICATION_ABSTRACT,
   },
   methods: {
     login() {